package yb

import (
	"errors"
	"github.com/rdlucklib/rdluck_tools/paging"
	"github.com/tealeg/xlsx"
	"hongze/hz_crm_api/controllers"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/yb"
	"hongze/hz_crm_api/utils"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"time"
)

// ChartController 研报图表统计模块
type ChartCensusController struct {
	controllers.BaseAuthController
}

// GetChartVisitCensusList
// @Title 获取图表阅读统计列表
// @Description 获取图表阅读统计列表
// @Param   ClassifyId  query  int  false  "图表分类ID"
// @Success 200 {object} yb.ChartVisitPageListResp
// @router /chartCensus/getVisitList [get]
func (this *ChartCensusController) GetChartVisitCensusList() {
	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
	}

	classifyId, _ := this.GetInt("ClassifyId")
	order, _ := this.GetInt("Order")
	// 分页
	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)

	total, list, err := yb.GetChartVisitPageList(classifyId, startSize, pageSize, order)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败, Err: " + err.Error()
		return
	}

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

// GetChartVisitDetailCensusList
// @Title 获取图表阅读详情统计列表
// @Description 获取图表阅读详情统计列表
// @Param   ClassifyId		query	int		true	"图表分类ID"
// @Param   SellerId		query	string	false	"销售IDs,多个用英文逗号拼接"
// @Param   CompanyStatus	query	string	false	"图表分类ID,多个用英文逗号拼接"
// @Param   Keyword			query	string	false	"关键词"
// @Param   Order			query	int		false	"排序 1-查看时间升序 2-查看时间倒序"
// @Success 200 {object} yb.ChartVisitDetailPageListResp
// @router /chartCensus/getVisitDetailList [get]
func (this *ChartCensusController) GetChartVisitDetailCensusList() {
	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
	}

	classifyId, _ := this.GetInt("ClassifyId")
	if classifyId <= 0 {
		br.Msg = "分类ID有误"
		return
	}

	sellerId := this.GetString("SellerId")
	companyStatus := this.GetString("CompanyStatus")
	keyword := this.GetString("Keyword")
	order, _ := this.GetInt("Order")
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	totalList, totalClassify, list, err := getChartVisitDetailCensusData(classifyId, order, pageSize, currentIndex, sellerId, companyStatus, keyword)
	if err != nil {
		br.Msg = "获取失败"
		br.Msg = "获取阅读详情统计失败-" + err.Error()
		return
	}

	page := paging.GetPaging(currentIndex, pageSize, totalList)
	resp := yb.ChartVisitDetailPageListResp{
		List:       list,
		VisitTotal: totalClassify,
		Paging:     page,
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// GetCompanyChartVisitDetail
// @Title 获取用户图表访问明细
// @Description 获取用户图表访问明细
// @Param   ClassifyId	query	int	true	"图表分类ID"
// @Param   UserId		query	int	true	"用户ID"
// @Success 200 {object} yb.UserClassifyChartVisitList
// @router /chartCensus/getCompanyChartVisitDetail [get]
func (this *ChartCensusController) GetCompanyChartVisitDetail() {
	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
	}

	classifyId, _ := this.GetInt("ClassifyId")
	if classifyId <= 0 {
		br.Msg = "分类ID有误"
		return
	}
	userId, _ := this.GetInt("UserId")
	if userId <= 0 {
		br.Msg = "用户ID有误"
		return
	}

	list, err := yb.GetUserClassifyChartVisitList(classifyId, userId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取用户分类阅读统计失败, Err: " + err.Error()
		return
	}

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

// GetChartCompanyAuthCensusList
// @Title 获取图库权限开通客户统计列表
// @Description 获取图库权限开通客户统计列表
// @Param   SellerId		query	string	false	"销售IDs,多个用英文逗号拼接"
// @Param   CompanyStatus	query	string	false	"图表分类ID,多个用英文逗号拼接"
// @Param   Keyword			query	string	false	"关键词"
// @Success 200 {object} yb.CompanyAuthCensusPageListResp
// @router /chartCensus/getCompanyAuthCensusList [get]
func (this *ChartCensusController) GetChartCompanyAuthCensusList() {
	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
	}

	sellerId := this.GetString("SellerId")
	companyStatus := this.GetString("CompanyStatus")
	keyword := this.GetString("Keyword")
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")

	totalUser, totalItem, list, err := getChartCompanyAuthCensusData(sellerId, companyStatus, keyword, pageSize, currentIndex)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取图库权限开通客户统计列表-" + err.Error()
		return
	}

	page := paging.GetPaging(currentIndex, pageSize, totalUser)
	resp := yb.CompanyAuthCensusPageListResp{
		List:         list,
		Paging:       page,
		UserTotal:    totalUser,
		CompanyTotal: totalItem.CountCompany,
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// ExportChartVisitCensusList
// @Title 导出图表阅读统计列表
// @Description 导出图表阅读统计列表
// @Param   ClassifyId  query  int  false  "图表分类ID"
// @Success 200 {object} yb.ChartVisitPageListResp
// @router /chartCensus/exportChartVisitCensusList [get]
func (this *ChartCensusController) ExportChartVisitCensusList() {
	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
	}

	classifyId, _ := this.GetInt("ClassifyId")
	order, _ := this.GetInt("Order")

	_, list, err := yb.GetChartVisitPageList(classifyId, 0, 100000, order)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败, Err: " + err.Error()
		return
	}

	// 生成excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downloadFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true

	sheel, err := xlsxFile.AddSheet("图库阅读统计")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	titleRow := sheel.AddRow()
	titleRow.AddCell().SetValue("图分类")
	titleRow.AddCell().SetValue("阅读量")
	titleRow.AddCell().SetValue("最近一次阅读时间")
	// excel赋值
	for _, v := range list {
		dataRow := sheel.AddRow()
		dataRow.SetHeight(20)
		dataRow.AddCell().SetString(v.ClassifyName)
		dataRow.AddCell().SetString(strconv.Itoa(v.VisitCount))
		dataRow.AddCell().SetString(v.LastVisitTime)
	}
	// 保存excel
	err = xlsxFile.Save(downloadFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := "图库统计列表_" + randStr + ".xlsx"

	this.Ctx.Output.Download(downloadFilePath, downloadFileName)
	defer func() {
		os.Remove(downloadFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "导出成功"
}

// ExportChartVisitDetailCensusList
// @Title 导出图表阅读详情统计列表
// @Description 导出图表阅读详情统计列表
// @Param   ClassifyId		query	int		true	"图表分类ID"
// @Param   SellerId		query	string	false	"销售IDs,多个用英文逗号拼接"
// @Param   CompanyStatus	query	string	false	"图表分类ID,多个用英文逗号拼接"
// @Param   Keyword			query	string	false	"关键词"
// @Success 200 {object} yb.ChartVisitPageListResp
// @router /chartCensus/exportChartVisitDetailCensusList [get]
func (this *ChartCensusController) ExportChartVisitDetailCensusList() {
	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
	}

	classifyId, _ := this.GetInt("ClassifyId")
	if classifyId <= 0 {
		br.Msg = "分类ID有误"
		return
	}

	sellerId := this.GetString("SellerId")
	companyStatus := this.GetString("CompanyStatus")
	keyword := this.GetString("Keyword")

	_, _, list, err := getChartVisitDetailCensusData(classifyId, 0, 100000, 0, sellerId, companyStatus, keyword)
	if err != nil {
		br.Msg = "获取阅读详情统计失败"
		br.Msg = "获取阅读详情统计失败-" + err.Error()
		return
	}

	// 生成excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downloadFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true

	sheel, err := xlsxFile.AddSheet("图库阅读统计详情")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	titleRow := sheel.AddRow()
	titleRow.AddCell().SetValue("联系人姓名")
	titleRow.AddCell().SetValue("客户名称")
	titleRow.AddCell().SetValue("所属销售")
	titleRow.AddCell().SetValue("客户状态")
	titleRow.AddCell().SetValue("查看明细")
	titleRow.AddCell().SetValue("最近一次查看时间")
	// excel赋值
	for _, v := range list {
		dataRow := sheel.AddRow()
		dataRow.SetHeight(20)
		dataRow.AddCell().SetString(v.UserName)
		dataRow.AddCell().SetString(v.CompanyName)
		dataRow.AddCell().SetString(v.SellerName)
		dataRow.AddCell().SetString(v.CompanyStatus)
		dataRow.AddCell().SetString(strconv.Itoa(v.VisitCount))
		dataRow.AddCell().SetString(v.LastVisitTime)
	}
	// 保存excel
	err = xlsxFile.Save(downloadFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := "图库阅读统计详情_" + randStr + ".xlsx"

	this.Ctx.Output.Download(downloadFilePath, downloadFileName)
	defer func() {
		os.Remove(downloadFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "导出成功"
}

// ExportChartCompanyAuthCensusList
// @Title 导出图库权限开通客户统计列表
// @Description 导出图库权限开通客户统计列表
// @Param   SellerId		query	string	false	"销售IDs,多个用英文逗号拼接"
// @Param   CompanyStatus	query	string	false	"图表分类ID,多个用英文逗号拼接"
// @Param   Keyword			query	string	false	"关键词"
// @Success 200 string "导出成功"
// @router /chartCensus/exportChartCompanyAuthCensusList [get]
func (this *ChartCensusController) ExportChartCompanyAuthCensusList() {
	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
	}

	sellerId := this.GetString("SellerId")
	companyStatus := this.GetString("CompanyStatus")
	keyword := this.GetString("Keyword")

	_, _, list, err := getChartCompanyAuthCensusData(sellerId, companyStatus, keyword, 100000, 0)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取图库权限开通客户统计列表-" + err.Error()
		return
	}

	// 生成excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downloadFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true

	sheel, err := xlsxFile.AddSheet("图库权限开通统计")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	titleRow := sheel.AddRow()
	titleRow.AddCell().SetValue("联系人姓名")
	titleRow.AddCell().SetValue("客户名称")
	titleRow.AddCell().SetValue("所属销售")
	titleRow.AddCell().SetValue("客户状态")
	titleRow.AddCell().SetValue("图库服务期限")
	titleRow.AddCell().SetValue("剩余天数")
	// excel赋值
	for _, v := range list {
		dataRow := sheel.AddRow()
		dataRow.SetHeight(20)
		dataRow.AddCell().SetString(v.UserName)
		dataRow.AddCell().SetString(v.CompanyName)
		dataRow.AddCell().SetString(v.SellerName)
		dataRow.AddCell().SetString(v.CompanyStatus)
		dataRow.AddCell().SetString(v.StartTime + "~" + v.EndTime)
		dataRow.AddCell().SetString(strconv.Itoa(v.RestDay))
	}
	// 保存excel
	err = xlsxFile.Save(downloadFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := "图库权限开通统计_" + randStr + ".xlsx"

	this.Ctx.Output.Download(downloadFilePath, downloadFileName)
	defer func() {
		os.Remove(downloadFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "导出成功"
}

// getChartVisitDetailCensusData 图表阅读详情统计数据
func getChartVisitDetailCensusData(classifyId, order, pageSize, currentIndex int, sellerId, companyStatus, keyword string) (totalList, totalClassify int, list []*yb.ChartVisitDetailList, err error) {
	// 根据筛选项查询客户列表
	var condition string
	var pars []interface{}
	pars = append(pars, classifyId)
	if sellerId != "" {
		condition += ` AND p.seller_id IN (` + sellerId + `) `
	}
	if companyStatus != "" {
		statusArr := strings.Split(companyStatus, ",")
		var splitArr []string
		for _, v := range statusArr {
			splitArr = append(splitArr, `"`+v+`"`)
		}
		queryStatus := strings.Join(splitArr, ",")
		condition += ` AND p.status IN (` + queryStatus + `)`
	}
	if keyword != "" {
		keyword = "%" + keyword + "%"
		condition += ` AND (l.real_name LIKE ? OR c.company_name LIKE ?) `
		pars = append(pars, keyword, keyword)
	}

	// 分页
	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = paging.StartIndex(currentIndex, pageSize)
	// 获取统计详情列表
	totalList, list, err = yb.GetChartVisitDetailPageList(condition, pars, order, startSize, pageSize)
	if err != nil {
		err = errors.New("获取统计详情列表失败, Err: " + err.Error())
		return
	}
	totalClassify, err = yb.GetClassifyChartTotalVisit(condition, pars)
	if err != nil {
		err = errors.New("获取分类阅读总人数失败, Err: " + err.Error())
		return
	}

	return
}

// getChartCompanyAuthCensusData 图库权限开通客户统计数据
func getChartCompanyAuthCensusData(sellerId, companyStatus, keyword string, pageSize, currentIndex int) (totalUser int, totalItem yb.CountCompanyChartAuth, list []*yb.CompanyAuthCensusList, err error) {
	// 筛选条件
	var condition string
	var pars []interface{}
	if sellerId != "" {
		condition += ` AND d.seller_id IN (` + sellerId + `) `
	}
	if companyStatus != "" {
		statusArr := strings.Split(companyStatus, ",")
		var splitArr []string
		for _, v := range statusArr {
			splitArr = append(splitArr, `"`+v+`"`)
		}
		queryStatus := strings.Join(splitArr, ",")
		condition += ` AND d.status IN (` + queryStatus + `)`
	}
	if keyword != "" {
		keyword = "%" + keyword + "%"
		condition += ` AND b.real_name LIKE ? OR c.company_name LIKE ? `
		pars = append(pars, keyword, keyword)
	}

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

	// 获取图库权限开通统计列表
	totalUser, list, err = yb.GetCompanyAuthCensusPageList(condition, pars, startSize, pageSize)
	if err != nil {
		err = errors.New("获取统计详情列表失败, Err: " + err.Error())
		return
	}
	totalItem, err = yb.GetCompanyAuthTotal(condition, pars)
	if err != nil {
		err = errors.New("获取分类阅读总人数失败, Err: " + err.Error())
		return
	}

	if len(list) > 0 {
		// 计算剩余天数
		for _, item := range list {
			startTime, timeErr := time.ParseInLocation(utils.FormatDateTime, item.StartTime, time.Local)
			if timeErr != nil {
				err = errors.New("开始时间转换失败, Err: " + timeErr.Error())
				return
			}
			endTime, timeErr := time.ParseInLocation(utils.FormatDateTime, item.EndTime, time.Local)
			if timeErr != nil {
				err = errors.New("结束时间转换失败, Err: " + timeErr.Error())
				return
			}
			diff := endTime.Sub(startTime) + 1
			item.StartTime = startTime.Format(utils.FormatDate)
			item.EndTime = endTime.Format(utils.FormatDate)
			item.RestDay = int(diff.Hours() / 24)
		}
	}

	return
}