package pwc.taxtech.atms.service.impl;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.stereotype.Service;
import pwc.taxtech.atms.common.config.SystemConfig;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Optional;

@Service
public class TableauService extends BaseService {

    @Resource
    private SystemConfig systemConfig;

    /**
     * 获取ticket
     *
     * @param username 用户名
     * @return Optional<String>
     */
    public Optional<String> getTicket(String username) {
        CloseableHttpClient httpClient = null;
        try {
            String ticketUrl = String.format(systemConfig.getTableauGetTicket(), username);
            httpClient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost(ticketUrl);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            String response = IOUtils.toString(httpResponse.getEntity().getContent(), "UTF-8");
            return StringUtils.equals(response, "-1") ? Optional.empty() : Optional.of(response);
        } catch (Exception e) {
            logger.error("getTicket error.", e);
        } finally {
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    logger.error("close httpClient error.", e);
                }
            }
        }
        return Optional.empty();
    }

    public Optional<String> getUnreturnedTax() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauUnreturnedTax(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getTaxComparison() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauTaxComparison(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getOtherCountries() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauOtherCountries(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getCostAnalysis() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauCostAnalysis(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getProfitAndLoss() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauProfitAndLoss(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getOtherDomesticData() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauOtherDomesticData(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getDocSituation() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauDocSituation(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getGlobalOverview() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauGlobalOverview(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getMexicanTax() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauMexicanTax(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getAustralianTax() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauAustralianTax(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }

    public Optional<String> getBrazilianTax() {
        Optional<String> optional = authUserHelper.getCurrentAuditor();
        return optional.map(s -> String.format(systemConfig.getTableauBrazilianTax(),
                getTicket(s).orElse(StringUtils.EMPTY)));
    }
}