package controllers

import (
	"encoding/json"
	"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.Parse("2006-01-02", param.CreateTimeBeginS)
	if err == nil && len(param.CreateTimeBeginS) > 0 {
		param.CreateTimeBegin = beginTime.Unix()
	}
	endTime, err := time.Parse("2006-01-02", param.CreateTimeEndS)
	if err == nil && len(param.CreateTimeEndS) > 0 {
		param.CreateTimeEnd = endTime.Unix() + 864399
	}

	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)
	data := map[string]interface{}{
		"template":      templatelist,
		"chance_type":   chanceTypeList,
		"public_status": publicStatus,
		"enable_status": Status,
		"review_status": reviewStatus,
		"department":    departmentList,
		"permission":    auditPermission,
	}
	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
}