package com.ozs.rpm.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.ozs.rpm.dto.ReportSqlDTO;
import com.ozs.rpm.dto.kpim.ColumnConfigDTO;
import com.ozs.rpm.dto.kpim.ComputedTypeInfoDTO;
import com.ozs.rpm.dto.kpim.DefinedTypeInfoDTO;
import com.ozs.rpm.dto.kpim.KpiConfigDTO;
import com.ozs.rpm.dto.kpim.RelColumnConfigDTO;
import com.ozs.rpm.dto.kpim.RuleConfigDTO;
import com.ozs.rpm.dto.util.ChartParameterDTO;
import com.ozs.rpm.dto.util.SqlDTO;
import com.ozs.rpm.util.StringUtil;

public class ReportDataServiceImplUtil {

	public static ReportSqlDTO getReportSqlList(ChartParameterDTO chartParameter) {

		ReportSqlDTO reportSqlDTO = new ReportSqlDTO();

		Integer reportType = chartParameter.getReportType();
		SqlDTO sql = new SqlDTO();
		// 模板sql
		String tempSqlStr = "";
		// 报表sql
		String sqlStr = "";
		// 求总数
		String countSqlStr = "";
		// 汇总
		String totalSqlStr = "";

		switch (reportType) {
		case 0:
			sql = new SqlDTO();
			tempSqlStr = getTempSql(chartParameter, sql, reportSqlDTO, false);
			// 报表sql
			sqlStr = sql.toSql(tempSqlStr);
			// 求总数
			countSqlStr = sql.toCountSql(tempSqlStr);
			// 汇总
			sql = new SqlDTO();
			// 汇总查看报表展示汇总kpi
			totalSqlStr = sql.toTotalSql(getTempSql(chartParameter, sql, reportSqlDTO, true));

			reportSqlDTO.setReportId(reportSqlDTO.getReportId());
			reportSqlDTO.setSqlReport(sqlStr);
			reportSqlDTO.setSqlCount(countSqlStr);
			reportSqlDTO.setSqlTotal(totalSqlStr);
			break;

		case 1:

		case 2:
			sql = new SqlDTO();
			tempSqlStr = getTempSql(chartParameter, sql, reportSqlDTO, false);
			// 报表sql
			// sqlStr = sql.toSql(tempSqlStr);
			// 图表sql
			sqlStr = sql.toChartSql(tempSqlStr);
			reportSqlDTO.setReportId(reportSqlDTO.getReportId());
			reportSqlDTO.setChartType(reportType);
			reportSqlDTO.setSqlReport(sqlStr);

			break;

		default:
			break;
		}

		return reportSqlDTO;

	}

