package pc

import (
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"hongze/hongze_yb/controller/response"
	userLogic "hongze/hongze_yb/logic/user"
	pcModels "hongze/hongze_yb/models/response/pc"
	"hongze/hongze_yb/models/tables/customer_comment"
	"hongze/hongze_yb/models/tables/rddp/classify"
	"hongze/hongze_yb/models/tables/rddp/msg_code"
	"hongze/hongze_yb/models/tables/rddp/report"
	"hongze/hongze_yb/models/tables/rddp/report_chapter"
	"hongze/hongze_yb/models/tables/rddp/session"
	"hongze/hongze_yb/models/tables/wx_user"
	"hongze/hongze_yb/models/tables/wx_user_log"
	"hongze/hongze_yb/models/tables/yb_activity"
	"hongze/hongze_yb/models/tables/yb_pc_suncode"
	"hongze/hongze_yb/services"
	"hongze/hongze_yb/services/pc"
	report2 "hongze/hongze_yb/services/report"
	userService "hongze/hongze_yb/services/user"
	"hongze/hongze_yb/services/wechat"
	"hongze/hongze_yb/utils"
	"strconv"
	"time"
)

// LatestNews 研报首页最新资讯
func LatestNews(c *gin.Context) {
	reqChartPermissionId := c.DefaultQuery("chart_permission_id", "")
	if reqChartPermissionId == "" {
		response.Fail("请输入权限ID", c)
		return
	}
	chartPermissionId, err := strconv.Atoi(reqChartPermissionId)
	if err != nil {
		response.Fail("权限ID格式错误", c)
		return
	}
	userinfo := userService.GetInfoByClaims(c)

	list, err := pc.GetLatestReportList(userinfo, chartPermissionId)
	if err != nil {
		response.Fail("获取报告失败", c)
		return
	}

	//recommendList, err := pcModels.GetLatestReportList()
	//if err != nil {
	//	response.Fail("获取报告详情失败"+err.Error(), c)
	//	return
	//}

	response.OkData("查询成功", list, c)
	return
}

// Banner 上新公告banner图
func Banner(c *gin.Context) {
	var resp pcModels.LatestReleaseResp
	activityItem, err := yb_activity.GetLatestActivity()
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	reportItem, err := report.GetLatestReport()
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	imgMap := map[string]string{
		"晨报":      utils.ALIYUN_YBIMG_HOST + "day.png",
		"周报":      utils.ALIYUN_YBIMG_HOST + "week.png",
		"双周报":     utils.ALIYUN_YBIMG_HOST + "two_week.png",
		"月报":      utils.ALIYUN_YBIMG_HOST + "month.png",
		"草根调研":    utils.ALIYUN_YBIMG_HOST + "cgdy.png",
		"需求报告":    utils.ALIYUN_YBIMG_HOST + "xqbg.png",
		"宏观报告":    utils.ALIYUN_YBIMG_HOST + "hgbg.png",
		"日度点评":    utils.ALIYUN_YBIMG_HOST + "rddp.png",
		"数据点评":    utils.ALIYUN_YBIMG_HOST + "sjdp.png",
		"碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "coal.png",
		"行业调研":    utils.ALIYUN_YBIMG_HOST + "hydy.png",
		"百家谈":     utils.ALIYUN_YBIMG_HOST + "bjt.png",
		"会议纪要":    utils.ALIYUN_YBIMG_HOST + "hyjy.png",
		"大事点评":    utils.ALIYUN_YBIMG_HOST + "dsdp.png",
		"年报合集":    utils.ALIYUN_YBIMG_HOST + "nbhj.png",
	}
	if activityItem.CreateTime.Before(reportItem.PublishTime) {
		resp.ActivityOrReport = 1
		resp.ReportId = reportItem.ReportId
		resp.ClassifyIdSecond = reportItem.ClassifyIdSecond
		resp.ImgUrl = imgMap[reportItem.ClassifyNameFirst]
	} else {
		resp.ActivityOrReport = 0
		resp.Activity = activityItem
		resp.ImgUrl = utils.ALIYUN_YBIMG_HOST + "activity.png"
	}

	response.OkData("查询成功", resp, c)
	return
}

// LatestRelease 上新公告
func LatestRelease(c *gin.Context) {
	classifyIdString := c.DefaultQuery("ClassifyId", "")
	if classifyIdString == "" {
		response.Fail("请输入classifyId", c)
		return
	}

	classifyId, err := strconv.Atoi(classifyIdString)
	if err != nil {
		response.Fail("请输入正确classifyId", c)
		return
	}
	classifyInfo, err := classify.GetByClassifyId(classifyId)
	if err != nil {
		response.Fail("分类查询出错", c)
		return
	}

	response.OkData("查询成功", classifyInfo, c)
	return
}

