package controllers

import (
	"encoding/json"
	"fmt"
	"oppmg/common/log"
	"oppmg/models"
	"oppmg/protocol"
	serveaudit "oppmg/services/audit"
	servecommon "oppmg/services/common"
	serverbac "oppmg/services/rbac"
	"strconv"
	"time"
)

type AuditController struct {
	BaseController
}

//AuditList 机会管理列表
//@router /v1/audit/list [post]
func (c *AuditController) AuditList() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	var param protocol.RequestAuditList
	param.Status = -1
	param.ReviewStatus = -1
	param.PublishStatus = -1
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	beginTime, err := time.ParseInLocation("2006-01-02", param.CreateTimeBeginS, time.Local)
	if err == nil && len(param.CreateTimeBeginS) > 0 {
		param.CreateTimeBegin = beginTime.Unix()
	}
	endTime, err := time.ParseInLocation("2006-01-02", param.CreateTimeEndS, time.Local)
	if err == nil && len(param.CreateTimeEndS) > 0 {
		param.CreateTimeEnd = endTime.Unix() + 86399
	}
	fmt.Println(err, param.CreateTimeBegin, param.CreateTimeEnd)
	if len(param.StatusS) > 0 {
		param.Status, _ = strconv.Atoi(param.StatusS)
	}
	if len(param.ReviewStatusS) > 0 {
		param.ReviewStatus, _ = strconv.Atoi(param.ReviewStatusS)
	}
	if len(param.PublishStatusS) > 0 {
		param.PublishStatus, _ = strconv.Atoi(param.PublishStatusS)
	}
	uid := c.GetUserId()
	companyId := c.GetCompanyId()
	list, err := serveaudit.GetAuditList(param, companyId, uid)
	msg = protocol.NewPageDataResponse(list, err)
	return
}

//AuditListBefore
//@router /v1/audit/list/before
func (c *AuditController) AuditListBefore() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	uid := c.GetUserId()
	companyId := c.GetCompanyId()
	templatelist := servecommon.SelectGetTemplateList(companyId)
	chanceTypeList := servecommon.SeleteGetChanceTypeList(companyId)
	departmentList := servecommon.SelectorDepartment(companyId, -1)
	publicStatus := models.ChancePublishStatusMap
	Status := models.ChanceStatusMap
	reviewStatus := models.ChanceReviewStatusMap
	var (
		auditPermission serverbac.OptionOpportunity
	)
	auditPermission = serveaudit.GetPermissionInAuditPage(uid, companyId)
	reserveType := serveaudit.GetChanceReserveTypeAll(companyId)
	data := map[string]interface{}{
		"template":      templatelist,
		"chance_type":   chanceTypeList,
		"public_status": publicStatus,
		"enable_status": Status,
		"review_status": reviewStatus,
		"department":    departmentList,
		"permission":    auditPermission,
		"store_type": map[string]string{
			"-1": "全部",
			"0":  "机会池",
			"1":  "储备池",
		},
		"reserve_type": reserveType,
	}
	msg = protocol.NewReturnResponse(data, nil)
	return
}

//AuditInfo 获取机会详情
//@router /v1/audit/info
func (c *AuditController) AuditInfo() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		ChanceId string `json:"chance_id"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	chanceid, err := strconv.ParseInt(param.ChanceId, 10, 64)
	companyId := c.GetCompanyId()
	list, err := serveaudit.GetChanceDetail(chanceid, companyId)
	msg = protocol.NewReturnResponse(list, err)
	return
}

//AllowForbidAudit 开启、关闭 机会
//@router /v1/audit/allow_forbid
func (c *AuditController) AllowForbidAudit() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		ChanceId string `json:"chance_id"`
		Status   int    `json:"status"` //[1:开启机会][2:关闭机会]
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	chanceid, _ := strconv.ParseInt(param.ChanceId, 10, 64)
	companyId := c.GetCompanyId()
	var err error
	switch param.Status {
	case 1:
		err = serveaudit.AllowChanceEnableStatus(chanceid, companyId)
	case 2:
		err = serveaudit.ForbidChanceEnableStatus(chanceid, companyId)
	}
	msg = protocol.NewReturnResponse(nil, err)
	return
}

//GetChanceReviseLog
//@router /v1/audit/revise/info
func (c *AuditController) GetChanceReviseLog() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		FlowLogId int64  `json:"flow_log_id"`
		ChanceId  string `json:"chance_id"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	chanceId, _ := strconv.ParseInt(param.ChanceId, 10, 64)
	companyId := c.GetCompanyId()
	rspData, err := serveaudit.GetChanceReviseLog(param.FlowLogId, chanceId, companyId)
	msg = protocol.NewReturnResponse(rspData, err)
	return
}

