package controllers

import (
	"encoding/json"
	"fmt"
	"hongze/hongze_cygx/models"
	"hongze/hongze_cygx/services"
	"hongze/hongze_cygx/utils"
	"rdluck_tools/paging"
	"strconv"
	"time"
)

//报告
type ReportController struct {
	BaseAuthController
}

type ReportCommonController struct {
	BaseCommonController
}

// @Title 行业报告分类列表接口
// @Description 获取行业报告分类列表接口
// @Param   ChartPermissionId   query   int  true       "分类ID"
// @Success 200 {object} models.IndustrialManagementList
// @router /home/tradeList [get]
func (this *ReportController) TradeList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	user := this.User
	if user == nil {
		br.Msg = "请重新登录"
		br.Ret = 408
		return
	}
	uid := user.UserId
	ChartPermissionId, _ := this.GetInt("ChartPermissionId")
	if ChartPermissionId < 1 {
		br.Msg = "请输入分类ID"
		return
	}
	fmt.Println(uid)
	list, err := models.GetTradeAll(ChartPermissionId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
		return
	}
	for k, v := range list {
		list[k].UpdateTime = utils.TimeRemoveHms(v.UpdateTime)
		count, err := models.CheckThisCategoryNewArticleIsRead(uid, v.CategoryId)
		if err != nil {
			br.Msg = "获取信息失败"
			br.Msg = "获取帖子总数失败,Err:" + err.Error()
			return
		}
		if count == 0 && user.CreatedTime.Before(utils.StrTimeToTime(v.UpdateTime)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(v.UpdateTime)) {
			list[k].IsRed = true
		}
	}
	resp := new(models.TradeReportMappingResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 产业报告分类列表接口
// @Description 获取产业报告分类列表接口
// @Param   ChartPermissionId   query   int  true       "分类ID"
// @Param   OrderColumn   query   int  true       "排序字段 ,NewTime 最近更新 ,Recommend弘则推荐"
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Success 200 {object} models.IndustrialManagementList
// @router /home/industryList [get]
func (this *ReportController) IndustryList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	user := this.User
	if user == nil {
		br.Msg = "请重新登录"
		br.Ret = 408
		return
	}
	uid := user.UserId
	var orderSrt string
	ChartPermissionId, _ := this.GetInt("ChartPermissionId")
	orderColumn := this.GetString("OrderColumn")
	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)
	resp := new(models.IndustrialManagementList)
	var total int
	var list []*models.IndustrialManagement
	totalTopList, errTop := models.GetIndustrialManagemenCountTop(ChartPermissionId, uid)
	totalTop := len(totalTopList)
	if errTop != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取品种信息失败,Err:" + errTop.Error()
		return
	}
	totalNoTopList, errNoTop := models.GetIndustrialManagemenCountNoTop(ChartPermissionId, uid)
	totalNoTop := len(totalNoTopList)
	if errNoTop != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取品种信息失败,Err:" + errNoTop.Error()
		return
	}
	total = totalTop + totalNoTop
	page := paging.GetPaging(currentIndex, pageSize, total)
	if orderColumn == "" {
		orderColumn = "NewTime"
	}
	if ChartPermissionId < 1 {
		br.Msg = "请输入分类ID"
		return
	}
	if orderColumn == "NewTime" {
		orderSrt = "update_time DESC"
	} else {
		orderSrt = "man.recommended_index DESC,update_time DESC"
	}
	fmt.Println(orderSrt)
	//全部都是置顶
	if totalTop >= currentIndex*pageSize {
		listTop, err := models.GetIndustrialManagementTopAll(ChartPermissionId, uid, startSize, pageSize)
		for k, _ := range listTop {
			listTop[k].IsTop = true
		}
		if err != nil {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
			return
		}
		list = listTop
	} else if totalTop < (currentIndex-1)*pageSize { //全部都是不置顶
		listNoTop, err := models.GetIndustrialManagementAll(ChartPermissionId, uid, orderSrt, startSize-totalTop, pageSize)
		if err != nil {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
			return
		}
		list = listNoTop
	} else { //部分置顶,部分不置顶
		listTop, err := models.GetIndustrialManagementTopAll(ChartPermissionId, uid, startSize, pageSize)
		if err != nil {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
			return
		}
		for k, _ := range listTop {
			listTop[k].IsTop = true
		}
		listNoTop, err := models.GetIndustrialManagementAll(ChartPermissionId, uid, orderSrt, 0, pageSize-len(listTop))
		if err != nil {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
			return
		}
		list = append(listTop, listNoTop...)
	}
	for k, v := range list {
		//var analystStr string
		//analystList, err := models.GetIndustrialAnalystAll(v.IndustrialManagementId)
		//if err != nil {
		//	br.Msg = "获取信息失败"
		//	br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
		//	return
		//}
		industrialSubjectList, err := models.GetIndustrialSubjectAll(v.IndustrialManagementId)
		if err != nil {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
			return
		}
		list[k].IndustrialSubjectList = industrialSubjectList
		//if len(analystList) > 0 {
		//	for _, v2 := range analystList {
		//		analystStr += v2.AnalystName + "/"
		//	}
		//	analystStr = strings.TrimRight(analystStr, "/")
		//}
		//list[k].Analyst = analystStr
		list[k].LayoutTime = utils.TimeRemoveHms(v.LayoutTime)
		newArtinfo, err := models.GetIndustrialNewArticleDetail(v.IndustrialManagementId)
		if err != nil {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
			return
		}
		list[k].UpdateTime = utils.TimeRemoveHms(newArtinfo.PublishDate)
		recordCount, err := models.GetUserToArticleCount(uid, newArtinfo.ArticleId)
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取信息失败"
			br.ErrMsg = "获取信息失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(newArtinfo.ArticleId)
			return
		}
		//
		if recordCount == 0 && user.CreatedTime.Before(utils.StrTimeToTime(newArtinfo.PublishDate)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(newArtinfo.PublishDate)) {
			list[k].IsRed = true
		}
	}
	resp.List = list
	resp.Paging = page
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 产业下所关联的文章分类列表
// @Description 产业下所关联的文章分类列表接口
// @Param   IndustrialManagementId   query   int  true       "产业ID"
// @Success 200 {object} models.IndustrialToArticleCategoryListRep
// @router /toArticleCategoryList [get]
func (this *ReportController) ArticleCategoryList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	user := this.User
	if user == nil {
		br.Msg = "请重新登录"
		br.Ret = 408
		return
	}
	uid := user.UserId
	industrialManagementId, _ := this.GetInt("IndustrialManagementId")
	if industrialManagementId < 1 {
		br.Msg = "请输入分类ID"
		return
	}
	list, err := models.IndustrialToArticleCategory(industrialManagementId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
		return
	}

	for k, v := range list {
		recordCount, err := models.IndustrialUserRecordArticleCount(uid, industrialManagementId, v.CategoryId)
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取信息失败"
			br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
			return
		}
		if recordCount == 0 {
			list[k].IsRed = true
		}
	}
	detail, err := models.GetIndustrialManagementDetail(industrialManagementId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	resp := new(models.IndustrialToArticleCategoryListRep)
	resp.List = list
	resp.LayoutTime = utils.TimeRemoveHms(detail.LayoutTime)
	resp.IndustryName = detail.IndustryName
	resp.IndustrialManagementId = industrialManagementId
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 产业文章列表接口
// @Description 获取产业文章列表接口
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Param   CategoryId   query   int  true       "分类ID"
// @Param   IndustrialManagementId   query   int  true       "产业ID"
// @Success 200 {object} models.TacticsListResp
// @router /industry/ArticleList [get]
func (this *ReportController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	user := this.User
	if user == nil {
		br.Msg = "请重新登录"
		br.Ret = 408
		return
	}
	uid := user.UserId
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	categoryId, _ := this.GetInt("CategoryId")
	industrialManagementId, _ := this.GetInt("IndustrialManagementId")

	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = paging.StartIndex(currentIndex, pageSize)
	var pars []interface{}
	var total int
	resp := new(models.TacticsListResp)
	page := paging.GetPaging(currentIndex, pageSize, total)

	if categoryId < 1 {
		br.Msg = "请输入分类ID"
		return
	}
	if industrialManagementId < 1 {
		br.Msg = "请输入产业ID"
		return
	}

	total, err := models.GetReportIndustrialCount(categoryId, industrialManagementId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取帖子总数失败,Err:" + err.Error()
		return
	}
	page = paging.GetPaging(currentIndex, pageSize, total)
	list, err := models.GetReportIndustrialList(pars, categoryId, industrialManagementId, uid, startSize, pageSize)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取帖子数据失败,Err:" + err.Error()
		return
	}
	lenList := len(list)
	for i := 0; i < lenList; i++ {
		item := list[i]
		list[i].Body, _ = services.GetReportContentTextSub(item.Body)
		//list[i].Abstract = html.UnescapeString(item.Abstract)
		list[i].Abstract, _ = services.GetReportContentTextSub(item.Abstract)
	}

	for k, v := range list {
		if v.Readnum == 0 && user.CreatedTime.Before(utils.StrTimeToTime(v.PublishDate)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(v.PublishDate)) {
			list[k].IsRed = true
		}
	}
	resp.List = list
	resp.Paging = page
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 置顶/取消置顶
// @Description 置顶
// @Param	request	body models.CygxIndustryTopRep true "type json string"
// @Success 200
// @router /top [post]
func (this *ReportController) ArticleCollect() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	user := this.User
	if user == nil {
		br.Msg = "请重新登录"
		br.Ret = 408
		return
	}
	uid := user.UserId
	var req models.CygxIndustryTopRep
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	industrialManagementId := req.IndustrialManagementId
	fmt.Println(industrialManagementId)
	countIndustrial, err := models.GetIndustrialManagementCount(industrialManagementId)
	if err != nil {
		br.Msg = "获取数据失败!"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	if countIndustrial == 0 {
		br.Msg = "产业不存在!"
		br.ErrMsg = "产业不存在"
		return
	}
	count, err := models.GetCygxIndustryTop(uid, industrialManagementId)
	if err != nil {
		br.Msg = "获取数据失败!"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	resp := new(models.ArticleCollectResp)
	if count <= 0 {
		item := new(models.CygxIndustryTop)
		item.IndustrialManagementId = req.IndustrialManagementId
		item.UserId = uid
		item.CreateTime = time.Now()
		_, err = models.AddCygxIndustryTop(item)
		if err != nil {
			br.Msg = "置顶失败"
			br.ErrMsg = "置顶失败,Err:" + err.Error()
			return
		}
		br.Msg = "置顶成功"
		resp.Status = 1
	} else {
		err = models.RemoveCygxIndustryTop(uid, industrialManagementId)
		if err != nil {
			br.Msg = "取消置顶失败"
			br.ErrMsg = "取消置顶失败,Err:" + err.Error()
			return
		}
		br.Msg = "已取消置顶"
		resp.Status = 2
	}
	br.Ret = 200
	br.Success = true
	br.Data = resp
}