package controllers

import (
	"encoding/json"
	"eta/eta_api/models"
	"eta/eta_api/utils"
	"github.com/rdlucklib/rdluck_tools/paging"
	"strings"
	"time"
)

// ReportAuthorController 报告作者
type ReportAuthorController struct {
	BaseAuthController
}

// ReportAuthorCommonController 报告作者
type ReportAuthorCommonController struct {
	BaseCommonController
}

// Author
// @Title 获取报告作者接口
// @Description 获取报告作者
// @Param   AuthorType   query   int  true       "来源类型，1：中文，2：英文"
// @Param   Keyword   query   string  true       "搜索关键词"
// @Param   CurrentIndex   query   int  true       "当前页页码，从1开始"
// @Param   StartDate   query   string  true       "开始时间"
// @Success 200 {object} models.ReportAuthorResp
// @router /author [get]
func (this *ReportAuthorController) Author() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	//来源类型，1：中文，2：英文
	authorType := this.GetString("AuthorType", "1")
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")

	keyword := this.GetString("Keyword")

	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize50
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = utils.StartIndex(currentIndex, pageSize)
	var condition string
	var pars []interface{}
	condition += ` AND author_type = ? `
	pars = append(pars, authorType)

	if keyword != `` {
		condition += ` AND report_author like ? `
		pars = append(pars, utils.GetLikeKeyword(keyword))
	}

	total, items, err := models.GetReportAuthorList(condition, pars, startSize, pageSize)
	if err != nil {
		br.Msg = "获取失败！"
		br.ErrMsg = "获取失败，Err:" + err.Error()
		return
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp := models.ReportAuthorResp{
		List:   items,
		Paging: page,
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// AddAuthor
// @Title 新增报告作者接口
// @Description 新增报告作者接口
// @Param	request	body models.AddReportAuthorReq true "type json string"
// @Success 200 Ret=200 添加成功
// @router /author/add [post]
func (this *ReportAuthorController) AddAuthor() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.AddReportAuthorReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	authorName := strings.TrimSuffix(req.Author, " ")
	authorName = strings.TrimPrefix(authorName, " ")
	if authorName == `` {
		br.Msg = "请输入名称"
		br.ErrMsg = "请输入名称"
		br.IsSendEmail = false
		return
	}
	if req.AuthorType != 1 && req.AuthorType != 2 {
		br.Msg = "请选择类型"
		br.ErrMsg = "请选择类型"
		br.IsSendEmail = false
		return
	}
	item, err := models.GetReportAuthorByAuthor(authorName, req.AuthorType)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据异常！"
		br.ErrMsg = "获取数据异常，Err:" + err.Error()
		return
	}
	if item != nil {
		br.Msg = "已存在该作者"
		br.ErrMsg = "已存在该作者"
		br.IsSendEmail = false
		return
	}
	item = &models.ReportAuthor{
		Id:           0,
		ReportAuthor: req.Author,
		AuthorType:   req.AuthorType,
		Enable:       1,
		IsDelete:     0,
		CreateTime:   time.Now(),
		ModifyTime:   time.Now(),
	}
	authorId, err := models.AddReportAuthor(item)
	if err != nil {
		br.Msg = "添加作者失败！"
		br.ErrMsg = "添加作者失败，Err:" + err.Error()
		return
	}
	item.Id = int(authorId)

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

// EditAuthor
// @Title 编辑报告作者接口
// @Description 编辑报告作者接口
// @Param	request	body models.AddReportAuthorReq true "type json string"
// @Success 200 Ret=200 编辑成功
// @router /author/edit [post]
func (this *ReportAuthorController) EditAuthor() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.AddReportAuthorReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	authorName := strings.TrimSuffix(req.Author, " ")
	authorName = strings.TrimPrefix(authorName, " ")
	otherItem, err := models.GetReportAuthorByAuthorAndId(authorName, req.AuthorType, req.Id)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据异常！"
		br.ErrMsg = "获取数据异常，Err:" + err.Error()
		return
	}
	if otherItem != nil {
		br.Msg = "已存在该作者名称，请重新输入"
		br.ErrMsg = "已存在该作者名称，请重新输入"
		br.IsSendEmail = false
		return
	}

	item, err := models.GetReportAuthorById(req.Id)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据异常！"
		br.ErrMsg = "获取数据异常，Err:" + err.Error()
		return
	}
	if item == nil {
		br.Msg = "不存在该作者"
		br.ErrMsg = "不存在该作者"
		br.IsSendEmail = false
		return
	}
	//原名称
	oldAuthorName := item.ReportAuthor

	item.ReportAuthor = authorName
	item.ModifyTime = time.Now()
	err = item.Update([]string{"ReportAuthor", "ModifyTime"})
	if err != nil {
		br.Msg = "编辑作者失败！"
		br.ErrMsg = "编辑作者失败，Err:" + err.Error()
		return
	}

	// 更改原有报告中的名称
	{
		var condition string
		var pars []interface{}
		var count int
		condition = " AND author = ? "
		pars = append(pars, oldAuthorName)
		if item.AuthorType == 1 {
			count, err = models.ModifyReportAuthor(condition, pars, authorName)
		} else {
			count, err = models.ModifyEnglishReportAuthor(condition, pars, authorName)
		}
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取数据异常！"
			br.ErrMsg = "获取是否存在该作者的报告数据异常，Err:" + err.Error()
			return
		}
		if count > 0 {
			br.Msg = "该作者名称有关联报告，不可删除"
			br.ErrMsg = "该作者名称有关联报告，不可删除"
			br.IsSendEmail = false
			return
		}
	}

	br.Ret = 200
	br.Success = true
	br.IsAddLog = true
	br.Msg = "编辑成功"
}

