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

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

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.cn.fdapfe.common.utils.DateUtils;
import com.cn.fdapfe.common.utils.SecurityUtils;
import com.cn.fdapfe.common.utils.uuid.UUID;
import org.springframework.stereotype.Service;
import com.cn.fdapfe.biz.mapper.FormulasMapper;
import com.cn.fdapfe.biz.domain.Formulas;
import com.cn.fdapfe.biz.service.IFormulasService;

import javax.annotation.Resource;

/**
 * 公式管理管理Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-03-07
 */
@Service
public class FormulasServiceImpl implements IFormulasService 
{

    // 匹配公式中的参数（支持字母、希腊字母α、下划线）
    private static final Pattern PARAM_PATTERN = Pattern.compile("[αA-Za-z_$]+");
    @Resource
    private FormulasMapper formulasMapper;

    /**
     * 查询公式管理管理
     * 
     * @param id 公式管理管理主键
     * @return 公式管理管理
     */
    @Override
    public Formulas selectFormulasById(String id)
    {
        return formulasMapper.selectById(id);
    }

    /**
     * 查询公式管理管理列表
     * 
     * @param formulas 公式管理管理
     * @return 公式管理管理
     */
    @Override
    public List<Formulas> selectFormulasList(Formulas formulas)
    {

        QueryWrapper<Formulas> wrapper = new QueryWrapper<>();
        wrapper.eq(StringUtils.isNotEmpty(formulas.getFormulaId()),"formula_id",formulas.getFormulaId())
                .eq(StringUtils.isNotEmpty(formulas.getFormulaIndicator()),"formula_indicator",formulas.getFormulaIndicator())
                .like(StringUtils.isNotEmpty(formulas.getFormulaName()),"formula_name",formulas.getFormulaName())
                .or()
                .like(StringUtils.isNotEmpty(formulas.getFormulaName()),"formula_short_name",formulas.getFormulaName())
                .like(StringUtils.isNotEmpty(formulas.getCreateBy()),"create_by",formulas.getCreateBy())
                .like(StringUtils.isNotEmpty(formulas.getUpdateBy()),"update_by",formulas.getUpdateBy());
        if(formulas.getCreateTime()!=null){
            wrapper.ge("create_time",formulas.getCreateTime());
        }
        if(formulas.getUpdateTime()!=null){
            wrapper.le("update_time",formulas.getUpdateTime());
        }
        return formulasMapper.selectList(wrapper);
    }

    /**
     * 新增公式管理管理
     * 
     * @param formulas 公式管理管理
     * @return 结果
     */
    @Override
    public int insertFormulas(Formulas formulas)
    {
        formulas.setCreateTime(DateUtils.getNowDate());
        formulas.setUpdateBy(SecurityUtils.getUsername());
        formulas.setFormulaId(UUID.randomUUID().toString());
        String generate = generate(formulas.getFormulaShortName(), formulas.getOriginalFormula());
        formulas.setFormulaStoredProcedure(generate);
        return formulasMapper.insert(formulas);
    }

    /**
     * 修改公式管理管理
     * 
     * @param formulas 公式管理管理
     * @return 结果
     */
    @Override
    public int updateFormulas(Formulas formulas)
    {
        formulas.setUpdateTime(DateUtils.getNowDate());
        Formulas byId = formulasMapper.selectById(formulas.getFormulaId());

        return byId==null ? insertFormulas(formulas): formulasMapper.updateById(formulas);
    }

    /**
     * 批量删除公式管理管理
     * 
     * @param ids 需要删除的公式管理管理主键
     * @return 结果
     */
    @Override
    public int deleteFormulasByIds(String[] ids)
    {
        return ids!=null && ids.length == 1 ? formulasMapper.deleteById(ids[0]): formulasMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 根据公式生成存储过程
     * @param procName
     * @param expression
     * @return
     */
    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);

        // 调整幂运算正则表达式（示例，需根据需求完善）
        String sqlExpr = expression.replaceAll("([αA-Za-z_$][\\wα$]*)\\^([α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");

        // 移除 DELIMITER，调整语句格式
        return "CREATE PROCEDURE `" + procName + "`(" + paramsSql + ")\n" +
                "BEGIN\n" +
                "    SET `result` = " + sqlExpr + ";\n" +
                "END;";
    }

}