	private static String getTempSql(ChartParameterDTO chartParameter, SqlDTO sql, ReportSqlDTO reportSqlDTO,
			Boolean isTotal) {
		// group by的KPIID集合
		List<String> idsGroupBy = chartParameter.getIdsGroupBy();
		// 报表KPI详细信息
		List<KpiConfigDTO> KpiConfigList = chartParameter.getKpiConfigList();
		if (isTotal) {
			KpiConfigList = chartParameter.getTotalKpiConfigList();
		}
		// 数据库集合，为了判断是否垮裤
		Set<String> databaseIds = new HashSet<>();
		// 表集合
		Set<String> tableIdSets = new HashSet<>();
		List<String> tableIds = null;
		// 判断是否groupBy
		Boolean isGroupBy = false;
		if ((idsGroupBy != null && idsGroupBy.size() > 0)) {
			isGroupBy = true;
			// 4.拼group by 数值sum 率值avg 字符或时间-
			sql.getGroupBySql().append("@gry^ group by ");
		}
		// group id 对应 code map
		Map<String, String> groupIdToCodeMap = new HashMap<>();
		// group聚合条件
		StringBuffer groupByBegin = null;
		StringBuffer groupByEnd = null;
		// 遍历KPI属性
		for (int i = 0; i < KpiConfigList.size(); i++) {
			groupByBegin = new StringBuffer("");
			groupByEnd = new StringBuffer("");
			KpiConfigDTO kpi = KpiConfigList.get(i);
			String kpiCode = kpi.getKpiCode();
			// kpi格式，时间和小数
			String format = kpi.getFormat();
			// kpi单位
			String unit = kpi.getUnit();
			// if (isGroupBy || chartParameter.getReportType() == 2 || isTotal)
			// {
			if (chartParameter.getReportType() == 2 || isTotal) {
				if (unit.trim().equals("%")) {
					groupByBegin.append("avg(");
				} else {
					groupByBegin.append("sum(");
				}
				groupByEnd.append(")");
			}
			/**
			 * TODO 聚合字段替换，为支持报表页面可操作聚合，字段聚合sql操作在获取报表数据时替换添加 求汇总数据和图表数据不使用
			 */
			if (isGroupBy && !isTotal) {
				// 可操作性聚合只影响报表表格数据加载，不影响图表
				if (chartParameter.getReportType() == 1) {
					groupByBegin.append("sum(");
					groupByEnd.append(")");
				} else {
					groupByBegin.append(kpiCode + "_sumL");
					groupByEnd.append(kpiCode + "_sumR");
				}
			}

			// KPI类型
			String ruleType = kpi.getRuleType();
			// 相关数据库集合
			databaseIds.add(kpi.getDatabaseId());
			// 拼接group by，使用KPICODE为别名
			if (isGroupBy && idsGroupBy.contains(kpi.getId())) {
				// sql.getGroupBySql().append(kpi.getKpiCode()).append(",");
				groupIdToCodeMap.put(kpi.getId(), kpi.getKpiCode());
			}
			/**
			 * 计算类型
			 */
			if (kpi.getType() == 2) {
				ComputedTypeInfoDTO computedTypeInfo = kpi.getComputedTypeInfo();
				// KPI字段之间关系
				List<RelColumnConfigDTO> relColumnList = computedTypeInfo.getRelOptions();
				if (computedTypeInfo.getAcrossTable().equals("yes") && relColumnList != null) {
					for (int j = 0; j < relColumnList.size(); j++) {
						// 拼接关联关系
						sql.getWhereSql().append(" and ").append(relColumnList.get(j).getColumnId()).append("=")
								.append(relColumnList.get(j).getRelColumnId());
						// 拼接from
						tableIdSets.add(relColumnList.get(j).getTableId());
						tableIdSets.add(relColumnList.get(j).getRelTableId());
					}
				}
				// 不跨表的表设置
				List<ColumnConfigDTO> columnConfigList = computedTypeInfo.getContents();
				if (columnConfigList != null) {
					for (ColumnConfigDTO columnConfig : columnConfigList) {
						tableIdSets.add(columnConfig.getTableId());
					}
				}
				// KPI计算公式，按数据加载
				List<RuleConfigDTO> ruleConfigList = computedTypeInfo.getRuleOptions();
				if (ruleConfigList != null) {
					String columnOrConstant = null;
					String isConstant = null;
					StringBuffer compute = new StringBuffer();
					for (int j = 0; j < ruleConfigList.size(); j++) {
						columnOrConstant = "";
						isConstant = ruleConfigList.get(j).getIsConstant();
						if (StringUtil.isNotEmpty(isConstant) && isConstant.equals("true")) { // 是常量
							columnOrConstant = ruleConfigList.get(j).getConstant();
						} else {
							columnOrConstant = groupByBegin + ruleConfigList.get(j).getColumnId() + groupByEnd;
						}
						// 拼接条件语句
						compute.append(ruleConfigList.get(j).getLeftSign()).append(columnOrConstant)
								.append(ruleConfigList.get(j).getRightSign());
						// compute.append(ruleConfigList.get(j).getLeftSign()).append(columnOrConstant)
						// .append(ruleConfigList.get(j).getRightSign());

					}
					sql.getSelectSql().append("convert(").append(compute);
					// sql.getSelectSql().append("convert(").append(groupByBegin).append(compute);
					// sql.getSelectSql().append(groupByEnd);
					sql.getSelectSql().append(",decimal(13,").append(format).append(")) ").append(kpi.getKpiCode())
							.append(",");
				}
			} else if (kpi.getType() == 4) {
				/**
				 * 函数类型
				 */
				List<DefinedTypeInfoDTO> functionKpiColumns = kpi.getFunctionKpiColumns();
				for (DefinedTypeInfoDTO c : functionKpiColumns) {
					kpi.setFunctionValue(kpi.getFunctionValue().replaceAll("C" + (functionKpiColumns.indexOf(c) + 1),
							c.getColumnId()));
				}
				// *************数据遍历*****************
				// group by且是数字
				String functionValue = kpi.getFunctionValue();
				if (ruleType.equals("number")) {
					sql.getSelectSql().append("convert(").append(groupByBegin).append(functionValue).append(groupByEnd);
					sql.getSelectSql().append(",decimal(13,").append(format).append(")) ").append(kpi.getKpiCode())
							.append(",");
				} else if (isGroupBy || isTotal) {
					if (idsGroupBy.contains(kpi.getId())) {
						// 是group by字段
						sql.getSelectSql().append("@text1^").append(functionValue).append("@text2^").append(" ")
								.append(kpi.getKpiCode()).append(",");
					} else {
						sql.getSelectSql().append("'——'").append(" ").append(kpi.getKpiCode()).append(",");
					}
				} else {
					sql.getSelectSql().append(functionValue).append(" ").append(kpi.getKpiCode()).append(",");
				}
			} else {
				/**
				 * 定义或输入
				 */
				// *************数据遍历*****************
				DefinedTypeInfoDTO definedTypeInfo = kpi.getDefinedTypeInfo();
				tableIdSets.add(definedTypeInfo.getTableId());
				// *************数据遍历*****************
				// group by且是数字
				String columnId = definedTypeInfo.getColumnId();
				if (ruleType.equals("number")) {
					sql.getSelectSql().append("convert(").append(groupByBegin).append(columnId).append(groupByEnd);
					sql.getSelectSql().append(",decimal(13,").append(format).append(")) ").append(kpi.getKpiCode())
							.append(",");
				} else if (isGroupBy || isTotal) {
					if (idsGroupBy.contains(kpi.getId())) {
						// 是group by字段
						sql.getSelectSql().append("@text1^").append(columnId).append("@text2^").append(" ")
								.append(kpi.getKpiCode()).append(",");
					} else {
						sql.getSelectSql().append("'——'").append(" ").append(kpi.getKpiCode()).append(",");
					}
				} else {
					sql.getSelectSql().append(columnId).append(" ").append(kpi.getKpiCode()).append(",");
				}
			}
		}

		/**
		 * 设计到的库和表
		 */
		tableIds = new ArrayList<>(tableIdSets);
		for (int i = 0; i < tableIds.size(); i++) {
			sql.getFromSql().append(tableIds.get(i)).append(",");
		}
		sql.getFromSql().deleteCharAt(sql.getFromSql().length() - 1);

		// 1.拼select ok
		// 2.拼from ok
		// 3.拼where ok
		// 4.拼group by ok
		sql.getSelectSql().deleteCharAt(sql.getSelectSql().length() - 1);
		/**
		 * 为支持报表页面可操作聚合，字段聚合sql操作在获取报表数据时替换添加
		 */
		if (isGroupBy) {
			for (String groupKpiId : idsGroupBy) {
				sql.getGroupBySql().append(groupIdToCodeMap.get(groupKpiId)).append(",");
			}
			sql.getGroupBySql().deleteCharAt(sql.getGroupBySql().length() - 1);
			// group by 拼接@gry^
			sql.getGroupBySql().append(" @gry^");
		}

		sql.getWhereSql().append(" @whr^");

		// 用户判断是否跨库
		if (databaseIds.size() > 1) {
			return "-1";
		}
		reportSqlDTO.setDatabaseId(new ArrayList<>(databaseIds).get(0));
		/**
		 * 分母非零非null 补充
		 */

		// 替换sql
		String resultSqlStr = sql.toTempSql();
		for (Map.Entry<String, String> entry : chartParameter.getColumnMap().entrySet()) {
			resultSqlStr = resultSqlStr.replace(entry.getKey(), entry.getValue());
		}
		return resultSqlStr;
	}

}