// EnableAuthor
// @Title 禁用/启用报告作者接口
// @Description 禁用/启用报告作者接口
// @Param	request	body models.EnableReportAuthorReq true "type json string"
// @Success 200 Ret=200 启用成功
// @router /author/enable [post]
func (this *ReportAuthorController) EnableAuthor() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.EnableReportAuthorReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	item, err := models.GetReportAuthorById(req.Id)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据异常！"
		br.ErrMsg = "获取数据异常，Err:" + err.Error()
		return
	}
	if item == nil {
		br.Msg = "不存在该作者"
		br.ErrMsg = "不存在该作者"
		br.IsSendEmail = false
		return
	}

	// 剩余作者数
	{
		var condition string
		var pars []interface{}
		condition = " AND author_type = ?"
		pars = append(pars, item.AuthorType)
		total, err := models.GetReportAuthorCount(condition, pars)
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取数据异常！"
			br.ErrMsg = "获取剩余作者数据异常，Err:" + err.Error()
			return
		}
		if total <= 1 {
			br.Msg = "该作者名称为最后一个，不可禁用"
			br.ErrMsg = "该作者名称为最后一个，不可禁用"
			br.IsSendEmail = false
			return
		}
	}

	item.Enable = req.EnableType
	item.ModifyTime = time.Now()
	err = item.Update([]string{"Enable", "ModifyTime"})
	if err != nil {
		br.Msg = "操作失败！"
		br.ErrMsg = "操作失败，Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.IsAddLog = true
	br.Msg = "编辑成功"
}

// DeleteAuthor
// @Title 删除报告作者接口
// @Description 删除报告作者接口
// @Param	request	body models.AddReportAuthorReq true "type json string"
// @Success 200 Ret=200 启用成功
// @router /author/delete [post]
func (this *ReportAuthorController) DeleteAuthor() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.DeleteReportAuthorReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	item, err := models.GetReportAuthorById(req.Id)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据异常！"
		br.ErrMsg = "获取数据异常，Err:" + err.Error()
		return
	}
	if item == nil {
		br.Msg = "不存在该作者"
		br.ErrMsg = "不存在该作者"
		br.IsSendEmail = false
		return
	}

	// 剩余作者数
	{
		var condition string
		var pars []interface{}
		condition = " AND author_type = ?"
		pars = append(pars, item.AuthorType)
		total, err := models.GetReportAuthorCount(condition, pars)
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取数据异常！"
			br.ErrMsg = "获取剩余作者数据异常，Err:" + err.Error()
			return
		}
		if total <= 1 {
			br.Msg = "该作者名称为最后一个，不可删除"
			br.ErrMsg = "该作者名称为最后一个，不可删除"
			br.IsSendEmail = false
			return
		}
	}

	// 获取是否存在该作者的报告
	{
		var condition string
		var pars []interface{}
		var count int
		condition = " AND author = ? "
		pars = append(pars, item.ReportAuthor)
		if item.AuthorType == 1 {
			count, err = models.GetReportListCount(condition, pars, "")
		} else {
			count, err = models.GetEnglishReportListCount(condition, pars, "")
		}
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取数据异常！"
			br.ErrMsg = "获取是否存在该作者的报告数据异常，Err:" + err.Error()
			return
		}
		if count > 0 {
			br.Msg = "该作者名称有关联报告，不可删除"
			br.ErrMsg = "该作者名称有关联报告，不可删除"
			br.IsSendEmail = false
			return
		}
	}

	item.IsDelete = 1
	item.ModifyTime = time.Now()
	err = item.Update([]string{"IsDelete", "ModifyTime"})
	if err != nil {
		br.Msg = "操作失败！"
		br.ErrMsg = "操作失败，Err:" + err.Error()
		return
	}

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