// ClassifyDetail 专栏详情
func ClassifyDetail(c *gin.Context) {
	reqClassifyIdSecond := c.DefaultQuery("classify_id_second", "")
	if reqClassifyIdSecond == "" {
		response.Fail("请输入二级分类标识", c)
		return
	}

	classifyIdSecond, err := strconv.Atoi(reqClassifyIdSecond)
	if err != nil {
		response.Fail("请输入正确的二级分类标识", c)
		return
	}
	userinfo := userService.GetInfoByClaims(c)

	detail, err := pc.GetClassifyDetail(userinfo, classifyIdSecond)
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	response.OkData("查询成功", detail, c)
	return
}

// ClassifyDetailBanner 专栏详情banner图
func ClassifyDetailBanner(c *gin.Context) {
	reqReportId := c.DefaultQuery("reportId", "")
	//classifyName := c.DefaultQuery("classify_name_first", "")
	//if reqReportId == "" {
	//	response.Fail("请输入二级分类标识", c)
	//	return
	//}
	reportId, err := strconv.Atoi(reqReportId)
	if err != nil {
		response.Fail("报告ID格式有误", c)
		return
	}
	reportInfo, err := report.GetByReportId(reportId)
	if err != nil {
		response.Fail("报告查询出错", c)
		return
	}

	//查询分类类别,根据分类配置显示专栏还是报告合集
	parentClassify, err := classify.GetByClassifyIdFirst(reportInfo.ClassifyIdFirst)
	if err != nil {
		response.Fail("获取分类信息失败"+err.Error(), c)
		return
	}
	minClassifyId, _, err := report2.GetMinClassify(reportInfo)
	if err != nil {
		response.FailMsg("查询最新一期报告合集失败", "查询最新一期报告合集失败1:"+err.Error(), c)
		return
	}

	var bannerResp *pcModels.DetailBannerResp
	if reportInfo.HasChapter == 1 {
		chapterItem, err := report_chapter.GetLatestChapterByMinClassifyId(minClassifyId)
		if err != nil {
			response.FailMsg("查询最新一期报告合集失败2", "查询最新一期报告合集失败2:"+err.Error(), c)
			return
		}
		resp := &pcModels.DetailBannerResp{
			ReportId:          chapterItem.ReportId,
			ClassifyNameFirst: chapterItem.ClassifyNameFirst,
			ClassifyIdFirst:   chapterItem.ClassifyIdFirst,
			Stage:             chapterItem.Stage,
			ImgUrl:            "",
			Type:              "报告合集",
			ShowType:          1,
		}
		bannerResp = resp
	} else {
		if reportInfo.Id == 0 {
			response.Fail("报告不存在", c)
			return
		}

		if reportInfo.State != 2 && reportInfo.State != 6 {
			response.Fail("报告未发布", c)
			return
		}

		reportItem, err := report.GetLatestReportByClassifyId(reportInfo.ClassifyIdFirst, reportInfo.ClassifyIdSecond, reportInfo.ClassifyIdThird)
		if err != nil {
			response.Fail("获取报告详情失败"+err.Error(), c)
			return
		}
		//查询分类类别,根据分类配置显示专栏还是报告合集
		minClassify, err := classify.GetByClassifyId(minClassifyId)
		if err != nil {
			response.FailMsg("获取分类信息失败", "获取分类信息失败"+err.Error(), c)
			return
		}

		resp := &pcModels.DetailBannerResp{
			ReportId:           reportItem.ReportId,
			Stage:              reportItem.Stage,
			VipTitle:           minClassify.VipTitle,
			Author:             reportItem.Author,
			ReportAuthor:       minClassify.ReportAuthor,
			ImgUrl:             "",
			ClassifyNameFirst:  reportItem.ClassifyNameFirst,
			ClassifyIdFirst:    reportItem.ClassifyIdFirst,
			ClassifyNameSecond: reportItem.ClassifyNameSecond,
			ClassifyIdSecond:   reportItem.ClassifyIdSecond,
			ShowType:           minClassify.ShowType,
		}

		if parentClassify.ShowType == 1 || parentClassify.ShowType == 3 {
			resp.Type = "报告合集"
		} else {
			resp.Type = "专栏详情"
		}
		bannerResp = resp
	}
	//有人的用人的底图,和上新公告图片不完全一样
	/*firstNameMap := map[string]string{
		"晨报":  utils.ALIYUN_YBIMG_HOST + "day.png",
		"周报":  utils.ALIYUN_YBIMG_HOST + "week.png",
		"双周报": utils.ALIYUN_YBIMG_HOST + "two_week.png",
		"月报":  utils.ALIYUN_YBIMG_HOST + "month.png",

		"会议纪要": utils.ALIYUN_YBIMG_HOST + "hyjy.png",
		"大事点评": utils.ALIYUN_YBIMG_HOST + "dsdp.png",
		"年报合集": utils.ALIYUN_YBIMG_HOST + "nbhj.png",

		//"草根调研":    utils.ALIYUN_YBIMG_HOST + "hy.png",
		//"需求报告":    utils.ALIYUN_YBIMG_HOST + "lxt.png",
		//"碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "sjx.png",
		//"行业调研":    utils.ALIYUN_YBIMG_HOST + "qp.png",
	}*/
	//secondNameMap := map[string]string{
	//	//宏观报告
	//	"宏观周期观察":     utils.ALIYUN_YBIMG_HOST + "gx.png",
	//	"房地产市场跟踪":    utils.ALIYUN_YBIMG_HOST + "gx.png",
	//	"货币政策跟踪":     utils.ALIYUN_YBIMG_HOST + "gx.png",
	//	"全球宏观经济周度回顾": utils.ALIYUN_YBIMG_HOST + "ldb.png",
	//	"宏观点评":       utils.ALIYUN_YBIMG_HOST + "zzh.png",
	//	//日度点评
	//	"知白守黑日评":    utils.ALIYUN_YBIMG_HOST + "wxy.png",
	//	"有声有色日度闲":   utils.ALIYUN_YBIMG_HOST + "qp.png",
	//	"化里化外日评":    utils.ALIYUN_YBIMG_HOST + "qmz.png",
	//	"每日经济数据备忘录": utils.ALIYUN_YBIMG_HOST + "ldb.png",
	//	"股债日评":      utils.ALIYUN_YBIMG_HOST + "zzh.png",
	//	"贵金属复盘":     utils.ALIYUN_YBIMG_HOST + "hx.png",
	//	//数据点评
	//	"钢材周度数据点评":   utils.ALIYUN_YBIMG_HOST + "wxy.png",
	//	"甲醇开工数据点评":   utils.ALIYUN_YBIMG_HOST + "lqx.png",
	//	"短纤数据点评":     utils.ALIYUN_YBIMG_HOST + "zyy.png",
	//	"玻璃数据点评":     utils.ALIYUN_YBIMG_HOST + "gwy.png",
	//	"聚烯烃数据点评":    utils.ALIYUN_YBIMG_HOST + "lqx.png",
	//	"铜行业数据点评":    utils.ALIYUN_YBIMG_HOST + "yf.png",
	//	"国际钢材市场数据点评": utils.ALIYUN_YBIMG_HOST + "bx.png",
	//	"废钢周度数据点评":   utils.ALIYUN_YBIMG_HOST + "bx.png",
	//	"PP数据点评":     utils.ALIYUN_YBIMG_HOST + "lqx.png",
	//	"PVC数据点评":    utils.ALIYUN_YBIMG_HOST + "lyx.png",
	//	"BOPP数据点评":   utils.ALIYUN_YBIMG_HOST + "lqx.png",
	//	"塑编数据点评":     utils.ALIYUN_YBIMG_HOST + "lqx.png",
	//	"铁矿库存数据点评":   utils.ALIYUN_YBIMG_HOST + "hk.png",
	//	"宏观数据点评":     utils.ALIYUN_YBIMG_HOST + "zzh.png",
	//	"铝数据点评":      utils.ALIYUN_YBIMG_HOST + "yf.png",
	//	"甲醇库存数据点评":   utils.ALIYUN_YBIMG_HOST + "lqx.png",
	//	"玻璃纯碱数据点评":   utils.ALIYUN_YBIMG_HOST + "gwy.png",
	//	"乙二醇数据点评":    utils.ALIYUN_YBIMG_HOST + "zyy.png",
	//	"纯碱数据点评":     utils.ALIYUN_YBIMG_HOST + "gwy.png",
	//	"COVID-19跟踪": utils.ALIYUN_YBIMG_HOST + "lxt.png",
	//	"双焦数据点评":     utils.ALIYUN_YBIMG_HOST + "zs.png",
	//	"苯乙烯库存数据点评":  utils.ALIYUN_YBIMG_HOST + "cy.png",
	//	"苯乙烯数据点评":    utils.ALIYUN_YBIMG_HOST + "cy.png",
	//	"苯乙烯简评":      utils.ALIYUN_YBIMG_HOST + "cy.png",
	//	"EIA天然气库存点评": utils.ALIYUN_YBIMG_HOST + "wyy.png",
	//	"美国油气钻机数据点评": utils.ALIYUN_YBIMG_HOST + "wyy.png",
	//	"OPEC+产量点评":  utils.ALIYUN_YBIMG_HOST + "hyy.png",
	//	"原油船期数数据跟踪":  utils.ALIYUN_YBIMG_HOST + "wyy.png",
	//	"EIA原油库存点评":  utils.ALIYUN_YBIMG_HOST + "hyy.png",
	//	"苯乙烯开工数据点评":  utils.ALIYUN_YBIMG_HOST + "cy.png",
	//	"聚酯数据点评":     utils.ALIYUN_YBIMG_HOST + "qc.png",
	//	"铁矿航运数据点评":   utils.ALIYUN_YBIMG_HOST + "hk.png",
	//	//百家谈
	//	"能化百家谈": utils.ALIYUN_YBIMG_HOST + "qmz.png",
	//	"有色百家谈": utils.ALIYUN_YBIMG_HOST + "qp.png",
	//	"黑色百家谈": utils.ALIYUN_YBIMG_HOST + "wxy.png",
	//}
	authorMap := map[string]string{
		"白昕":           utils.ALIYUN_YBIMG_HOST + "bx.png",
		"曹阳":           utils.ALIYUN_YBIMG_HOST + "cy.png",
		"曾硕":           utils.ALIYUN_YBIMG_HOST + "zs.png",
		"曾滢月":          utils.ALIYUN_YBIMG_HOST + "zyy.png",
		"程品":           utils.ALIYUN_YBIMG_HOST + "cp.png",
		"高雯宇":          utils.ALIYUN_YBIMG_HOST + "gwy.png",
		"高昕":           utils.ALIYUN_YBIMG_HOST + "gx.png",
		"高吟":           utils.ALIYUN_YBIMG_HOST + "gy.png",
		"陈聪聪":          utils.ALIYUN_YBIMG_HOST + "ccc.png",
		"何凯":           utils.ALIYUN_YBIMG_HOST + "hk.png",
		"黄鑫":           utils.ALIYUN_YBIMG_HOST + "hx.png",
		"黄逸赟":          utils.ALIYUN_YBIMG_HOST + "hyy.png",
		"黄溢":           utils.ALIYUN_YBIMG_HOST + "hy.png",
		"李灵":           utils.ALIYUN_YBIMG_HOST + "ll.png",
		"林秋馨":          utils.ALIYUN_YBIMG_HOST + "lqx.png",
		"刘鼎邦":          utils.ALIYUN_YBIMG_HOST + "ldb.png",
		"钱鹏":           utils.ALIYUN_YBIMG_HOST + "qp.png",
		"刘艺羡":          utils.ALIYUN_YBIMG_HOST + "lyx.png",
		"戚明之":          utils.ALIYUN_YBIMG_HOST + "qmz.png",
		"秦钏":           utils.ALIYUN_YBIMG_HOST + "qc.png",
		"施琪":           utils.ALIYUN_YBIMG_HOST + "sq.png",
		"王存响":          utils.ALIYUN_YBIMG_HOST + "wcx.png",
		"王沛":           utils.ALIYUN_YBIMG_HOST + "wp.png",
		"苏畅":           utils.ALIYUN_YBIMG_HOST + "sc.png",
		"史瑾璇":          utils.ALIYUN_YBIMG_HOST + "sjx.png",
		"王亚丹":          utils.ALIYUN_YBIMG_HOST + "wyd.png",
		"虞风":           utils.ALIYUN_YBIMG_HOST + "yf.png",
		"魏忻悦":          utils.ALIYUN_YBIMG_HOST + "wxy.png",
		"王艺滢":          utils.ALIYUN_YBIMG_HOST + "wyy.png",
		"姚昕泽":          utils.ALIYUN_YBIMG_HOST + "yxz.png",
		"章左昊":          utils.ALIYUN_YBIMG_HOST + "zzh.png",
		"李晓瞳":          utils.ALIYUN_YBIMG_HOST + "lxt.png",
		"弘则FICC无锡调研团队": utils.ALIYUN_YBIMG_HOST + "qp.png",
		"弘则能化组":        utils.ALIYUN_YBIMG_HOST + "qmz.png",
		"弘则有色团队":       utils.ALIYUN_YBIMG_HOST + "qp.png",
		"弘则黑色团队":       utils.ALIYUN_YBIMG_HOST + "wp.png",
		"弘则宏观团队":       utils.ALIYUN_YBIMG_HOST + "zzh.png",
		"张立舟":          utils.ALIYUN_YBIMG_HOST + "zlz.png",
		"郑露":           utils.ALIYUN_YBIMG_HOST + "zl.png",
		"酒子怡":          utils.ALIYUN_YBIMG_HOST + "jzy.png",
	}

	if parentClassify.ShowType == 1 || parentClassify.ShowType == 3 {
		bannerResp.ImgUrl = parentClassify.YbRightBanner
	} else if url, ok := authorMap[bannerResp.ReportAuthor]; ok {
		bannerResp.ImgUrl = url
	}
	response.OkData("查询成功", bannerResp, c)
	return
}

