package contract

import (
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"hongze/fms_api/controller/resp"
	"hongze/fms_api/global"
	"hongze/fms_api/models/crm"
	"hongze/fms_api/models/fms"
	"hongze/fms_api/models/system"
	"strconv"
	"strings"
)

// ServiceController 合同套餐
type ServiceController struct{}

// ServiceList
// @Title 合同套餐列表
// @Description 合同套餐列表
// @Param   ProductId  query  int  false  "套餐类型: 1-FICC(默认); 2-权益"
// @Success 200 {object} crm.ContractSearchListResp
// @router /contract/service/list [get]
func (sr *ServiceController) List(c *gin.Context) {
	var req fms.ContractServiceListReq
	if e := c.BindQuery(&req); e != nil {
		err, ok := e.(validator.ValidationErrors)
		if !ok {
			resp.FailData("参数解析失败", "Err:"+e.Error(), c)
			return
		}
		resp.FailData("参数解析失败", err.Translate(global.Trans), c)
		return
	}

	productIdStr := req.ProductId
	var productId int
	var list []*fms.ContractServiceTemplateItem
	var err error
	if productIdStr == "" {
		list, err = fms.GetContractServiceTemplateSecond()
	} else {
		productId, _ = strconv.Atoi(productIdStr)
		list, err = fms.GetContractServiceTemplateMapByProductId(productId)
	}

	if err != nil {
		resp.FailData("获取失败", "获取产品套餐失败, Err: "+err.Error(), c)
		return
	}
	allMap := make(map[int][]*fms.ContractServiceTemplateMapItems)
	respList := make([]*fms.ContractServiceTemplateList, 0)
	for i := 0; i < len(list); i++ {
		item := list[i]
		v := new(fms.ContractServiceTemplateMapItems)
		v.ContractServiceTemplateItem = *item

		secFormatList := make([]*fms.ContractServiceTemplateMapItems, 0)
		secList, e := fms.GetContractServiceTemplateMapByParentId(v.ServiceTemplateId)
		if e != nil {
			resp.FailData("获取失败", "Err:"+e.Error(), c)
			return
		}
		secondLen := len(secList)
		for j := 0; j < secondLen; j++ {
			sec := new(fms.ContractServiceTemplateMapItems)
			sec.ContractServiceTemplateItem = *secList[j]
			detail, e := fms.GetContractServiceDetailByTemplateId(secList[j].ServiceTemplateId)
			if e != nil {
				resp.FailData("获取失败", "获取详情模板失败, Err:"+e.Error(), c)
				return
			}
			sec.Detail = detail

			// 权益存在第三级主客观套餐
			thirdFormatList := make([]*fms.ContractServiceTemplateMapItems, 0)
			thirdList, e := fms.GetContractServiceTemplateMapByParentId(secList[j].ServiceTemplateId)
			if e != nil {
				resp.FailData("获取失败", "获取三级套餐失败, Err:"+e.Error(), c)
				return
			}
			for t := range thirdList {
				tf := new(fms.ContractServiceTemplateMapItems)
				tf.ContractServiceTemplateItem = *thirdList[t]
				thirdFormatList = append(thirdFormatList, tf)
			}
			sec.Children = thirdFormatList
			secFormatList = append(secFormatList, sec)
		}

		detail, e := fms.GetContractServiceDetailByTemplateId(item.ServiceTemplateId)
		if e != nil {
			resp.FailData("获取失败", "获取详情模板失败, Err:"+e.Error(), c)
			return
		}
		v.Detail = detail
		v.Children = secFormatList

		if v.Title == "FICC小套餐" {
			//获取ficc小套餐品种
			sysConf := new(system.SysConfig)
			confCond := `config_code = ?`
			confPars := make([]interface{}, 0)
			confPars = append(confPars, system.ConfigKeyCrmPermissionFiccClassify)
			confItem, e := sysConf.FetchByCondition(confCond, confPars)
			if e != nil {
				resp.FailData("获取失败", "Err:"+e.Error(), c)
				return
			}
			if confItem.ConfigValue == "" {
				resp.FailData("获取失败", "FICC品种分类配置为空", c)
				return
			}
			classifyArr := strings.Split(confItem.ConfigValue, ",")
			if len(classifyArr) == 0 {
				resp.FailData("获取失败", "FICC品种分类配置为空", c)
				return
			}

			// 获取FICC权限
			ficcCond := `enabled = 1 AND permission_type = 0 AND product_id = ? AND classify_name IN ?`
			ficcPars := make([]interface{}, 0)
			ficcPars = append(ficcPars, 1, classifyArr)
			items, e := crm.GetPermissionSetItemsByCondition(ficcCond, ficcPars)
			if e != nil {
				resp.FailData("获取失败", "获取FICC权限信息失败, Err: "+e.Error(), c)
				return
			}
			ficcItemMap := make(map[string][]*crm.PermissionSetItem, 0)
			for i := range items {
				if ficcItemMap[items[i].ClassifyName] == nil {
					ficcItemMap[items[i].ClassifyName] = make([]*crm.PermissionSetItem, 0)
				}
				ficcItemMap[items[i].ClassifyName] = append(ficcItemMap[items[i].ClassifyName], items[i])
			}

			for i := range classifyArr {
				if classifyArr[i] == "市场策略" {
					continue
				}
				checkList := make([]int, 0)
				if classifyArr[i] == "宏观经济" {
					checkList = append(checkList, 1)
				}

				pItem := fms.ContractServiceTemplateItem{
					ServiceTemplateId: 90000 + i*100,
					ProductId:         1,
					Pid:               v.ServiceTemplateId,
					ParentTitle:       v.Title,
					Title:             classifyArr[i],
				}

				childs := make([]*fms.ContractServiceTemplateMapItems, 0)
				ficcItems := ficcItemMap[classifyArr[i]]
				for _, ficcItem := range ficcItems {
					tempItem := fms.ContractServiceTemplateItem{
						ServiceTemplateId: pItem.ServiceTemplateId + ficcItem.ChartPermissionId,
						ProductId:         1,
						Pid:               pItem.ServiceTemplateId,
						ParentTitle:       pItem.Title,
						Title:             ficcItem.PermissionName,
						ChartPermissionId: ficcItem.ChartPermissionId,
					}
					newpItem := fms.ContractServiceTemplateMapItems{
						ContractServiceTemplateItem: tempItem,
					}
					childs = append(childs, &newpItem)
				}
				tempItem := fms.ContractServiceTemplateMapItems{
					ContractServiceTemplateItem: pItem,
					Children:                    childs,
				}

				v.Children = append(v.Children, &tempItem)
			}
		}

		allMap[item.ProductId] = append(allMap[item.ProductId], v)
	}
	allTitleMap := map[int]string{
		1: "FICC套餐",
		2: "权益套餐",
	}
	if productId == 0 {
		tmp1 := &fms.ContractServiceTemplateList{
			Title:    allTitleMap[1],
			Children: allMap[1],
		}
		tmp2 := &fms.ContractServiceTemplateList{
			Title:    allTitleMap[2],
			Children: allMap[2],
		}
		respList = append(respList, tmp1)
		respList = append(respList, tmp2)
	} else {
		tmp := &fms.ContractServiceTemplateList{
			Title:    allTitleMap[productId],
			Children: allMap[productId],
		}
		respList = append(respList, tmp)
	}
	resp.OkData("获取成功", respList, c)
}

