package english_report

import (
	"encoding/json"
	"eta/eta_api/controllers"
	"eta/eta_api/models"
	"eta/eta_api/models/company"
	"eta/eta_api/services"
	"eta/eta_api/utils"
	"github.com/rdlucklib/rdluck_tools/paging"
	"strconv"
	"strings"
)

// EnglishVideoController 英文研报-线上路演
type EnglishVideoController struct {
	controllers.BaseAuthController
}

// CoverList
// @Title 封面库列表
// @Description 封面库
// @Param   PageSize		query  int  false  "每页数据量"
// @Param   CurrentIndex	query  int  false  "页码"
// @Success 200 {object} models.EnglishVideoCoverListResp
// @router /video/cover/list [get]
func (this *EnglishVideoController) CoverList() {
	br := new(models.BaseResponse).Init()
	br.IsSendEmail = false
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}

	condition := ""
	pars := make([]interface{}, 0)

	var startSize int
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = paging.StartIndex(currentIndex, pageSize)
	total, resp, err := services.GetEnglishVideoCoverList(condition, pars, "", startSize, pageSize)
	if err != nil {
		br.Msg = "获取封面库列表失败"
		br.ErrMsg = "GetEnglishVideoCoverList ErrMsg:" + err.Error()
		return
	}

	page := paging.GetPaging(currentIndex, pageSize, total)
	resp.Paging = page
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// CoverSave
// @Title 保存封面图
// @Description 保存封面图
// @Param	request  body  request.EnglishVideoCoverSaveReq  true  "type json string"
// @Success 200 string "操作成功"
// @router /video/cover/save [post]
func (this *EnglishVideoController) CoverSave() {
	br := new(models.BaseResponse).Init()
	br.IsSendEmail = false
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req models.EnglishVideoCoverSaveReq
	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.CoverName == "" {
		br.Msg = "请输入封面名称"
		return
	}
	if req.CoverUrl == "" {
		br.Msg = "请上传封面图"
		return
	}

	data, errMsg, err := services.SaveEnglishVideoCover(req.Id, req.CoverName, req.CoverUrl)
	if err != nil {
		br.Msg = errMsg
		br.ErrMsg = "SaveEnglishVideoCover ErrMsg:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.Data = data
}

// CoverDelete
// @Title 删除封面图
// @Description 删除封面图
// @Param	request  body  models.EnglishVideoCoverOptionReq  true  "type json string"
// @Success 200 string "操作成功"
// @router /video/cover/delete [post]
func (this *EnglishVideoController) CoverDelete() {
	br := new(models.BaseResponse).Init()
	br.IsSendEmail = false
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req models.EnglishVideoCoverOptionReq
	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.Id <= 0 {
		br.Msg = "参数有误"
		return
	}
	errMsg, err := services.SoftDeleteEnglishVideoCover(req.Id)
	if err != nil {
		br.Msg = errMsg
		br.ErrMsg = "SoftDeleteEnglishVideoCover ErrMsg:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// @Title 新增/编辑路演视频
// @Description 新增/编辑路演视频
// @Param	request	body models.SaveEnglishVideoReq true "type json string"
// @Success 200 {object} models.SaveEnglishVideoResp
// @router /video/save [post]
func (this *EnglishVideoController) Save() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req models.SaveEnglishVideoReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.Title == "" {
		br.Msg = "请输入标题"
		return
	}
	if req.ClassifyIdFirst <= 0 {
		br.Msg = "请输入一级分类"
		return
	}
	if req.ClassifyIdSecond <= 0 {
		br.Msg = "请选择二级分类"
		return
	}
	if req.VideoUrl == "" {
		br.Msg = "请输入视频地址"
		return
	}
	if req.VideoCoverUrl == "" {
		br.Msg = "请输入视频封面地址"
		return
	}
	if req.VideoSeconds == "" {
		br.Msg = "请输入视频时长"
		return
	}
	if req.Overview == "" {
		br.Msg = "请输入overview"
		return
	}
	if req.Abstract == "" {
		br.Msg = "请输入摘要"
		return
	}
	id, videoCode, err, errMsg := services.SaveEnglishVideo(req, sysUser)
	if err != nil {
		br.Msg = err.Error()
		br.ErrMsg = errMsg
		return
	}
	resp := new(models.SaveEnglishVideoResp)
	resp.Id = id
	resp.VideoCode = videoCode
	br.Ret = 200
	br.Success = true
	br.Msg = "保存成功"
	br.Data = resp
}

// @Title 获取路演视频详情接口
// @Description 获取路演视频详情接口
// @Param	request	body models.ReportDetailReq true "type json string"
// @Success 200 {object} models.EnglishVideoDetailView
// @router /video/detail [get]
func (this *EnglishVideoController) Detail() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	id, err := this.GetInt("Id")
	if err != nil {
		br.Msg = "获取参数失败!"
		br.ErrMsg = "获取参数失败,Err:" + err.Error()
		return
	}
	if id <= 0 {
		br.Msg = "请选择路演视频记录"
		return
	}
	item, err := models.GetEnglishVideoById(id)
	if err != nil {
		if utils.IsErrNoRow(err) {
			br.Msg = "路演视频不存在"
			return
		}
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = item
}

// @Title 获取报告列表接口
// @Description 获取报告列表
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Param   KeyWord   query   string  true       "搜索关键词"
// @Success 200 {object} models.ReportListResp
// @router /video/list [get]
func (this *EnglishVideoController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}

	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")

	keyWord := this.GetString("KeyWord")

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

	var condition string
	var pars []interface{}

	if keyWord != "" {
		condition += ` AND title LIKE '%` + keyWord + `%' `
	}

	total, err := models.GetEnglishVideoListCount(condition, pars)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	list, err := models.GetEnglishVideoList(condition, pars, startSize, pageSize)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}

	// todo 获取邮件配置-是否有权限群发
	conf := new(models.EnglishReportEmailConf)
	authKey := "english_report_email_conf"
	confAuth, e := company.GetConfigDetailByCode(authKey)
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取群发邮件权限失败, Err: " + e.Error()
		return
	}
	if confAuth.ConfigValue == "" {
		br.Msg = "获取失败"
		br.ErrMsg = "群发邮件配置为空"
		return
	}
	if e := json.Unmarshal([]byte(confAuth.ConfigValue), &conf); e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "群发邮件配置有误"
		return
	}
	authOk := false
	authArr := strings.Split(conf.SendAuthGroup, ",")
	if utils.InArrayByStr(authArr, sysUser.RoleTypeCode) {
		authOk = true
	}

	// todo 是否有群发邮件失败的记录,标记红点
	failList, e := models.GetEnglishReportEmailLogFailList(1)
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取群发邮件记录失败, Err: " + e.Error()
		return
	}
	failMap := make(map[int]bool, 0)
	for i := range failList {
		failMap[failList[i].ReportId] = true
	}

	for _, item := range list {
		if item.State == 2 {
			//列表中展示分享地址
			//item.ShareUrl = "https://share.hzinsights.com/reportEn?code=" + item.ReportCode
		}
		item.EmailAuth = authOk
		if c, ok := failMap[item.Id]; ok {
			item.EmailHasFail = c
		}

		// 邮箱PV大于0的时候, 不展示最初版本的PV
		if item.PvEmail > 0 {
			item.Pv = 0
		}
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp := new(models.EnglishVideoListResp)
	resp.Paging = page
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 发布报告接口
// @Description 发布报告
// @Param	request	body models.EnglishVideoReq true "type json string"
// @Success 200 Ret=200 发布成功
// @router /video/publish [post]
func (this *EnglishVideoController) PublishVideo() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.EnglishVideoReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	id := req.Id
	if id <= 0 {
		br.Msg = "请选择要发布的路演视频"
		return
	}
	videoInfo, err := models.GetEnglishVideoById(id)
	if err != nil {
		if utils.IsErrNoRow(err) {
			br.Msg = "路演视频不存在"
			return
		}
		br.Msg = "获取路演视频失败"
		br.ErrMsg = "获取路演视频失败,Err:" + err.Error()
		return
	}

	var tmpErr error

	if videoInfo.VideoUrl == "" {
		br.Msg = "视频地址为空,不可发布"
		br.ErrMsg = "视频地址为空,不需要生成, id:" + strconv.Itoa(videoInfo.Id)
		return
	}

	if videoInfo.Title == "" {
		br.Msg = "标题为空,不可发布"
		br.ErrMsg = "标题为空,不需要生成, id:" + strconv.Itoa(videoInfo.Id)
		return
	}
	if videoInfo.State == 2 {
		br.Msg = "已发布,无需重复发布"
		return
	}
	if tmpErr = models.PublishEnglishVideoById(videoInfo.Id); tmpErr != nil {
		br.Msg = "路演视频发布失败"
		br.ErrMsg = "路演视频发布失败, Err:" + tmpErr.Error() + ", id:" + strconv.Itoa(videoInfo.Id)
		return
	}
	// 路演视频搜索
	go func() {
		_ = services.UpdateEnglishVideoEs(videoInfo.Id, 2)
	}()

	br.Ret = 200
	br.Success = true
	br.Msg = "发布成功"
}