// Recommend 报告详情页更多推荐
func Recommend(c *gin.Context) {
	reqReportId := c.DefaultQuery("reportId", "")
	if reqReportId == "" {
		response.Fail("请输入二级分类标识", c)
		return
	}
	reportId, err := strconv.Atoi(reqReportId)
	if err != nil {
		response.Fail("报告ID格式有误", c)
		return
	}
	reportInfo, err := report.GetByReportId(reportId)
	if err != nil {
		response.Fail("报告查询出错", c)
		return
	}
	if reportInfo.Id == 0 {
		response.Fail("报告不存在", c)
		return
	}
	minClassifyId, _, err := report2.GetMinClassify(reportInfo)
	if err != nil {
		response.FailMsg("查询最新一期报告合集失败", "查询最新一期报告合集失败1:"+err.Error(), c)
		return
	}

	var recommendResp []*pcModels.RecommendResp
	if reportInfo.HasChapter == 1 {
		recommendList, err := report_chapter.GetWeekRecommendListV2(reportId, minClassifyId)
		if err != nil {
			response.FailMsg("获取推荐报告列表失败", "获取推荐报告列表失败:"+err.Error(), c)
			return
		}
		for _, chapter := range recommendList {
			resp := &pcModels.RecommendResp{
				ReportId:            chapter.ReportId,
				ReportChapterID:     chapter.ReportChapterId,
				Title:               chapter.Title,
				Stage:               chapter.Stage,
				ClassifyNameFirst:   chapter.ClassifyNameFirst,
				ClassifySecondFirst: "",
			}
			recommendResp = append(recommendResp, resp)
		}
	} else {

		if reportInfo.State != 2 && reportInfo.State != 6 {
			response.Fail("报告未发布", c)
			return
		}

		reportType := 0
		if reportInfo.ClassifyNameFirst == "权益研报" {
			reportType = 1
		} else {
			reportType = 2
		}

		recommendList, err := pcModels.GetRecommendListV2(reportId, reportType, reportInfo.ClassifyIdFirst, reportInfo.ClassifyIdSecond, reportInfo.ClassifyIdThird)
		if err != nil {
			response.Fail("获取报告详情失败"+err.Error(), c)
			return
		}
		for _, chapter := range recommendList {
			resp := &pcModels.RecommendResp{
				ReportId:            chapter.Id,
				ReportChapterID:     0,
				Title:               chapter.Title,
				Stage:               chapter.Stage,
				ClassifyNameFirst:   chapter.ClassifyNameFirst,
				ClassifySecondFirst: chapter.ClassifyNameSecond,
			}
			recommendResp = append(recommendResp, resp)
		}
	}
	response.OkData("查询成功", recommendResp, c)
	return
}

