package user

import (
	"eta/eta_mini_ht_api/common/exception"
	"eta/eta_mini_ht_api/common/utils/page"
	"eta/eta_mini_ht_api/controllers"
	"eta/eta_mini_ht_api/service/analyst"
	"eta/eta_mini_ht_api/service/media"
	"eta/eta_mini_ht_api/service/report"
	"eta/eta_mini_ht_api/service/user"
)

type AnalystController struct {
	controllers.ListController
}

// AnalystList  研究员列表
// @Summary 研究员列表
// @Description 研究员列表
// @Success 200 {object} controllers.BaseResponse
// @router /list [get]
func (an *AnalystController) AnalystList() {
	controllers.Wrap(&an.BaseController, func() (result *controllers.WrapData, err error) {
		result = an.InitWrapData("获取研究员列表失败")
		var userInfo user.User
		userInfo = an.Data["user"].(user.User)
		pageRes := page.Page{
			Current:  an.PageInfo.Current,
			PageSize: an.PageInfo.PageSize,
		}
		if an.PageInfo.LatestId == 0 {
			pageRes.Total, pageRes.LatestId = analyst.GetAnalystCount()
			an.PageInfo.LatestId = pageRes.LatestId
			an.PageInfo.Total = pageRes.Total
		} else {
			pageRes.LatestId = an.PageInfo.LatestId
			pageRes.Total = an.PageInfo.Total
		}
		an.PageInfo.Total = pageRes.Total
		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
		list, err := analyst.GetAnalystList(an.PageInfo, userInfo.Id)
		if err != nil {
			an.FailedResult("获取研究员列表失败", result)
			return
		}
		analystList := new(page.PageResult)
		analystList.Data = list
		analystList.Page = pageRes
		an.SuccessResult("获取研究员列表成功", analystList, result)
		return
	})
}

// AnalystDetail  研究员详情
// @Summary 研究员详情
// @Description 研究员详情
// @Success 200 {object} controllers.BaseResponse
// @router /analystDetail [get]
func (an *AnalystController) AnalystDetail(analystId int) {
	controllers.Wrap(&an.BaseController, func() (result *controllers.WrapData, err error) {
		result = an.InitWrapData("获取研究员详情失败")
		userInfo := an.Data["user"].(user.User)
		detail, err := user.GetAnalystDetail(userInfo.Id, analystId)
		if err != nil {
			an.FailedResult("获取研究员详情失败", result)
			return
		}
		an.SuccessResult("获取研究员详情成功", detail, result)
		return
	})
}

// AnalystReportList @Title 获取研究员报告列表
// @Description 获取研究员报告列表
// @Success 200 {object}
// @router /reportList [get]
func (an *AnalystController) AnalystReportList(analystName string) {
	controllers.Wrap(&an.BaseController, func() (result *controllers.WrapData, err error) {
		result = an.InitWrapData("分页获取研究员报告列表失败")
		pageRes := page.Page{
			Current:  an.PageInfo.Current,
			PageSize: an.PageInfo.PageSize,
		}
		userInfo := an.Data["user"].(user.User)
		var reportIds []int
		var mappingRiskLevel string
		var userRiskStatus string
		pageRes.Total, pageRes.LatestId, reportIds, mappingRiskLevel, userRiskStatus = report.RangeSearchByAnalyst(analystName, userInfo.Id)
		if len(reportIds) == 0 {
			reports := new(page.PageResult)
			reports.Data = []interface{}{}
			reports.Page = pageRes
			an.SuccessResult("分页获取研究员报告列表成功", reports, result)
		}
		if an.PageInfo.LatestId == 0 {
			//pageRes.Total, pageRes.LatestId = report.GetTotalPageCountByAnalyst(analystName)
			an.PageInfo.LatestId = pageRes.LatestId
		} else {
			pageRes.LatestId = an.PageInfo.LatestId
			pageRes.Total = an.PageInfo.Total
		}
		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
		list, err := report.GetReportPageByAnalyst(an.PageInfo, analystName, reportIds, userInfo.Id, mappingRiskLevel, userRiskStatus)
		if err != nil {
			an.FailedResult("分页获取研究员报告列表失败", result)
			return
		}
		reports := new(page.PageResult)
		reports.Data = list
		reports.Page = pageRes
		an.SuccessResult("分页获取研究员报告列表成功", reports, result)
		return
	})
}

// MediaList 获取研究员媒体列表
// @Description 获取研究员媒体列表
// @Success 200 {object}
// @router /mediaList [get]
func (an *AnalystController) MediaList(mediaType string, analystId int) {
	controllers.Wrap(&an.BaseController, func() (result *controllers.WrapData, err error) {
		result = an.InitWrapData("分页查询研究员媒体列表失败")
		if mediaType == "" || !an.CheckMediaType(mediaType) {
			err = exception.New(exception.MediaTypeError)
			an.FailedResult("分页查询研究员媒体列表失败", result)
			return
		}
		pageRes := page.Page{
			Current:  an.PageInfo.Current,
			PageSize: an.PageInfo.PageSize,
		}
		userInfo := an.Data["user"].(user.User)
		var mediaIds []int
		var mappingRiskLevel string
		var userRiskStatus string
		pageRes.Total, pageRes.LatestId, mediaIds, mappingRiskLevel, userRiskStatus = media.RangeSearchByAnalyst(mediaType, analystId, userInfo.Id)
		if len(mediaIds) == 0 {
			mediaList := new(page.PageResult)
			mediaList.Data = []interface{}{}
			mediaList.Page = pageRes
			an.SuccessResult("分页查询研究员媒体列表成功", mediaList, result)
		}
		if an.PageInfo.LatestId == 0 {
			//	pageRes.Total, pageRes.LatestId = media.GetTotalPageCountByAnalystId(mediaType, analystId)
			an.PageInfo.LatestId = pageRes.LatestId
			an.PageInfo.Total = pageRes.Total
		} else {
			pageRes.LatestId = an.PageInfo.LatestId
			pageRes.Total = an.PageInfo.Total
		}
		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
		list, err := media.GetMediaPageByAnalystId(mediaType, an.PageInfo, analystId, mediaIds, userInfo.Id, mappingRiskLevel, userRiskStatus)
		if err != nil {
			an.FailedResult("分页查询研究员媒体列表失败", result)
			return
		}
		mediaList := new(page.PageResult)
		mediaList.Data = list
		mediaList.Page = pageRes
		an.SuccessResult("分页查询研究员媒体列表成功", mediaList, result)
		return
	})
}