package cross_variety

import (
	"encoding/json"
	"eta/eta_api/controllers"
	"eta/eta_api/models"
	"eta/eta_api/models/data_manage/cross_variety"
	"eta/eta_api/models/data_manage/cross_variety/request"
	"eta/eta_api/models/data_manage/cross_variety/response"
	"eta/eta_api/utils"
	"github.com/rdlucklib/rdluck_tools/paging"
	"time"
)

// VarietyController
// @Description: 品种列表
type VarietyController struct {
	controllers.BaseAuthController
}

// Add
// @Title 新增品种
// @Description 新增品种接口
// @Param	request	body request.AddVarietyReq true "type json string"
// @Success 200 Ret=200 添加成功
// @router /variety/add [post]
func (c *VarietyController) Add() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.AddVarietyReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.VarietyName == "" {
		br.Msg = "请输入品种名称"
		br.IsSendEmail = false
		return
	}
	varietyName := utils.TrimStr(req.VarietyName)
	item, err := cross_variety.GetVarietyByName(varietyName)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "添加失败"
		br.ErrMsg = "添加失败,Err:" + err.Error()
		return
	}
	if item != nil {
		br.Msg = "添加失败,品种名称不能重复"
		br.IsSendEmail = false
		return
	}

	variety := &cross_variety.ChartVariety{
		ChartVarietyId:     0,
		ChartVarietyName:   varietyName,
		ChartVarietyNameEn: varietyName,
		SysUserId:          c.SysUser.AdminId,
		SysUserRealName:    c.SysUser.RealName,
		ModifyTime:         time.Now(),
		CreateTime:         time.Now(),
	}
	err = cross_variety.AddVariety(variety)
	if err != nil {
		br.Msg = "添加品种失败"
		br.ErrMsg = "添加品种失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Msg = "添加成功"
	br.IsAddLog = true
	br.Success = true
}

// Edit
// @Title 编辑品种接口
// @Description 编辑品种接口
// @Param	request	body request.EditVarietyReq true "type json string"
// @Success 200 Ret=200 修改成功
// @router /variety/edit [post]
func (c *VarietyController) Edit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.EditVarietyReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.ChartVarietyId <= 0 {
		br.Msg = "请选择品种"
		br.IsSendEmail = false
		return
	}
	if req.VarietyName == "" {
		br.Msg = "请输入品种名称"
		br.IsSendEmail = false
		return
	}
	varietyName := utils.TrimStr(req.VarietyName)

	item, err := cross_variety.GetVarietyByName(varietyName)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "添加失败"
		br.ErrMsg = "添加失败,Err:" + err.Error()
		return
	}
	if item != nil && item.ChartVarietyId != req.ChartVarietyId {
		br.Msg = "添加失败,品种名称不能重复"
		br.IsSendEmail = false
		return
	}

	// 获取品种详情
	varietyInfo, err := cross_variety.GetVarietyById(req.ChartVarietyId)
	if err != nil {
		br.Msg = "查询品种失败"
		br.ErrMsg = "查询品种失败;ERR:" + err.Error()
		return
	}

	// 编辑
	switch c.Lang {
	case utils.EnLangVersion:
		varietyInfo.ChartVarietyNameEn = varietyName
	default:
		varietyInfo.ChartVarietyName = varietyName
	}
	varietyInfo.ModifyTime = time.Now()
	err = varietyInfo.Update([]string{"ChartVarietyName", "ChartVarietyNameEn", "ModifyTime"})
	if err != nil {
		br.Msg = "修改品种失败"
		br.ErrMsg = "修改品种失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Msg = "修改成功"
	br.IsAddLog = true
	br.Success = true
}

// DeleteCheck
// @Title 删除品种检测接口
// @Description 删除品种检测接口
// @Param	request	body request.DelVarietyReq true "type json string"
// @Success 200 Ret=200 检测成功
// @router /variety/delete/check [post]
func (c *VarietyController) DeleteCheck() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.DelVarietyReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.ChartVarietyId <= 0 {
		br.Msg = "请选择品种"
		br.IsSendEmail = false
		return
	}
	var deleteStatus int
	var tipsMsg string

	// 获取该品种关联的图表数
	count, err := cross_variety.GetCountChartByVarietyId(req.ChartVarietyId)
	if err != nil {
		br.Msg = "检测异常"
		br.ErrMsg = "检测异常,err:" + err.Error()
		br.IsSendEmail = false
		return
	}
	if count > 0 {
		deleteStatus = 1
		tipsMsg = "已关联图表的品种,不允许删除!"
	}

	if deleteStatus == 0 {
		tipsMsg = "可删除,进行删除操作"
	}
	resp := response.VarietyDeleteCheckResp{
		DeleteStatus: deleteStatus,
		TipsMsg:      tipsMsg,
	}
	br.Ret = 200
	br.Msg = "检测成功"
	br.Success = true
	br.Data = resp
}

// Delete
// @Title 删除品种
// @Description 删除品种接口
// @Param	request	body request.DeleteChartClassifyReq true "type json string"
// @Success 200 Ret=200 删除成功
// @router /variety/delete [post]
func (c *VarietyController) Delete() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.DelVarietyReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.ChartVarietyId <= 0 {
		br.Msg = "请选择品种"
		br.IsSendEmail = false
		return
	}

	// 获取该品种关联的图表数
	count, err := cross_variety.GetCountChartByVarietyId(req.ChartVarietyId)
	if err != nil {
		br.Msg = "检测异常"
		br.ErrMsg = "检测异常,err:" + err.Error()
		br.IsSendEmail = false
		return
	}
	if count > 0 {
		br.Msg = "已关联图表的品种,不允许删除!"
		br.ErrMsg = "已关联图表的品种,不允许删除!"
		br.IsSendEmail = false
		return
	}

	varietyInfo, err := cross_variety.GetVarietyById(req.ChartVarietyId)
	if err != nil {
		if err.Error() == utils.ErrNoRow() {
			br.Msg = "该品种不存在或已删除"
			br.IsSendEmail = false
		} else {
			br.Msg = "删除失败"
			br.ErrMsg = "查找品种失败,ERR:" + err.Error()
		}
		return
	}
	err = varietyInfo.Delete()
	if err != nil {
		br.Msg = "删除失败"
		br.ErrMsg = "删除品种失败,ERR:" + err.Error()
		return
	}

	br.Ret = 200
	br.Msg = "删除成功"
	br.Success = true
	br.IsAddLog = true
}

// List
// @Title 获取标签中的指标与品种的映射关系
// @Description 获取标签中的指标与品种的映射关系
// @Success 200 Ret=200 保存成功
// @router /variety/list [get]
func (c *VarietyController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	// 获取数据
	list, err := cross_variety.GetVarietyList()
	if err != nil {
		br.Msg = "保存失败"
		br.ErrMsg = "保存失败,ERR:" + err.Error()
		return
	}
	dataCount := len(list)
	page := paging.GetPaging(1, dataCount, dataCount)

	resp := response.VarietyListResp{
		List:   list,
		Paging: page,
	}

	br.Ret = 200
	br.Msg = "获取成功"
	br.Success = true
	br.Data = resp
}