// ClassifyFirstList Ficc 菜单
func ClassifyFirstList(c *gin.Context) {
	userinfo := userService.GetInfoByClaims(c)

	classList, err := pc.GetClassifyFirstList(userinfo)
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	response.OkData("查询成功", classList, c)
	return
}

// CustomerComment 客户评价
func CustomerComment(c *gin.Context) {
	lists, err := customer_comment.GetCustomerComment()
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	response.OkData("查询成功", lists, c)
	return
}

// GetSunCode 获取太阳码
// @Tags 公共模块
// @Summary  获取分享海报
// @Description 获取分享海报
// @Param	request	body services.SunCodeReq true "type json string"
// @Success 200 {object} string "获取成功"
// @failure 400 {string} string "获取失败"
// @Router /pc/getSunCode [post]
func GetSunCode(c *gin.Context) {
	var req services.SunCodeReq
	if c.ShouldBind(&req) != nil {
		response.Fail("参数异常", c)
		return
	}

	var sunCodeUrl string
	//先查,查不到再去生成上传
	item, err := yb_pc_suncode.GetYbPcSunCode(req.CodeScene, req.CodePage)
	if err != nil && err != utils.ErrNoRow {
		response.FailMsg("获取太阳码失败", err.Error(), c)
		return
	}
	if item != nil && item.SuncodeURL != "" {
		sunCodeUrl = item.SuncodeURL
	}
	if sunCodeUrl == "" {
		sunCodeUrl, err = services.PcCreateAndUploadSunCode(req.CodeScene, req.CodePage)
		if err != nil {
			response.FailMsg("生成太阳码失败", err.Error(), c)
			return
		}
	}

	response.OkData("查询成功", sunCodeUrl, c)
	return
}

