/*
 * @description: 计量接口
 * @Author: CP
 * @Date: 2021-12-25 14:33:40
 * @FilePath: \construction_management\web\external\jl_ex.go
 */
package external

import (
	"fmt"

	"github.com/kataras/iris/v12"
	"go.mod/dao"
	"go.mod/datasource"
	"go.mod/lib"
	"go.mod/services"
	"go.mod/web/utils"
	"go.mod/web/viewmodels"
)

type JlEx struct {
	//框架-web应用上下文环境
	Ctx iris.Context
	// 需要用的service - 必须是鸭子形式，才不会出现问题
	// JlService services.JlService
}

// 检验项目 Calibration
func (c *JlEx) PostCalibration() {

	// 1.获得数据
	data := &viewmodels.Jl{}
	if err := c.Ctx.ReadForm(data); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 1-1.校验是否存在TOKEN
	if err := data.ValidateToken(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 1-2.验证jwt
	claims, err := utils.ValidateJwt(data.Token)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}
	// 1-3.验证参数的正确性
	claimsData := &viewmodels.Jl{
		Code: fmt.Sprintf("%s", claims["code"]),
	}
	if err := claimsData.ValidateParameter(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	JlService := services.NewJlService()
	result := JlService.IsCode(claimsData.Code)
	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": result,
	})
}

// 添加项目和账号
func (c *JlEx) PostProjectAdd() {
	// 1.获得数据
	data := &viewmodels.Jl{}
	if err := c.Ctx.ReadForm(data); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}
	// 1-1.校验是否存在TOKEN
	if err := data.ValidateToken(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}
	// 1-2.验证jwt
	claims, err := utils.ValidateJwt(data.Token)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 1-3.验证参数的正确性
	claimsData := &viewmodels.Jl{
		Code:    fmt.Sprintf("%s", claims["code"]),
		Account: fmt.Sprintf("%s", claims["account"]),
	}
	if err := claimsData.ValidateProjectAdd(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	JlService := services.NewJlService()
	result, err := JlService.ProjectAdd(claimsData)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}
	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": result,
	})
}

// 授权登陆
func (c *JlEx) PostAuthLogin() {

	debug := utils.GetEnvInfo("DEBUG")
	AuthUrl := "https://jl.smartcost.com.cn"
	if debug == "qa" {
		AuthUrl = "http://jlqa.smartcost.com.cn:7002"
	} else if debug == "uat" {
		AuthUrl = "http://jluat.smartcost.com.cn"
	}

	// 1.获得数据
	data := &viewmodels.Jl{}
	if err := c.Ctx.ReadJSON(data); err != nil {
		// fmt.Sprintf("%s", err)
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err), "data": map[string]string{
			"redirect": AuthUrl,
		}})
		return
	}
	// 1-1.校验是否存在TOKEN
	if err := data.ValidateToken(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err), "data": map[string]string{
			"redirect": AuthUrl,
		}})
		return
	}
	// 1-2.验证jwt
	claims, err := utils.ValidateJwt(data.Token)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err), "data": map[string]string{
			"redirect": AuthUrl,
		}})
		return
	}

	// 1-3.验证参数的正确性
	claimsData := &viewmodels.Jl{
		Code:    fmt.Sprintf("%s", claims["code"]),
		Account: fmt.Sprintf("%s", claims["account"]),
	}
	if err := claimsData.ValidateProjectAdd(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err), "data": map[string]string{
			"redirect": AuthUrl,
		}})
		return
	}

	JlService := services.NewJlService()
	result, err := JlService.AuthLogin(claimsData, c.Ctx.ResponseWriter())
	if err != nil {
		code := -1
		errString := fmt.Sprintf("%s", err)
		if errString == "该账号已被停用" {
			// 计量跳转代表账号停用
			code = 3
		}
		c.Ctx.JSON(iris.Map{"code": code, "msg": errString, "data": map[string]string{
			"redirect": AuthUrl,
		}})
		return
	}
	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": result,
	})
}

// 修改账号名称接口
func (c *JlEx) PostAccountUpdate() {
	// 1.获得数据
	data := &viewmodels.Jl{}
	if err := c.Ctx.ReadForm(data); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}
	// 1-1.校验是否存在TOKEN
	if err := data.ValidateToken(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 1-2.验证jwt
	claims, err := utils.ValidateJwt(data.Token)
	if err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 1-3.验证参数的正确性
	claimsData := &viewmodels.Jl{
		Code:       fmt.Sprintf("%s", claims["code"]),
		Account:    fmt.Sprintf("%s", claims["account"]),
		NewAccount: fmt.Sprintf("%s", claims["newAccount"]),
	}
	if err := claimsData.ValidateAccountUpdate(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	JlService := services.NewJlService()
	if err := JlService.AccountUpdate(claimsData); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	c.Ctx.JSON(iris.Map{
		"code": 0,
		"msg":  "",
		"data": "",
	})
}

// 批量同步计量账号
func (c *JlEx) PostSync() {

	var (
		accountList []map[string]interface{}
		err         error
	)

	// 1.获得数据
	data := &viewmodels.Jl{}
	if err := c.Ctx.ReadForm(data); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}
	// 1-1.校验是否存在TOKEN
	if err := data.ValidateCode(); err != nil {
		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
		return
	}

	// 获得计量 -TODO
	Jlzf := lib.NewJlzf()
	if accountList, err = Jlzf.GetAccountList(data.Code); err != nil {
		fmt.Println(err)
	}
	dao := dao.NewProjectAccountDao(datasource.InstanceDbMaster())
	if err = dao.JlSync(accountList, 85); err != nil {
		fmt.Println(err)
	}

}