// ServiceList
// @Title 合同套餐列表
// @Description 合同套餐列表
// @Param   ProductId  query  int  false  "套餐类型: 1-FICC(默认); 2-权益"
// @Success 200 {object} crm.ContractSearchListResp
// @router /contract/service/simple [get]
func (sr *ServiceController) SimpleList(c *gin.Context) {
	list, err := fms.GetContractServiceTemplateSecond()
	if err != nil {
		resp.FailData("获取失败", "获取产品套餐失败, Err: "+err.Error(), c)
		return
	}
	allList := make([]*fms.ContractServiceTemplateItem, 0)
	allMap := make(map[int][]*fms.ContractServiceTemplateMapItems)
	respList := make([]*fms.ContractServiceTemplateList, 0)
	for i := 0; i < len(list); i++ {
		if list[i].Title == "行业套餐" {
			industryList, e := fms.GetContractServiceTemplateMapByParentId(list[i].ServiceTemplateId)
			if e != nil {
				resp.FailData("获取失败", "Err:"+e.Error(), c)
				return
			}
			for _, sv := range industryList {
				allList = append(allList, sv)
			}
		} else {
			allList = append(allList, list[i])
		}
	}

	for i := 0; i < len(allList); i++ {
		item := allList[i]
		v := new(fms.ContractServiceTemplateMapItems)
		v.ContractServiceTemplateItem = *item
		allMap[item.ProductId] = append(allMap[item.ProductId], v)
	}
	allTitleMap := map[int]string{
		1: "FICC套餐",
		2: "权益套餐",
	}
	tmp1 := &fms.ContractServiceTemplateList{
		Title:    allTitleMap[1],
		Children: allMap[1],
	}
	tmp2 := &fms.ContractServiceTemplateList{
		Title:    allTitleMap[2],
		Children: allMap[2],
	}
	respList = append(respList, tmp1)
	respList = append(respList, tmp2)
	resp.OkData("获取成功", respList, c)
}