// @Title 取消发布报告接口
// @Description 取消发布报告
// @Param	request	body models.EnglishVideoReq true "type json string"
// @Success 200 Ret=200 取消发布成功
// @router /video/publish/cancel [post]
func (this *EnglishVideoController) PublishCancleVideo() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.EnglishVideoReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.Id <= 0 {
		br.Msg = "参数错误"
		br.ErrMsg = "参数错误,路演视频id不可为空"
		return
	}
	videoInfo, err := models.GetEnglishVideoById(req.Id)
	if err != nil {
		if utils.IsErrNoRow(err) {
			br.Msg = "路演视频不存在"
			return
		}
		br.Msg = "获取路演视频失败"
		br.ErrMsg = "获取路演视频失败,Err:" + err.Error()
		return
	}

	if videoInfo.State == 1 {
		br.Msg = "已取消发布,无需重复取消"
		return
	}
	err = models.PublishCancelEnglishVideo(req.Id)
	if err != nil {
		br.Msg = "取消发布失败"
		br.ErrMsg = "取消发布失败,Err:" + err.Error()
		return
	}
	// 更新es里的报告状态
	go func() {
		_ = services.UpdateEnglishVideoEs(videoInfo.Id, 1)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "取消发布成功"
}

// @Title 删除路演视频接口
// @Description 删除路演视频
// @Param	request	body models.EnglishVideoReq true "type json string"
// @Success 200 Ret=200 删除成功
// @router /video/delete [post]
func (this *EnglishVideoController) Delete() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.EnglishVideoReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.Id <= 0 {
		br.Msg = "请选择要发布的路演视频"
		return
	}
	videoInfo, err := models.GetEnglishVideoById(req.Id)
	if err != nil {
		if utils.IsErrNoRow(err) {
			br.Msg = "路演视频不存在"
			return
		}
		br.Msg = "获取路演视频失败"
		br.ErrMsg = "获取路演视频失败,Err:" + err.Error()
		return
	}
	// 更新es里的路演视频状态
	_ = services.UpdateEnglishVideoEs(videoInfo.Id, 1)
	if videoInfo.State == 2 {
		br.Msg = "路演视频已发布,不可删除"
		return
	}
	if err = models.DeleteEnglishVideo(req.Id); err != nil {
		br.Msg = "删除失败"
		br.ErrMsg = "删除路演视频失败, Err: " + err.Error()
		return
	}

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