// @Title pc端微信登录接口
// @Description pc端微信登录接口
// @Param   Code   query   string  true       "微信唯一编码code"
// @Success 200 {object} models.WxLoginResp
// @router /pc/login [get]
func WechatLogin(c *gin.Context) {
	var resp pcModels.LoginResp
	var token string
	var userId int
	var isBind bool
	code := c.DefaultQuery("Code", "")
	if code == "" {
		response.Fail("code参数错误", c)
		return
	}
	item, err := wechat.PcWxGetUserOpenIdByCode(code)
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	fmt.Println("token:", item.AccessToken)
	fmt.Println("token:", item.Errmsg)
	fmt.Println("token:", item.Errcode)
	if item.Errcode != 0 {
		response.Fail(item.Errmsg, c)
		return
	}

	openId := item.Openid
	//wxUserInfo, err := wx_app.GetSession(code)
	//if err != nil {
	//	response.Fail("获取失败,Err:"+err.Error(), c)
	//	return
	//}

	//获取用户信息
	wxPcUserInfo, err := wechat.PcWxGetUserInfo(openId, item.AccessToken)
	if err != nil {
		response.Fail(err.Error(), c)
		return
	}
	if wxPcUserInfo.Errcode != 0 {
		response.Fail(err.Error(), c)
		return
	}

	unionId := item.Unionid
	//sessionKey := wxUserInfo.SessionKey
	//needUpdateSessionKey := true //是否更新sessionKey

QUERY_WX_USER:
	wxUser, wxUserErr := userService.GetWxUserItemByOpenId(openId)
	if wxUserErr == userService.ERR_NO_USER_RECORD { //没有用户openid记录
		_, recordErr := userService.AddUserRecord(openId, unionId, "", "", "", "", "", "", "", 3, 0, 0)
		//如果插入失败,那么直接将错误信息返回
		if recordErr != nil {
			err = recordErr
			return
		}
		//needUpdateSessionKey = false //因为是新增用户微信信息,所以不需要更新sessionKey的数据了

		//插入成功后,需要重新查询该用户,并进入下面的逻辑
		goto QUERY_WX_USER
	} else if wxUserErr == userService.ERR_USER_NOT_BIND {
		// 未绑定则去查询unionId是否已经绑定了用户(其他平台,不区分平台),有相应的手机号邮箱信息则自动绑定
		//platformUser, platformErr := userService.GetFirstWxUserItemByUnionId(unionId)
		//if platformErr == nil {
		//	// 当公众号用户存在时
		//	if platformUser.Mobile != "" || platformUser.Email != "" {
		//		// 有手机号或邮箱则绑定信息则自动绑定并新增wx_user
		//		countryCode := 0
		//		if platformUser.CountryCode != "" {
		//			countryCode, _ = strconv.Atoi(platformUser.CountryCode)
		//		}
		//		tempToken, tempUser, tempErr, errMsg := userService.BindWxUser(openId, platformUser.Mobile, platformUser.Email, "", 3, countryCode, 1)
		//		if tempErr != nil {
		//			err = errors.New("自动绑定公众号用户失败,Err:" + tempErr.Error() + ", errMsg:" + errMsg)
		//			return
		//		}
		//		token = tempToken
		//		userId = int(tempUser.UserID)
		//		isBind = true
		//	}
		//}
	} else if wxUserErr != nil {
		err = wxUserErr
		return
	}

	//更新微信用户的sessionKey
	//if needUpdateSessionKey {
	//	_ = user_record.ModifySessionKeyByOpenid(openId, sessionKey)
	//}

	// 如果已经登录注册绑定的情况下/或者首次登录且为弘则研究公众号用户
	if wxUserErr == nil {
		userId = int(wxUser.UserID)

		// 如果账户有绑定了手机号或者邮箱,那么标记为已绑定
		if wxUser.Mobile != "" || wxUser.Email != "" {
			isBind = true
		}
	}

	//获取登录token
	tokenItem, tokenErr := session.GetTokenByOpenId(openId)
	if tokenErr != nil && tokenErr != utils.ErrNoRow {
		err = errors.New("登录失败,获取token失败:" + tokenErr.Error())
		return
	}
	fmt.Println("AccessToken:", item.AccessToken)
	fmt.Println("tokenItem:", tokenItem.AccessToken)
	if tokenErr != nil && tokenErr == utils.ErrNoRow {
		timeUnix := time.Now().Unix()
		timeUnixStr := strconv.FormatInt(timeUnix, 10)
		token = utils.MD5(openId) + utils.MD5(timeUnixStr)
		fmt.Println("token:", tokenItem.AccessToken)
		//新增session
		{
			sessionItem := &session.Session{
				OpenID:          openId,
				UserID:          int64(userId),
				CreatedTime:     time.Now(),
				LastUpdatedTime: time.Now(),
				ExpireTime:      time.Now().AddDate(0, 3, 0),
				AccessToken:     token,
			}
			sessionErr := sessionItem.Create()
			if err != nil {
				err = errors.New("登录失败,新增用户session信息失败:" + sessionErr.Error())
				return
			}
		}
	} else {
		token = tokenItem.AccessToken
		//如果联系人编号不为空,且联系人编号与session里面的联系人编号不一致的时候,需要做session变更
		//if userId > 0 && tokenItem.UserID != int64(userId) {
		//	_ = tokenItem.UpdateSession(int64(userId), time.Now().AddDate(0, 1, 0))
		//}

		//if userId > 0 {
		//}
		_ = tokenItem.UpdateSession(int64(userId), time.Now().AddDate(0, 1, 0))
	}

	//新增登录日志
	{
		loginLog := &wx_user_log.WxUserLog{
			UserID:     userId,
			OpenID:     openId,
			UnionID:    unionId,
			CreateTime: time.Now(),
			Handle:     "yb_login",
			Remark:     token,
		}
		go loginLog.Create()
	}
	resp.IsBind = isBind
	resp.Token = token
	response.OkData("查询成功", resp, c)
	return
}

