package v2

import (
	"fmt"
	"strings"
	"time"

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

type CalculateProcess struct {
	ID        uint      `gorm:"primary_key" json:"id"`
	CreatedAt time.Time `json:"createdAt"`
	UpdatedAt time.Time `json:"updatedAt"`
	//所有人ID
	OwnerID uint `gorm:"index" json:"ownerID"`
	// 所有者类型,是provider还是providerArticle还是Seller还是sellerArticle
	Kind string `gorm:"index" json:"kind"`
	// 条件
	Condition string `json:"condition"`
	// 计算过程
	Process string `json:"process"`
	// 名称
	Name string `json:"name"`
}

// 计算过程
func (c *CalculateProcess) Run(env map[string]float64) (string, float64) {
	if c.Condition != "" {
		condition, err := expr.Compile(c.Condition, expr.AsBool())
		if err != nil {
			return fmt.Sprintf("【%s】 condition compile error: %v", c.Name, err), 0
		}
		if ok, err := expr.Run(condition, env); err != nil {
			return fmt.Sprintf("【%s】 condition run error: %v", c.Name, err), 0
		} else if !ok.(bool) {
			return "", 0
		}
	}
	program, err := expr.Compile(c.Process, expr.AsFloat64())
	if err != nil {
		return fmt.Sprintf("【%s】 process compile error: %v", c.Name, err), 0
	}

	output, err := expr.Run(program, env)
	if err != nil {
		return fmt.Sprintf("【%s】 process run error: %v", c.Name, err), 0
	}
	var replaceList = make([]string, 0, 2*len(env))
	for k, v := range env {
		replaceList = append(replaceList, k, fmt.Sprintf("%.2f", v))
	}
	replacer := strings.NewReplacer(replaceList...)
	var resp = output.(float64)
	return replacer.Replace(fmt.Sprintf("【%s】 %s = %.2f", c.Name, c.Process, resp)), resp
}