package com.cn.fdapfe.biz.service.impl;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Service;

import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

@Service
public class StoredProcedureService {

    private final JdbcTemplate jdbcTemplate;

    public StoredProcedureService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 执行ACC存储过程
     * @param alpha 输入参数alpha
     * @param FN 输入参数FN
     * @param POW 输入参数POW
     * @param TN 输入参数TN
     * @param FP 输入参数FP
     * @param TP 输入参数TP
     * @return 计算结果
     */
    public Double executeACCProcedure(
            Double alpha,
            Double FN,
            Double POW,
            Double TN,
            Double FP,
            Double TP
    ) {
        // 定义存储过程调用对象
        SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("ACC");  // 存储过程名称

        // 定义输入参数（按顺序对应存储过程参数）
        Map<String, Object> inParams = new HashMap<>();
        inParams.put("alpha", alpha);
        inParams.put("FN", FN);
        inParams.put("POW", POW);
        inParams.put("TN", TN);
        inParams.put("FP", FP);
        inParams.put("TP", TP);

        // 定义输出参数（名称需与存储过程OUT参数一致，MySQL存储过程参数名不区分大小写）
        simpleJdbcCall.addDeclaredParameter(new SqlOutParameter("result", Types.DOUBLE));

        // 执行存储过程并获取结果
        Map<String, Object> result = simpleJdbcCall.execute(inParams);

        // 提取输出结果（注意：键为存储过程OUT参数名，全小写或与定义一致）
        return (Double) result.get("result");
    }
}