package expr

import (
	"fmt"
	"regexp"
	"strings"

	"github.com/expr-lang/expr"
)

// Eval 计算表达式返回结果
func Eval(exprStr string, env map[string]any) (any, error) {
	return expr.Eval(exprStr, env)
}

// ParseExprEnv 解析表达式环境变量
// 比如 "('SMF.03'/'SMF.04')*100"
// 变量传入"SMF.03": 3
func ParseExprEnv(exprStr string, env map[string]any) (string, map[string]any) {
	// 使用正则表达式匹配带单引号的变量名
	re := regexp.MustCompile(`'([^']+)'`)
	tempEnv := make(map[string]any)
	tempExpr := exprStr
	varCount := 0
	matches := re.FindAllStringSubmatch(exprStr, -1)
	for _, match := range matches {
		paramName := match[1]
		tempVarName := fmt.Sprintf("var%d", varCount)
		tempEnv[tempVarName] = env[paramName]
		tempExpr = strings.Replace(tempExpr, match[0], tempVarName, 1)
		varCount++
	}

	// 合并临时环境变量和原环境变量
	combinedEnv := make(map[string]any)
	for k, v := range env {
		combinedEnv[k] = v
	}
	for k, v := range tempEnv {
		combinedEnv[k] = v
	}

	return tempExpr, combinedEnv
}
