package controller

import (
	"errors"
	"github.com/gin-gonic/gin"
	"strconv"
	"trading-go/model"
	"trading-go/response"
	"trading-go/util"
)

// Register
// @Tags 用户模块
// @Summary 创建用户
// @Accept application/json
// @Produce application/json
// @param json body model.UserJson true "用户信息"
// @Success 200 object response.Response
// @Router /user/register [post]
func Register(c *gin.Context) {
	var userJ model.UserJson
	err := c.ShouldBindJSON(&userJ)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}

	id := util.GetID()
	//if !util.CheckMobile(userJ.Phone) {
	//	msg := util.PhoneFormatError.Error()
	//	response.Fail(c.Writer, msg, 400)
	//	return
	//}
	user := model.User{
		Uid:    uint(id),
		Vid:    userJ.Vid,
		Name:   userJ.Name,
		Avatar: userJ.Avatar,
		Phone:  userJ.Phone,
	}

	if !user.CheckVid() {
		response.Fail(c.Writer, "user already exist", 400)
	}

	if user.Vid == "" {
		response.Fail(c.Writer, "vid can not be null", 400)
	}

	err = user.Register()

	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	} else {
		msg := "register succeed"
		response.Success(c.Writer, msg, nil)
	}
}

type NewRec struct {
	Uid  uint   `json:"uid"`
	CIds []uint `json:"cIds"`
}

// NewRecommend
// @Tags 用户模块
// @Summary 初始化用户推荐数据
// @Produce application/json
// @param data body NewRec false "推荐信息"
// @Success 200 {object} response.Response
// @Router /user/rec/new [post]
func NewRecommend(c *gin.Context) {
	jsonData := NewRec{}
	err := c.ShouldBind(&jsonData)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	err = model.NewRecommend(jsonData.Uid, jsonData.CIds)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	response.Success(c.Writer, "success", nil)
}

// Login
// @Tags 用户模块
// @Summary 登录
// @Produce application/json
// @param vid formData string false "微信ID"
// @Success 200 {object} response.Response
// @Router /user/login [post]
func Login(c *gin.Context) {
	var user model.User
	user.Vid = c.PostForm("vid")
	err, nu := user.Login()
	if err != nil && err.Error() == "sql: no rows in result set" {
		err = util.NoSuchUserError
		msg := err.Error()
		response.Fail(c.Writer, msg, 403)
		return
	}
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	token, err := util.CreatToken(nu.Uid)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	data := gin.H{
		"token":     token,
		"user_info": nu,
	}
	response.Success(c.Writer, "success", data)
}

// ModifyUser
// @Tags 用户模块
// @Summary 修改用户信息
// @Accept application/json
// @Produce application/json
// @param json body model.User true "用户信息"
// @Success 200 {object} response.Response
// @Router /user/modify [post]
func ModifyUser(c *gin.Context) {
	var userJ model.UserJson
	err := c.ShouldBindJSON(&userJ)
	user := userJ.Change()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	if user.Phone != "" {
		if !util.CheckMobile(userJ.Phone) {
			msg := util.PhoneFormatError.Error()
			response.Fail(c.Writer, msg, 400)
			return
		}
		if err := user.SPhone(); err != nil {
			if errors.Is(err, util.PhoneBeUsed) {
				response.Fail(c.Writer, err.Error(), 403)
			} else {
				response.Fail(c.Writer, err.Error(), 500)
			}
			return
		}
	}
	userOld := user.GetUser()
	nu, err := user.Modify(&userOld)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
	} else {
		msg := "modify succeed"
		response.Success(c.Writer, msg, nu)
	}
}

// UserInfo
// @Tags 用户模块
// @Summary 获取用户信息
// @Produce application/json
// @Success 200 {object} response.Response
// @Router /user/info [get]
func UserInfo(c *gin.Context) {
	var u model.User
	token := c.GetHeader("Authorization")
	t, claim, err := util.ParseToken(token)
	if err != nil {
		response.Fail(c.Writer, "failed to parse token", 500)
		return
	}
	if !t.Valid {
		response.Fail(c.Writer, "failed", 400)
		return
	}
	u.Uid = claim.UserId
	nu, err := u.Info()
	if err != nil || nu.Vid == "" {
		response.Fail(c.Writer, "failed", 500)
	}
	response.Success(c.Writer, "success", nu)
}

// GetUserPaged
// @Tags 用户模块
// @Summary 分页用户信息
// @Produce application/json
// @Param page path int true "页数"
// @Param pageSize path int true "一页的大小"
// @Success 200 {object} response.Response
// @Router /user/{page}/{pageSize} [get]
func GetUserPaged(c *gin.Context) {
	var user model.User
	p := c.Param("page")
	pS := c.Param("pageSize")
	page, err := strconv.Atoi(p)
	pageSize, err := strconv.Atoi(pS)
	if err != nil {
		response.Fail(c.Writer, err.Error(), 500)
		return
	}
	rsp, err := user.GetPaged(page, pageSize)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	cnt, err := user.GetCnt()
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	if cnt > page*pageSize {
		rsp.HNext = true
	}
	response.Success(c.Writer, "success", rsp)
}

// GetUserList
// @Tags 用户模块
// @Summary 批量获取用户信息
// @Produce application/json
// @Param uid body []string true "用户id列表"
// @Success 200 {object} response.Response
// @Router /user/list [post]
func GetUserList(c *gin.Context) {
	var u model.User
	jsonData := struct {
		Uid []string `json:"uid"`
	}{}
	err := c.ShouldBindJSON(&jsonData)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)
		return
	}
	userInfo, err := u.GetUserList(jsonData.Uid)
	if err != nil {
		msg := err.Error()
		response.Fail(c.Writer, msg, 500)

		return
	}
	response.Success(c.Writer, "success", gin.H{"users": userInfo})
}