//GetChanceCheckResultList 获取机会的自查内容的筛选结果列表
//@router /v1/audit/check_result/list
func (c *AuditController) GetChanceCheckResultList() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		protocol.RequestPageInfo
		CheckResultStatus int8 `json:"check_result_status"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	companyId := c.GetCompanyId()
	rspData := serveaudit.GetChanceCheckResultList(param.PageIndex, param.PageSize, companyId, param.CheckResultStatus)
	msg = protocol.NewPageDataResponse(rspData, nil)
	return
}

//GetChanceCheckResultInfo 获取机会的自查内容的筛选结果详情
//@router /v1/audit/check_result/info
func (c *AuditController) GetChanceCheckResultInfo() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		ChanceId string `json:"chance_id"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	chanceId, _ := strconv.ParseInt(param.ChanceId, 10, 64)
	companyId := c.GetCompanyId()
	rspData, err := serveaudit.GetChanceCheckResultInfo(chanceId, companyId)
	msg = protocol.NewReturnResponse(rspData, err)
	return
}

//GetChanceCheckResultInfo 获取机会的自查内容的筛选结果详情
//@router /v1/audit/check_result/pass_or_no
func (c *AuditController) ChanceCheckResultPassOrNo() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		ChanceId string `json:"chance_id"`
		Status   int    `json:"status"` //【1:通过】【2:不通过】
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	chanceId, _ := strconv.ParseInt(param.ChanceId, 10, 64)
	companyId := c.GetCompanyId()
	var err error
	switch param.Status {
	case 1:
		err = serveaudit.ChanceCheckResultPass(chanceId, companyId)
	case 2:
		err = serveaudit.ChanceCheckResultNoPass(chanceId, companyId)
	}
	msg = protocol.NewReturnResponse(nil, err)
	return
}

//ChanceReserveTypeList 获取机会储备池分类类型
//@router /v1/chance/reserve_type/list
func (c *AuditController) ChanceReserveTypeList() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		protocol.RequestPageInfo
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	companyId := c.GetCompanyId()
	list := serveaudit.GetReserveTypeLsit(param.PageIndex, param.PageSize, companyId)
	msg = protocol.NewReturnResponse(list, nil)
	return
}

//EditReserveType 编辑机会储备池分类类型
//@router /v1/chance/reserve_type/edit
func (c *AuditController) EditReserveType() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		Id   int    `json:"id"`
		Name string `json:"name"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	nameRune := []rune(param.Name)
	if len(nameRune) == 0 {
		msg = protocol.BadRequestParam("10133")
		return
	}
	if len(nameRune) > 20 {
		msg = protocol.BadRequestParam("10134")
		return
	}
	companyId := c.GetCompanyId()
	var err error
	if param.Id == 0 {
		err = serveaudit.AddReserveType(param.Name, companyId)
	} else {
		err = serveaudit.EditReserveType(param.Id, param.Name, companyId)
	}
	msg = protocol.NewReturnResponse(nil, err)
	return
}

//DeleteReserveType 删除机会储备池分类类型
//@router /v1/chance/reserve_type/delete
func (c *AuditController) DeleteReserveType() {
	var msg *protocol.ResponseMessage
	defer func() {
		c.ResposeJson(msg)
	}()
	type Parameter struct {
		Id int `json:"id"`
	}
	var param Parameter
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &param); err != nil {
		log.Error("json 解析失败", err)
		msg = protocol.BadRequestParam("1")
		return
	}
	companyId := c.GetCompanyId()
	err := serveaudit.DeleteReserveType(param.Id, companyId)
	msg = protocol.NewReturnResponse(nil, err)
	return
}