package controller

import (
	"enterprise/common/config"
	"enterprise/common/dao"
	"enterprise/common/model"
	"enterprise/server/api"
	"enterprise/server/service"
	"enterprise/server/session"
	"github.com/gin-gonic/gin"
	"github.com/smbrave/goutil"
	"github.com/spf13/cast"
	"net/http"
)

type Calculator struct{}

func NewCalculator() *Calculator {
	return &Calculator{}
}

// Create 创建一个新的计算项
func (c *Calculator) Create(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	var req api.CreateCalculatorReq
	session.CheckParamError(ctx.ShouldBindJSON(&req))
	ctx.Keys[session.ContextRequest] = req

	if !sess.GetAdmin().GetConfig().IsAdmin() {
		panic(config.ErrParam.New())
	}
	calculator := new(model.SalaryCalculator)
	calculator.CorpId = sess.GetAdmin().CorpId
	calculator.Name = req.Name
	calculator.Expression = req.Expression
	_, err := dao.NewSalaryCalculatorDao().Create(calculator)
	session.CheckDBError(err)
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

// Update 更新已有的计算项
func (c *Calculator) Update(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	var req api.UpdateCalculatorReq
	session.CheckParamError(ctx.ShouldBindJSON(&req))
	ctx.Keys[session.ContextRequest] = req
	if !sess.GetAdmin().GetConfig().IsAdmin() {
		panic(config.ErrParam.New())
	}
	calculator, err := dao.NewSalaryCalculatorDao().Get(cast.ToInt64(req.Id))
	session.CheckDBError(err)
	session.CheckNilError(calculator, "计算项不存在")

	calculator.Name = goutil.If(req.Name != "", req.Name, calculator.Name)
	calculator.Expression = goutil.If(req.Expression != "", req.Expression, calculator.Expression)

	err = dao.NewSalaryCalculatorDao().Update(calculator)
	session.CheckDBError(err)
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

// Delete 删除指定的计算项
func (c *Calculator) Delete(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	if !sess.GetAdmin().GetConfig().IsAdmin() {
		panic(config.ErrParam.New())
	}
	id := cast.ToInt64(ctx.Query("id"))
	session.CheckDBError(dao.NewSalaryCalculatorDao().Delete(id))
	ctx.JSON(http.StatusOK, session.NewRspOk())
}

// List 列出符合条件的计算项
func (c *Calculator) List(ctx *gin.Context) {
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	var req api.ListCalculatorReq
	session.CheckParamError(ctx.ShouldBind(&req))
	req.Default()

	calculators, total, err := dao.NewSalaryCalculatorDao().Query(req.Page, req.Size, sess.GetCorpId(), req.Name)
	session.CheckDBError(err)
	items := make([]*api.Calculator, 0)
	for _, calc := range calculators {
		i := new(api.Calculator)
		i.From(calc)
		items = append(items, i)
	}

	ctx.JSON(http.StatusOK, session.NewListRsp(total, items))
}

// Delete 删除指定的计算项
func (c *Calculator) Test(ctx *gin.Context) {
	var req api.TestCalculatorReq
	session.CheckParamError(ctx.ShouldBindJSON(&req))
	sess := ctx.Keys[session.ContextSession].(*session.AdminSession)
	data := service.NewCalculator().Test(sess, &req)
	ctx.JSON(http.StatusOK, session.NewRsp(data))
}