// @Title 登录
// @Description 登录接口
// @Param	request	body models.LoginReq true "type json string"
// @Success 200 {object} models.LoginResp
// @router /pc/pcLogin [post]
func PcLogin(c *gin.Context) {
	var req pcModels.PcLoginReq
	if c.ShouldBind(&req) != nil {
		response.Fail("参数异常", c)
		return
	}

	userId := 0
	var isAdd bool
	if req.LoginType == 1 {
		if req.Mobile == "" {
			response.Fail("请输入手机号", c)
			return
		}
		if req.SmsCode == "" {
			response.Fail("请输入有效手机验证码", c)
			return
		}
		item, err := msg_code.GetMsgCode(req.Mobile, req.SmsCode)
		if err != nil {
			if err == utils.ErrNoRow {
				response.Fail("校验验证码失败,Err:"+err.Error(), c)
				return
			} else {
				response.Fail("校验验证码失败,Err:"+err.Error(), c)
				return
			}
		}
		if item == nil {
			response.Fail("手机验证码错误,请重新输入", c)
			return
		}

		wxUser, err := wx_user.GetByMobile(req.Mobile)
		if err != nil {
			if err == utils.ErrNoRow {
				isAdd = true
			} else {
				response.Fail("根据手机号获取用户信息失败,Err:"+err.Error(), c)
				return
			}
		}
		if wxUser == nil {
			isAdd = true
		} else {
			userId = int(wxUser.UserID)
		}
		//BindMobile(openId, mobile string, userId, loginType int) (err error) {
		//newUserId, err = models.BindMobile(openId, req.Mobile, userId, req.LoginType)
	} else if req.LoginType == 2 {
		if req.Email == "" {
			response.Fail("邮箱不能为空,请输入邮箱", c)
			return
		}
		if !utils.ValidateEmailFormatat(req.Email) {
			response.Fail("邮箱格式错误,请重新输入", c)
			return
		}
		if req.SmsCode == "" {
			response.Fail("请输入有效验证码", c)
			return
		}
		item, err := msg_code.GetMsgCode(req.Email, req.SmsCode)
		if err != nil {
			if err == utils.ErrNoRow {
				response.Fail("校验验证码失败,Err:"+err.Error(), c)
				return
			} else {
				response.Fail("校验验证码失败,Err:"+err.Error(), c)
				return
			}
		}
		if item == nil {
			response.Fail("邮箱证码错误,请重新输入:", c)
			return
		}
		wxUser, err := wx_user.GetByEmail(req.Email)
		if err != nil {
			if err == utils.ErrNoRow {
				isAdd = true
			} else {
				response.Fail("根据邮箱获取用户信息失败,Err:"+err.Error(), c)
				return
			}
		}
		if wxUser == nil {
			isAdd = true
		} else {
			userId = int(wxUser.UserID)
		}
	} else {
		response.Fail("无效的登录方式,loginType:"+strconv.Itoa(req.LoginType), c)
	}
	if isAdd {
		user := new(wx_user.WxUser)
		user.CompanyID = 1
		user.CreatedTime = time.Now()
		user.FirstLogin = 1
		user.Enabled = 1
		user.Email = req.Email
		user.Mobile = req.Mobile
		if req.LoginType == 1 {
			user.BindAccount = user.Mobile
		} else {
			user.BindAccount = user.Email
		}
		user.RegisterTime = time.Now()
		user.LoginTime = time.Now()
		user.RegisterPlatform = 2
		if req.IsFreeLogin {
			user.IsFreeLogin = 1
		} else {
			user.IsFreeLogin = 0
		}

		lastId, err := user.Add()
		if err != nil {
			response.Fail("登录失败,新增客户信息失败,Err:"+err.Error(), c)
			return
		}
		fmt.Println("lastId:", lastId)
		userId = int(lastId)

		timeUnix := time.Now().Unix()
		timeUnixStr := strconv.FormatInt(timeUnix, 10)
		token := utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
		//新增session
		{
			session := new(session.Session)
			session.UserID = int64(userId)
			session.CreatedTime = time.Now()
			session.LastUpdatedTime = time.Now()
			session.ExpireTime = time.Now().AddDate(0, 3, 0)
			session.AccessToken = token
			err = session.Create()
			if err != nil {
				response.Fail("登录失败,新增用户session信息失败:"+err.Error(), c)
				return
			}
		}
	} else {
		user := new(wx_user.WxUser)
		user.UserID = uint64(userId)
		if req.IsFreeLogin {
			user.IsFreeLogin = 1
		} else {
			user.IsFreeLogin = 0
		}

		err := user.Update([]string{"is_free_login"})
		if err != nil {
			response.Fail("登录失败,修改登录信息失败,Err:"+err.Error(), c)
			return
		}
	}
	if userId == 0 {
		response.Fail("登录失败,id为 0", c)
		return
	}

	err := wx_user.ModifyFirstLogin(uint64(userId))
	if err != nil {
		response.Fail("登录失败,判断权限失败:"+err.Error(), c)
		return
	}
	var token string
	tokenItem, err := session.GetTokenByUid(userId)
	if err != nil && err != utils.ErrNoRow {
		response.Fail("登录失败,获取token失败:"+err.Error(), c)
		return
	}

	if tokenItem == nil || (err != nil && err == utils.ErrNoRow) {
		timeUnix := time.Now().Unix()
		timeUnixStr := strconv.FormatInt(timeUnix, 10)
		token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
		//新增session
		{
			session := new(session.Session)
			session.UserID = int64(userId)
			session.CreatedTime = time.Now()
			session.LastUpdatedTime = time.Now()
			session.ExpireTime = time.Now().AddDate(0, 3, 0)
			session.AccessToken = token
			err = session.Create()
			if err != nil {
				response.Fail("登录失败,新增用户session信息失败:"+err.Error(), c)
				return
			}
		}
	} else {
		token = tokenItem.AccessToken
	}

	//新增登录日志
	{
		loginLog := new(wx_user_log.WxUserLog)
		loginLog.UserID = userId
		loginLog.Mobile = req.Mobile
		loginLog.Email = req.Email
		loginLog.Handle = "pc_login"
		loginLog.CreateTime = time.Now()
		go loginLog.Create()
	}

	response.OkData("登录成功", token, c)
}

