package pwc.taxtech.atms.controller;

import javassist.tools.web.BadHttpRequest;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import pwc.taxtech.atms.dpo.AnalyticsModelDetail;
import pwc.taxtech.atms.dpo.FinancialStatementDetail;
import pwc.taxtech.atms.dpo.TaxReturnDetail;
import pwc.taxtech.atms.dto.AddKeyValueConfigDto;
import pwc.taxtech.atms.dto.Common.RemoteValidationRetDto;
import pwc.taxtech.atms.dto.KeyValueConfigDisplayDto;
import pwc.taxtech.atms.dto.OperationResultDto;
import pwc.taxtech.atms.dto.UpdateKeyValueConfigDto;
import pwc.taxtech.atms.dto.formula.FormulaConfigDto;
import pwc.taxtech.atms.service.impl.KeyValueConfigServiceImpl;
import pwc.taxtech.atms.service.impl.TemplateFormulaServiceImpl;

import java.util.List;

@RestController
@RequestMapping("/api/v1/keyValueConfig")
public class KeyValueConfigController {
    private static final Logger logger = LoggerFactory.getLogger(EnterpriseAccountManagerController.class);

    @Autowired
    private KeyValueConfigServiceImpl keyValueConfigService;

    @Autowired
    private TemplateFormulaServiceImpl templateFormulaService;

//    @ApiOperation(value = "get keyValueConfig")
    @RequestMapping(value = "", method = RequestMethod.GET)
    public @ResponseBody
    List<KeyValueConfigDisplayDto> get() {
        return keyValueConfigService.get();
    }

    @RequestMapping(value = "dataSource", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    OperationResultDto<List<FormulaConfigDto>> getDataSource() {
        return keyValueConfigService.getAllFormulaList();
    }

    @RequestMapping(value = "getFinacialReference/{keyValueId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    List<FinancialStatementDetail> getFinacialStatementReference(@PathVariable String keyValueId) throws BadHttpRequest {
        if (StringUtils.isBlank(keyValueId)) {
            throw new BadHttpRequest(new Exception("keyValueId is null"));
        }
        return keyValueConfigService.getFinacialStatement(keyValueId);
    }

    @RequestMapping(value = "getTaxReference/{keyValueId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    List<TaxReturnDetail> getTaxReturnReference(@PathVariable String keyValueId) throws BadHttpRequest {
        if (StringUtils.isBlank(keyValueId)) {
            throw new BadHttpRequest(new Exception("keyValueId is null"));
        }
        return keyValueConfigService.getTaxReturn(keyValueId);
    }

    @RequestMapping(value = "getModelReference/{keyValueId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    List<AnalyticsModelDetail> getAnalyticsModelReference(@PathVariable String keyValueId) throws BadHttpRequest {
        if (StringUtils.isBlank(keyValueId)) {
            throw new BadHttpRequest(new Exception("keyValueId is null"));
        }
        return keyValueConfigService.getAnalyticsModel(keyValueId);
    }

    @RequestMapping(value = "add", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public void addKeyValueConfiguration(@RequestBody AddKeyValueConfigDto addKeyValueConfigDto) {
        //todo: add userName @ here
        addKeyValueConfigDto.setUserName("");
        keyValueConfigService.addKeyValueConfiguration(addKeyValueConfigDto);
    }

    @RequestMapping(value = "update", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public void updateKeyValueConfiguration(@RequestBody UpdateKeyValueConfigDto updateKeyValueConfigDto) {
        //todo: add userName @ here
        updateKeyValueConfigDto.setUserName("");
        keyValueConfigService.updateKeyValueConfiguration(updateKeyValueConfigDto);
    }

    @RequestMapping(method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    int delelte(@RequestParam("keyValueID") String keyValueId) throws BadHttpRequest {
        if (StringUtils.isBlank(keyValueId)) {
            throw new BadHttpRequest(new Exception("keyValueId is null"));
        }
        return keyValueConfigService.deleteKeyValueConfiguration(keyValueId);
    }

    @RequestMapping(value = "getByOrgId/{orgId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    List<KeyValueConfigDisplayDto> getByOrgId(@PathVariable String orgId) {
        return keyValueConfigService.getByOrgId(orgId);
    }

    @RequestMapping(value = "isDuplicated", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    RemoteValidationRetDto isDuplicated(@RequestParam String value) {
        boolean isDuplicated = keyValueConfigService.isKeyValueDuplicated(value);
        RemoteValidationRetDto result = new RemoteValidationRetDto();
        result.setIsValid(!isDuplicated);
        result.setValue(value);
        return result;

    }

    @RequestMapping(value = "isFormulaValid", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public @ResponseBody
    RemoteValidationRetDto isFormulaValid(@RequestParam String value) {
        OperationResultDto validateResult = templateFormulaService.validate(value);
        RemoteValidationRetDto result = new RemoteValidationRetDto();
        result.setIsValid(validateResult.getResult());
        result.setValue(value);
        return result;
    }
}