package controllers

import (
	"encoding/json"
	"fmt"
	"hongze/hongze_mobile_admin/models/response/message"
	"hongze/hongze_mobile_admin/models/tables/company_approval"
	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
	"hongze/hongze_mobile_admin/models/tables/contract_approval"
	"hongze/hongze_mobile_admin/utils"
	"rdluck_tools/paging"
	"strconv"
	"strings"
)

//消息模块
type MessageCommon struct {
	BaseAuth
}

// @Title 消息列表汇总页
// @Description 消息列表汇总页接口
// @Success 200 {object} message.SummaryMessageListResp
// @router /summaryMessageList [get]
func (this *MessageCommon) SummaryMessageList() {
	sysUser := this.AdminWx
	sysUserId := sysUser.AdminId

	SummaryMessageListResp := message.SummaryMessageListResp{}
	sourceTypeList := [...]int{1, 2, 3}
	for _, sourceType := range sourceTypeList {
		//最近一条消息
		tmpMessage := ``
		messageInfo, err := company_approval_message.GetLastMessage(sysUserId, sourceType)
		if err != nil {
			if err.Error() != utils.ErrNoRow() {
				this.FailWithMessage("获取失败", "获取消息失败,Err:"+err.Error())
				return
			}
		} else {
			tmpMessage = fmt.Sprint(messageInfo.RealName, messageInfo.CreateTime, messageInfo.Content)
		}

		notReadTotal, err := company_approval_message.GetNotReadMessageTotal(sysUserId, sourceType)
		if err != nil {
			this.FailWithMessage("获取失败", "获取未读消息数失败,Err:"+err.Error())
			return
		}
		switch sourceType {
		case 1:
			SummaryMessageListResp.CompanyMessage.Message = tmpMessage
			SummaryMessageListResp.CompanyMessage.Total = int(notReadTotal)
		case 2:
			SummaryMessageListResp.ContractMessage.Message = tmpMessage
			SummaryMessageListResp.ContractMessage.Total = int(notReadTotal)
		case 3:
			SummaryMessageListResp.SealMessage.Message = tmpMessage
			SummaryMessageListResp.SealMessage.Total = int(notReadTotal)
		}
	}

	this.OkDetailed(SummaryMessageListResp, "获取成功")
}

// @Title 消息列表
// @Description 消息列表接口
// @Param   SourceType   query   int  true       "消息类型"
// @Param   CurrentIndex   query   int  true       "当前页码"
// @Param   pageSize   query   int  true       "每页数量"
// @Success 200 {object} message.CompanyApprovalMessageListResp
// @router /list [get]
func (this *MessageCommon) MessageList() {
	sysUser := this.AdminWx
	sysUserId := sysUser.AdminId
	sourceType, err := this.GetInt("SourceType", 1)
	if err != nil {
		this.FailWithMessage("获取失败", "获取消息类型失败,Err:"+err.Error())
		return
	}
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")

	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = paging.StartIndex(currentIndex, pageSize)

	total, err := company_approval_message.GetCompanyApprovalMessageCount(sysUserId, sourceType)
	if err != nil {
		this.FailWithMessage("获取失败", "获取消息总数失败,Err:"+err.Error())
		return
	}
	list, err := company_approval_message.GetCompanyApprovalMessageList(sysUserId, sourceType, startSize, pageSize)
	if err != nil {
		this.FailWithMessage("获取失败", "获取消息列表失败,Err:"+err.Error())
		return
	}

	companyApprovalIds := make([]string, 0)
	newApprovalIds := make([]string, 0)
	companyApprovalMap := make(map[int]*company_approval.CompanyApproval)
	newApprovalMap := make(map[int]*contract_approval.ContractApproval)
	for _, message := range list {
		if message.SourceType == 1 {
			companyApprovalIds = append(companyApprovalIds, strconv.Itoa(message.CompanyApprovalId))
		} else {
			//如果不是文字消息
			if message.MessageType != 3 {
				newApprovalIds = append(newApprovalIds, strconv.Itoa(message.CompanyApprovalId))
			}
		}
	}
	//客户信息
	if len(companyApprovalIds) > 0 {
		companyApprovalList, err := company_approval.GetApprovalListByApprovalIds(strings.Join(companyApprovalIds, ","))
		if err != nil {
			this.FailWithMessage("获取失败", "获取申请列表信息失败,Err:"+err.Error())
		}
		for _, companyApproval := range companyApprovalList {
			companyApprovalMap[companyApproval.CompanyApprovalId] = companyApproval
		}
	}
	//新的审批单信息
	if len(newApprovalIds) > 0 {
		contractApprovalList, err := contract_approval.GetContractApprovalByIds(strings.Join(newApprovalIds, ","))
		if err != nil {
			this.FailWithMessage("获取失败", "获取申请列表信息失败,Err:"+err.Error())
		}
		for _, contractApproval := range contractApprovalList {
			newApprovalMap[contractApproval.ContractApprovalId] = contractApproval
		}
	}

	for _, message := range list {
		approvalInfo := company_approval_message.ApprovalInfo{}
		if message.SourceType == 1 {
			if companyApproval, ok := companyApprovalMap[message.CompanyApprovalId]; ok {
				switch companyApproval.ApplyMethod {
				case 1:
					approvalInfo.Type = "申请转正"
				case 2:
					approvalInfo.Type = "冻结转试用"
				case 3:
					approvalInfo.Type = "流失转正式"
				case 4:
					approvalInfo.Type = "申请延期"
				case 5:
					approvalInfo.Type = "原销售申请领取流失客户"
				case 6:
					approvalInfo.Type = "服务更新"
				}
				approvalInfo.ApplyName = companyApproval.ApplyRealName
				approvalInfo.ApplyTime = companyApproval.CreateTime.Format(utils.FormatDateTime)
				approvalInfo.ApprovalTime = companyApproval.ApproveTime.Format(utils.FormatDateTime)
			}
		} else {
			if message.MessageType != 3 {
				if newApproval, ok := newApprovalMap[message.CompanyApprovalId]; ok {
					approvalInfo.Type = newApproval.ApplyContent
					approvalInfo.ApplyName = newApproval.ApplyUserName
					approvalInfo.ApplyTime = newApproval.CreateTime.Format(utils.FormatDateTime)
					approvalInfo.ApprovalTime = newApproval.ModifyTime.Format(utils.FormatDateTime)
				}
			}
		}
		message.ApprovalInfo = approvalInfo
	}
	//
	resp := message.CompanyApprovalMessageListResp{
		List:  list,
		Total: total,
	}
	this.OkDetailed(resp, "获取成功")
}

// @Title 消息已读
// @Description 消息已读接口
// @Param	request	body company.CompanyApprovalMessageReadReq true "type json string"
// @Success Ret=200 申请成功
// @router /read [post]
func (this *MessageCommon) MessageRead() {
	//sysUser := this.AdminWx
	var req company_approval_message.CompanyApprovalMessageReadReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		this.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())

		return
	}
	if req.Id <= 0 {
		this.FailWithMessage("参数错误", "参数错误,客户id小于等于0")
		return
	}
	err = company_approval_message.ModifyCompanyApprovalMessageStatus(req.Id)
	if err != nil {
		this.FailWithMessage("修改失败!", "修改已读失败,Err:"+err.Error())
		return
	}
	this.OkWithMessage("已读成功")
}