package com.hotent.surveyinfo.calculator;//package com.hotent.surveyinfo.manager;

import org.nfunk.jep.JEP;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// ... existing code ...
public class CostSurveyFormulaCalculator {

    private Map<String, Object> currentTableData;
    private Map<String, Map<String, Object>> allTableData;

    public CostSurveyFormulaCalculator(Map<String, Object> currentTableData,
                                    Map<String, Map<String, Object>> allTableData) {
        this.currentTableData = currentTableData;
        this.allTableData = allTableData;
    }

    /**
     * 计算公式表达式
     * 支持：(1) 本指标中的项目运算、(2) 其它指标分类中的指标项参与计算
     * 通过分类指标的英文名称进行引用，如entSalary.D33
     */
    public Double calculate(String formula) {
        try {
            // 解析公式表达式
            String parsedFormula = parseFormula(formula);

            // 使用JEP或类似表达式引擎计算
            return evaluateExpression(parsedFormula);
        } catch (Exception e) {
            throw new IllegalArgumentException("公式计算错误: " + e.getMessage());
        }
    }

    /**
     * 解析公式表达式，处理跨表引用
     */
    private String parseFormula(String formula) {
        // 处理跨表引用，如entSalary.D33
        Pattern pattern = Pattern.compile("(\\w+)\\.([A-Z]+[0-9]+)");
        Matcher matcher = pattern.matcher(formula);

        StringBuilder result = new StringBuilder();
        int lastEnd = 0;

        while (matcher.find()) {
            String tableName = matcher.group(1);
            String cellCode = matcher.group(2);

            // 获取对应表的数据
            Map<String, Object> tableData = allTableData.get(tableName);
            if (tableData != null) {
                Object value = tableData.get(cellCode);
                if (value != null && value instanceof Number) {
                    // 替换为实际数值
                    result.append(lastEnd).append(matcher.start()).append(formula.substring(lastEnd, matcher.start()));
                    result.append(value.toString());
                } else {
                    
                    // 如果值不存在，返回0
                    result.append(lastEnd).append(matcher.start()).append(formula.substring(lastEnd, matcher.start()));
                    result.append("0");
                }
            } else {
                // 表不存在，返回0
                result.append(lastEnd).append(matcher.start()).append(formula.substring(lastEnd, matcher.start()));
                result.append("0");
            }

            lastEnd = matcher.end();
        }

        // 添加剩余部分
        result.append(formula.substring(lastEnd));

        return result.toString();
    }

    /**
     * 使用表达式引擎计算表达式
     */
    private Double evaluateExpression(String expression) {
        // 这里使用JEP表达式引擎或其他数学表达式解析器
        // 示例：使用JEP
        JEP jep = new JEP();
        jep.setAllowUndeclared(true);
        jep.setImplicitMul(true);


        // 设置变量
        for (Map.Entry<String, Object> entry : currentTableData.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            if (value instanceof Number) {
                jep.addVariable(key, ((Number) value).doubleValue());
            }
        }

        try {
            jep.parseExpression(expression);
            return jep.getValue();
        } catch (Exception e) {
            throw new IllegalArgumentException("表达式解析错误: " + e.getMessage());
        }
    }
}
