package cygx

import (
	"encoding/json"
	"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/cygx"
	"hongze/hz_crm_api/models/system"
	cygxService "hongze/hz_crm_api/services/cygx"
	"hongze/hz_crm_api/utils"
	"os"
	"path/filepath"
	"time"
)

// banner
type BannerCoAntroller struct {
	controllers.BaseAuthController
}

// @Title 图片选择列表
// @Description 图片选择列表接口
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Success 200 {object} cygx.CygxBannerImgListResp
// @router /banner/img/list [get]
func (this *BannerCoAntroller) ImgList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	resp := new(cygx.CygxBannerImgListResp)
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")

	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{}
	total, err := cygx.GetCygxBannerImgCount(condition, pars)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	condition += "	ORDER BY sort DESC  "
	list, err := cygx.GetCygxBannerImgList(condition, pars, startSize, pageSize)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp.List = list
	resp.Paging = page
	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   Status   query   int  true       "发布状态 -1全部,1;已发布,0:未发布 默认-1"
// @Param   ListType   query   int  true       "ABC哪一列,默认A"
// @Success 200 {object} cygx.CygxBannerImgListResp
// @router /banner/list [get]
func (this *BannerCoAntroller) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	resp := new(cygx.CygxBannerListResp)
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	status, _ := this.GetInt("Status", -1)
	listType := this.GetString("ListType", "A")

	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 status == 0 || status == 1 {
		condition += ` AND  art.status = ? `
		pars = append(pars, status)
	}
	condition += ` AND  art.list_type = ? `
	pars = append(pars, listType)

	total, err := cygx.GetCygxBannerCount(condition, pars)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	condition += "	ORDER BY art.sort ASC , art.modify_time DESC   "
	list, err := cygx.GetCygxBannerList(condition, pars, startSize, pageSize)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp.List = list
	resp.Paging = page
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 添加修改banner
// @Description 添加修改banner接口
// @Param	request	body cygx.AddTacticsTimeLineReq true "type json string"
// @Success 200 {object} "保存成功"
// @router /banner/PreserveAndPublish [post]
func (this *BannerCoAntroller) PreserveAndPublish() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req cygx.CygxBannerReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	bannerId := req.BannerId
	//var condition string
	//var pars []interface{}
	//
	//condition += ` AND  art.status = 1 `
	//condition += ` AND  art.list_type = ?  AND  art.sort = ?`
	//pars = append(pars, req.ListType, req.Sort)
	//if bannerId > 0 {
	//	condition += ` AND  art.banner_id != ? `
	//	pars = append(pars, bannerId)
	//}
	//
	//total, err := cygx.GetCygxBannerCount(condition, pars)
	//if err != nil {
	//	br.Msg = "获取失败"
	//	br.ErrMsg = "获取失败,Err:" + err.Error()
	//	return
	//}
	//if total > 0 {
	//	br.Msg = "序号与已发布的已有序号不可重复!"
	//	return
	//}

	item := new(cygx.CygxBanner)
	item.ImgId = req.ImgId
	item.ListType = req.ListType
	item.BannerType = req.BannerType
	item.Title = req.Title
	item.Subtitle = req.Subtitle
	item.Link = req.Link
	item.AdminId = AdminUser.AdminId
	item.Status = 1
	item.CreateTime = time.Now()
	item.ModifyTime = time.Now()

	//新的默认排序排到最后
	detailByListTypeMax, err := cygx.GetCygxBannerDetailByListTypeMaxSort(req.ListType)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "保存失败"
		br.ErrMsg = " 获取某一列,最大的排序值失败,Err:" + err.Error()
		return
	}
	if detailByListTypeMax != nil {
		item.Sort = detailByListTypeMax.Sort + 10
	} else {
		item.Sort = 10
	}
	if bannerId == 0 {
		//新增
		err = cygx.AddCygxBanner(item)
	} else {
		//更新
		detail, err := cygx.GetCygxBannerDetail(bannerId)
		if err != nil {
			br.Msg = "详情不存在"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		if detail.Status == 1 {
			item.Sort = detail.Sort
		}
		item.BannerId = bannerId
		err = cygx.UpdateCygxBanner(item)
	}
	if err != nil {
		br.Msg = "保存失败"
		br.ErrMsg = "保存失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.IsAddLog = true
	br.Msg = "操作成功"
}

// @Title  详情
// @Description 获取详情接口
// @Param   BannerId   query   int  true       "BannerId"
// @Success Ret=200 {object} cygx.ActivitySpecialDetail
// @router /banner/detail [get]
func (this *BannerCoAntroller) Detail() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,用户信息为空"
		br.Ret = 408
		return
	}
	resp := new(cygx.GetCygxBannerImgRespDetailResp)
	bannerId, _ := this.GetInt("BannerId")
	if bannerId < 1 {
		br.Msg = "请输入详情ID"
		return
	}
	detail, err := cygx.GetCygxBannerDetail(bannerId)
	if err != nil {
		br.Msg = "详情不存在"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	detail.BannerTypeName = cygxService.GetCygxBannerTypeMap()[detail.BannerType]
	BannerImgDetail, err := cygx.GetCygxBannerImgDetail(detail.ImgId)
	if err != nil {
		br.Msg = "详情不存在"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	if BannerImgDetail == nil {
		br.Msg = "详情不存在"
		br.ErrMsg = "BannerImgDetail,为空:"
		return
	}

	Uv, err := cygx.GetCygxBannerHistoryCountUv(bannerId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取Uv失败,Err:" + err.Error()
		return
	}
	Pv, err := cygx.GetCygxBannerHistoryCountPv(bannerId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取Pv失败,Err:" + err.Error()
		return
	}
	detail.Uv = Uv
	detail.Pv = Pv
	detail.IndexImg = BannerImgDetail.IndexImg
	resp.Detail = detail
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 发布/取消发布
// @Description 发布/取消发布报告
// @Param	request	body cygx.CygxBannerIdReq true "type json string"
// @Success 200 Ret=200 发布成功
// @router /banner/publishAndcancel [post]
func (this *BannerCoAntroller) PublishReport() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req cygx.CygxBannerIdReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	bannerId := req.BannerId
	if bannerId == 0 {
		br.Msg = "参数错误"
		br.ErrMsg = "参数错误,id不可为空"
		return
	}
	detail, err := cygx.GetCygxBannerDetail(bannerId)
	if err != nil {
		br.Msg = "详情不存在"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	var status int
	if detail.Status == 0 {
		status = 1
	} else {
		status = 0
	}
	err = cygx.EditCygxBannerStatus(status, bannerId)
	if err != nil {
		br.Msg = "操作失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// @Title  下载PV
// @Description 下载PV接口
// @Param   BannerId   query   int  true       "BannerId"
// @router /banner/PvExport [get]
func (this *BannerCoAntroller) PvExport() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,用户信息为空"
		br.Ret = 408
		return
	}
	bannerId, _ := this.GetInt("BannerId")
	if bannerId < 1 {
		br.Msg = "请输入详情ID"
		return
	}
	var condition string
	var pars []interface{}
	condition = ` AND banner_id = ? `
	pars = append(pars, bannerId)
	var respList []*cygx.CygxBannerHistory
	//respList := new(cygx.CygxTacticsTimeLineHistory)
	list, err := cygx.GetCygxBannerHistoryList(condition, pars)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
	resp := new(cygx.CanDownload)
	adminInfo, errAdmin := system.GetSysUserById(AdminUser.AdminId)
	if errAdmin != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
		return
	}
	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
		resp.IsCanDownload = true
	}
	//销售查看自己客户,销售组长查看组员
	if resp.IsCanDownload == false {
		mapMobile, err := cygxService.GetAdminLookUserMobile(adminInfo)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,销售对应权限,Err:" + err.Error()
			return
		}
		for _, v := range list {
			if _, ok := mapMobile[v.Mobile]; ok {
				respList = append(respList, v)
			}
		}
	} else {
		respList = list
	}

	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := 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
	sheet, err := xlsxFile.AddSheet("阅读明细")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "姓名"
	cellB := rowTitle.AddCell()
	cellB.Value = "手机号"
	cellC := rowTitle.AddCell()
	cellC.Value = "公司名称"
	cellD := rowTitle.AddCell()
	cellD.Value = "所属权益销售"
	cellE := rowTitle.AddCell()
	cellE.Value = "点击时间"
	cellF := rowTitle.AddCell()
	cellF.Value = "来源"

	for _, item := range respList {
		row := sheet.AddRow()
		cellA := row.AddCell()
		cellA.Value = item.RealName
		cellB := row.AddCell()
		cellB.Value = item.Mobile
		cellC := row.AddCell()
		cellC.Value = item.CompanyName
		cellD := row.AddCell()
		cellD.Value = item.SellerName
		cellE := row.AddCell()
		cellE.Value = item.CreateTime.Format(utils.FormatDateTime)

		cellF := row.AddCell()
		if item.RegisterPlatform == 1 {
			cellF.Value = "小程序"
		} else {
			cellF.Value = "网页版"
		}
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	downloadFileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()

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

// @Title 移动顺序
// @Description 移动顺序
// @Param	request	body cygx.CygxBannerIdReq true "type json string"
// @Success 200 Ret=200 发布成功
// @router /banner/move [post]
func (this *BannerCoAntroller) Move() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req cygx.CygxBannerMoveReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	bannerId := req.BannerId
	previousBannerId := req.PreviousBannerId
	nextBannerId := req.NextBannerId
	listType := req.ListType
	if bannerId == 0 {
		br.Msg = "参数错误"
		br.ErrMsg = "参数错误,id不可为空"
		return
	}
	if listType != "A" && listType != "B" && listType != "C" {
		br.Msg = "参数错误" + listType
		br.ErrMsg = "移动列数参数错误" + listType
		return
	}
	detailmove, err := cygx.GetCygxBannerDetail(bannerId)
	if err != nil {
		br.Msg = "详情不存在"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	if detailmove.Status == 0 {
		br.Msg = "未发布的无法移动"
		return
	}
	//如果是单列就直接移过来
	if previousBannerId+nextBannerId == 0 {
		err = cygx.UpdateCygxBannerlistType(1, bannerId, listType)
		if err != nil {
			br.Msg = "移动失败"
			br.ErrMsg = "获取失败,EditCygxBannerMove Err:" + err.Error()
			return
		}
		br.Ret = 200
		br.Success = true
		br.Msg = "操作成功"
		return
	}

	var sort int
	if previousBannerId > 0 {
		detail, err := cygx.GetCygxBannerDetail(previousBannerId)
		if err != nil {
			br.Msg = "详情不存在"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		listType = detail.ListType
		sort = detail.Sort + 5
	} else {
		detail, err := cygx.GetCygxBannerDetail(nextBannerId)
		if err != nil {
			br.Msg = "详情不存在"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		listType = detail.ListType
		sort = detail.Sort - 5
	}
	err = cygx.UpdateCygxBannerlistType(sort, bannerId, listType)
	//err = cygx.EditCygxBannerMove(sort, bannerId, listType)
	if err != nil {
		br.Msg = "移动失败"
		br.ErrMsg = "获取失败,EditCygxBannerMove Err:" + err.Error()
		return
	}
	go cygxService.UpdateBannerSort(listType)
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}