// GetSmsCode 获取短信验证码接口
// @Tags 用户模块
// @Summary  获取短信验证码
// @Description 获取短信验证码接口
// @Security ApiKeyAuth
// @securityDefinitions.basic BasicAuth
// @Param mobile	query string true "手机号"
// @Param area_num	query string true "手机国际区号(中国大陆:86)"
// @Accept  json
// @Product json
// @Success 200 {string} string 获取验证码成功
// @Failure 400 {string} string 手机号不能为空,请输入手机号
// @Router /pc_code/get_sms_code [get]
func GetSmsCode(c *gin.Context) {
	mobile := c.DefaultQuery("mobile", "")
	areaNum := c.DefaultQuery("area_num", "")
	err, errMsg := userLogic.PcSendSmsCode(mobile, areaNum)
	if err != nil {
		if errMsg != "" {
			errMsg = "获取验证码失败"
		}
		response.Fail(errMsg, c)
		return
	}

	response.Ok("获取验证码成功", c)
}

// GetEmailCode 获取邮箱验证码接口
// @Tags 用户模块
// @Summary  获取邮箱验证码
// @Description 获取邮箱验证码
// @Security ApiKeyAuth
// @securityDefinitions.basic BasicAuth
// @Param email	query string true "电子邮箱账号"
// @Accept  json
// @Product json
// @Success 200 {string} string 获取验证码成功
// @Failure 400 {string} string 请输入邮箱地址
// @Router /pc_code/get_email_code [get]
func GetEmailCode(c *gin.Context) {
	email := c.DefaultQuery("email", "")
	if email == "" {
		response.Fail("请输入邮箱地址", c)
		return
	}
	if !utils.ValidateEmailFormatat(email) {
		response.Fail("邮箱格式错误,请重新输入", c)
		return
	}

	err, errMsg := userLogic.PcSendEmailCode(email)
	if err != nil {
		if errMsg != "" {
			errMsg = "获取验证码失败"
		}
		response.Fail(errMsg, c)
		return
	}

	response.Ok("获取验证码成功", c)
}