package controllers

import (
	database "WorldEpcho/src/datasource"
	"WorldEpcho/src/models"
	"WorldEpcho/src/service"
	"WorldEpcho/src/utils"
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"strconv"
	"strings"
	"time"
)

func UnregisterPost(c *gin.Context) {
	/*
	   判断用户是否登录
	*/
	loginUid, isLogin := service.IsUserLoggedIn(c)
	if !isLogin {
		log.Println("用户未登录")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}

	//开启事务
	session := database.Engine.NewSession()
	defer session.Close() //延迟关闭session
	err := session.Begin()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "开启事务失败!"})
		fmt.Println("开启事务失败")
		return
	}
	loginUser, _, err := models.GetUserByID_Tx(session, loginUid)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询登录用户出错!"})
		return
	}

	userId := c.PostForm("id")
	uid, err := strconv.ParseInt(userId, 10, 64)
	if err != nil {
		fmt.Println("转换用户id出错")
	}

	user, exist, err := models.GetUserByID_Tx(session, uid)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id查询用户信息出错!"})
		return
	}

	if !exist {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "你的手机号未注册用户!"})
		fmt.Println("你的手机号未注册用户")
		return
	}

	// 用户权限小于3的可以注销
	if (user.Level > 3 && loginUser.Level <= 3) || loginUid != uid {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "无权限注销该用户!"})
		fmt.Println("无权限注销该用户!")
		return
	}

	/*
	 根据用户手机查询用户详情信息
	*/
	userInfo, userInfo_Exist, err := models.GetUserInfoById(session, user.Id)
	if err != nil {
		fmt.Println("根据手机号查询用户详情信息是否存在，查询失败")
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "根据手机查询用户详情信息是否存在出错"})
		return
	}

	if strings.Contains(user.WxOpenid, "_unregister") || strings.Contains(user.Phone, "_unregister") || strings.Contains(userInfo.Phone, "_unregister") {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "该用户已注销, 请勿重复操作!"})
		fmt.Println("该用户已注销, 请勿重复操作!")
		return
	}

	// 判断是不是微信小程序注册的用户
	timeStamp := time.Now().Unix()
	if user.WxOpenid != "" && user.WxOpenid == user.Phone {
		// 修改 openid
		user.WxOpenid = user.WxOpenid + "_unregister" + "_" + utils.Strval(timeStamp)
	}

	// 注销用户，将用户的状态值设为-1,手机号添加后缀 "_时间戳"
	user.Status = -1
	user.Username = user.Username + "_unregister" + "_" + utils.Strval(timeStamp)
	user.Phone = user.Phone + "_unregister" + "_" + utils.Strval(timeStamp)

	_, err = models.UpdateUser_Tx(session, user)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "注销用户,修改用户信息出错!"})
		log.Println("注销用户,修改用户信息出错!")
		return
	}
	/*if !userInfo_Exist {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "该手机绑定的用户不存在，无详情信息!"})
		fmt.Println("该手机绑定的用户不存在，无详情信息!")
		return
	}*/
	if userInfo_Exist {
		// 修改userinfo的手机号为注销状态
		userInfo.Phone = userInfo.Phone + "_unregister" + "_" + utils.Strval(timeStamp)
		userInfo.UserName = userInfo.UserName + "_unregister" + "_" + utils.Strval(timeStamp)
		err = models.UpdateUserInfo(session, userInfo)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "注销时,修改用户详情信息出错!"})
			fmt.Println("注销时,修改用户详情信息出错!")
			return
		}

	}

	//提交事务
	err = session.Commit()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "注销用户失败"})
		return
	} else {
		c.JSON(http.StatusOK, gin.H{"code": 1, "message": "注销用户成功!", "unregister_uid": uid})
	}

}
