package com.cn.fdapfe.models.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@RestController
@RequestMapping("/api")
public class ProcedureController {

    public static void main(String[] args) {
//         模拟调试数据：测试 Fα 分数公式
//        String procName = "calculate_f_score";
//        String expression = "((α^2 + 1) * (TP/(TP+FN)) * (TN/(TN+FP))) / (α^2 * ((TP/(TP+FN)) + (TN/(TN+FP)))))";
//
//        // 生成存储过程 SQL
//        String spSql = generate(procName, expression);
//
//        // 输出结果
//        System.out.println("生成的存储过程 SQL：");
//        System.out.println(spSql);
//
//        // 测试另一个公式：准确率公式（包含 TP, TN, FP, FN）
        String accExpression = "max(TP/(TP+FP))";
        String accProcName = "calculate_accuracy";
        String accSpSql = generate(accProcName, accExpression);
        System.out.println("\n\n生成的准确率存储过程 SQL：");
        System.out.println(accSpSql);
    }


    // 匹配公式中的参数（支持字母、希腊字母α、下划线）
    private static final Pattern PARAM_PATTERN = Pattern.compile("[αA-Za-z_$]+");
    @PostMapping("Procedure")
    public static String generate(String procName, String expression) {
        // 1. 解析公式中的参数（去重）
        Set<String> params = new HashSet<>();
        Matcher matcher = PARAM_PATTERN.matcher(expression);
        while (matcher.find()) {
            params.add(matcher.group());
        }
        // 转换为列表并排序（保证顺序一致）
        List<String> paramList = new ArrayList<>(params);

        // 2. 处理公式中的幂运算（α^2 → POW(α, 2)）
        String sqlExpr = expression.replaceAll("([αA-Za-z_$]+)\\^([\\d.]+)", "POW($1, $2)");

        // 3. 组装参数声明（所有解析出的参数为输入，添加默认输出参数 result）
        StringBuilder paramsSql = new StringBuilder();
        for (int i = 0; i < paramList.size(); i++) {
            String param = paramList.get(i);
            paramsSql.append(param).append(" DOUBLE");
            if (i != paramList.size() - 1) {
                paramsSql.append(", ");
            }
        }
        // 添加输出参数（默认名为 result，可自定义）
        paramsSql.append(", result DOUBLE OUT");

        // 4. 生成存储过程 SQL
        return "DELIMITER //\n" +
                "CREATE PROCEDURE " + procName + "(" + paramsSql + ")\n" +
                "BEGIN\n" +
                "    SET result = " + sqlExpr + ";\n" +
                "END //\n" +
                "DELIMITER ;";
    }
    }

