package com.usoftchina.bi.server.service.chart;

import com.usoftchina.bi.core.base.RepCode;
import com.usoftchina.bi.core.base.RepEntity;
import com.usoftchina.bi.core.jdbc.DynamicDataSourceContextHolder;
import com.usoftchina.bi.server.dao.chart.ChartsConfigMapper;
import com.usoftchina.bi.server.dao.chart.ShowChartsMapper;
import com.usoftchina.bi.server.model.bo.ChartsColumnConfig;
import com.usoftchina.bi.server.model.bo.Screen;
import com.usoftchina.bi.server.model.bo.ScreenStr;
import com.usoftchina.bi.server.model.vo.configVo.PopulationInfo;
import com.usoftchina.bi.server.model.vo.dataVo.PopAndIndDataInfo;
import com.usoftchina.bi.server.utils.ScreenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.sql.SQLException;
import java.util.*;

@Service
public class ShowPopulationService {
    @Autowired
    ChartsConfigMapper chartsConfigMapper;
    @Autowired
    ShowChartsMapper showChartsMapper;
    @Autowired
    GetChartsDataUtilService getChartsDataUtilService;
    @Autowired
    ScreenUtil screenUtil;
    @Autowired
    ChartsUtilService chartsUtilService;

    public RepEntity showPopulation(PopulationInfo populationInfo, String token, int dashId) throws SQLException {
        Assert.notNull(populationInfo, "参数不能为空");
        PopAndIndDataInfo popAndIndDataInfo = new PopAndIndDataInfo();
        //取表名
        int id = populationInfo.getId();
        //获取列配置
        ChartsColumnConfig chartsColumn = chartsConfigMapper.getChartsColumn(id);
        if (ObjectUtils.isEmpty(chartsColumn)){
            return new RepEntity(RepCode.erro.getCode(), "图表列配置为空", null);
        }
        popAndIndDataInfo.setChartsColumnConfig(chartsColumn);

        String tableName = chartsUtilService.getSqlStr(token, id, dashId);
        if (StringUtils.isEmpty(tableName)){
            return new RepEntity(RepCode.NoAuthority);
        }

        int baseId = getChartsDataUtilService.getBaseId(id);

        try{
            if (!DynamicDataSourceContextHolder.isContainsDataSource(baseId)) {
                return new RepEntity(RepCode.DataSourceNull);
            } else {
                DynamicDataSourceContextHolder.setDataSourceType(baseId);
            }
            List<String> groupByList = populationInfo.getGroupByList();  //分组

            //取目标列和分析运算符
            String columnName = populationInfo.getColumnName();
            List<String> operators = populationInfo.getOperatorList();
            Map<String, Double> targetData = new HashMap<>();  //存放结果集
            Double value = null;                 //MAP的值
            //取筛选列表
            List<Screen> screens = populationInfo.getFilters();
            String screen = "";
            String screenStr = "";
            ScreenStr str = new ScreenStr();
            if (CollectionUtils.isEmpty(screens)){
                screen = "";
                screenStr = "";
            }else {
                str = screenUtil.screensUtil(screens, "", "");
                screen = str.getRet();
                StringBuilder sb = new StringBuilder(screen);
                screenStr = String.valueOf(sb .replace(1, 5, "where "));
            }

            //无分组
            if (groupByList.size() == 0) {
                Iterator<String> operatorsList = operators.iterator();
                while (operatorsList.hasNext()) {
                    String operator = operatorsList.next();
                    if ("75TH".equalsIgnoreCase(operator)) {
                        String calculation = "MEDIAN";
                        Double median = showChartsMapper.getColumnDev(tableName, columnName, calculation, screenStr);
                        calculation = "MAX";
                        Double max = showChartsMapper.getColumnDev(tableName, columnName, calculation, screenStr);
                        value = showChartsMapper.getValue(tableName, columnName, calculation, median, max);
                    } else if ("25TH".equalsIgnoreCase(operator)) {
                        String calculation = "MEDIAN";
                        Double median = showChartsMapper.getColumnDev(tableName, columnName, calculation, screen);
                        calculation = "MIN";
                        Double min = showChartsMapper.getColumnDev(tableName, columnName, calculation, screenStr);
                        value = showChartsMapper.getValue(tableName, columnName, calculation, min, median);
                    } else if ("PERCENT".equalsIgnoreCase(operator)) {
                        value = 1.00;
                    } else if("dictinctCount".equalsIgnoreCase(operator)){
                        value = showChartsMapper.getDistinctCountColumnData(tableName, columnName, operator, screenStr);
                    } else {
                        value = showChartsMapper.getColumnData(tableName, columnName, operator, screenStr);
                    }
                    targetData.put(operator, value);
                }
                popAndIndDataInfo.setValueList(targetData);
                return new RepEntity(RepCode.success, popAndIndDataInfo);
                //有分组
            }else {
                String listOne = groupByList.get(0);
                Iterator<String> operatorsList = operators.iterator();
                //获取常规运算列
                List<String> operatorColumn = new ArrayList<>();
                //获取25th,75th算符
                List<String> operatorOther = new ArrayList<>();
                String next = null;
                while (operatorsList.hasNext()){
                    next = operatorsList.next();
                    //计算25th,75th,和百分比
                    if ("PERCENT".equalsIgnoreCase(next)){
                        String op = "count(" + columnName + ")/(select count(1) from " + tableName + ") \""+ next + "\"";
                        operatorColumn.add(op);
                    }else if ("25th".equalsIgnoreCase(next) || "75th".equalsIgnoreCase(next)){
                        operatorOther.add(next);
                    }else {
                        String op = next + "(" + columnName + ") as \"" + next + "\"";
                        operatorColumn.add(op);
                    }
                }

                String groups = groupByList.toString();
                String groupBy = getString(groups);
                String oprs = operatorColumn.toString();
                String opr = getString(oprs);
                //存放正常值
                List<LinkedHashMap<String, Object>> valueList = new ArrayList<>();
                //存放25th,75th
                List<LinkedHashMap<String, Object>> valueListTh = new ArrayList<>();
                Iterator thList = operatorOther.iterator();
                valueList = showChartsMapper.getGroupByValue(groupBy, opr, tableName, listOne, screenStr);
                popAndIndDataInfo.setValueList(valueList);
                return new RepEntity(RepCode.success, popAndIndDataInfo);
            }
        }catch (Exception e){
            e.printStackTrace();
            if (e.getCause().getMessage().contains("ORA-00904:")) {
                return new RepEntity(RepCode.erro.getCode(), "数据源" + e.getCause().getMessage().replace("ORA-00904:", "").replaceAll("标识符", "列"), null);
            }
            return new RepEntity(RepCode.erro.getCode(), e.getCause().getMessage(), null);
        }finally {
            DynamicDataSourceContextHolder.clearDataSourceType();
        }
    }

    public String getString(String str){
        String st1 = "[";
        String st2 = "]";
        String strA = str.replace(st1, "");
        String strB = strA.replace(st2, "");
        return strB;
    }
}
