package controllers

import (
	"fmt"
	"hongze/hongze_api/models"
	"hongze/hongze_api/services"
	"hongze/hongze_api/utils"
	"strconv"
	"time"
)

type WechatController struct {
	BaseAuthController
}

type WechatCommonController struct {
	BaseCommonController
}

// @Title 微信登录接口
// @Description 微信登录接口
// @Param   Code   query   string  true       "微信唯一编码code"
// @Success 200 {object} models.WxLoginResp
// @router /login [get]
func (this *WechatCommonController) WechatLogin() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	code := this.GetString("Code")
	fmt.Println("code:", code)
	item, err := services.WxGetUserOpenIdByCode(code)
	if err != nil {
		br.Msg = "获取用户信息失败"
		br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
		return
	}
	if item.Errcode != "" {
		br.Msg = "获取用户信息失败"
		br.ErrMsg = "获取access_token 失败 errcode:" + item.Errcode + " ;errmsg:" + item.Errmsg
		return
	}
	openId := item.Openid
	firstLogin := 1
	userId := 0
	//获取成功
	if openId != "" {
		wxUser, err := models.GetWxUserItemByOpenId(openId)
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取用户信息失败"
			br.ErrMsg = "根据openid获取用户信息失败,Eerr:" + err.Error()
			return
		}
		if wxUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
			accessToken, err := services.WxGetAccessToken()
			if err != nil {
				br.Msg = "获取用户信息失败"
				br.ErrMsg = "获取access_token失败,err:" + err.Error()
				return
			}
			//获取用户信息
			wxUserInfo, err := services.WxGetUserInfo(openId, accessToken)
			if err != nil {
				br.Msg = "获取用户信息失败"
				br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
				return
			}
			/*if wxUserInfo.Errcode != 0 {
				br.Msg = "获取用户信息失败"
				br.ErrMsg = "获取用户信息失败 errcode:" + item.Errcode + " ;errmsg:" + item.Errmsg
				return
			}*/
			user := new(models.WxUser)
			user.OpenId = openId
			user.CompanyId = 1
			user.CreatedTime = time.Now()
			user.UnionId = wxUserInfo.Unionid
			user.Unionid = wxUserInfo.Unionid
			user.Subscribe = wxUserInfo.SubscribeScene
			user.SubscribeTime = wxUserInfo.SubscribeTime
			user.NickName = wxUserInfo.Nickname
			user.Sex = wxUserInfo.Sex
			user.City = wxUserInfo.City
			user.Province = wxUserInfo.Province
			user.Country = wxUserInfo.Country
			user.Headimgurl = wxUserInfo.Headimgurl
			user.Remark = wxUserInfo.Remark
			user.FirstLogin = 1
			user.Enabled = 1
			err = models.AddWxUser(user)
			if wxUserInfo.Unionid != "" {
				wxUser, err = models.GetWxUserItemByUnionid(wxUserInfo.Unionid)
				if err != nil {
					br.Msg = "获取用户信息失败"
					br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
					return
				}
			} else {
				wxUser, err = models.GetWxUserItemByOpenId(openId)
				if err != nil {
					br.Msg = "获取用户信息失败"
					br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
					return
				}
			}
			userId = wxUser.UserId
		} else {
			firstLogin = wxUser.FirstLogin
			userId = wxUser.UserId
		}
	} else {
		br.Msg = "获取用户信息失败"
		br.ErrMsg = "获取openid失败,openid:" + item.Openid
		return
	}
	timeUnix := time.Now().Unix()
	timeUnixStr := strconv.FormatInt(timeUnix, 10)
	token := utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr)
	//新增session
	{
		session := new(models.Session)
		session.OpenId = openId
		session.UserId = userId
		session.CreatedTime = time.Now()
		session.LastUpdatedTime = time.Now()
		session.ExpireTime = time.Now().AddDate(1, 0, 0)
		session.AccessToken = token
		err = models.AddSession(session)
		if err != nil {
			br.Msg = "登录失败"
			br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error()
			return
		}
	}
	permission, err := services.CheckUserPermission(userId)
	if err != nil {
		br.Msg = "登录失败"
		br.ErrMsg = "登录失败,判断权限失败:" + err.Error()
		return
	}
	resp := new(models.WxLoginResp)
	resp.UserId = userId
	resp.OpenId = openId
	resp.Code = 0
	resp.FirstLogin = firstLogin
	resp.Authorization = token
	resp.UserPermission = permission
	br.Ret = 200
	br.Success = true
	br.Msg = "登录成功"
	br.Data = resp
}

// @Title 微信登录接口
// @Description 微信登录接口
// @Param   Url   query   string  true       "url地址"
// @Success 200 {object} models.WechatSign
// @router /getWxSign [get]
func (this *WechatController) GetWxSign() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	getUrl := this.GetString("Url")
	fmt.Println("getUrl:", getUrl)
	accessToken, err := services.WxGetAccessToken()
	if err != nil {
		br.Msg = "获取用户信息失败"
		br.ErrMsg = "获取access_token失败,err:" + err.Error()
		return
	}

	ticket, err := services.GetWxTicket(accessToken)
	if err != nil {
		br.Msg = "获取Ticket失败,请联系客服"
		br.ErrMsg = "获取Ticket失败,Err" + err.Error()
		return
	}
	if ticket == "" {
		br.Msg = "获取Ticket失败,请联系客服"
		br.ErrMsg = "ticket为空" + ticket
		return
	}
	nonceStr := utils.GetRandStringNoSpecialChar(16)
	signature, nonceString, timestamp := services.GetWxSignature(ticket, getUrl, nonceStr)

	resp := new(models.WechatSign)
	resp.AppId = utils.WxAppId
	resp.NonceStr = nonceString
	resp.Timestamp = timestamp
	resp.Url = getUrl
	resp.Signature = signature
	br.Ret = 200
	br.Success = true
	br.Msg = "获取签名成功"
	br.Data = resp
}

/*
$app->bag('api/wechat/check', "WechatController@check");
*/