package user

import (
	"common/remark"
	"common/resultStatus"
	"common/webServer"
	"goutil/intUtil"
	"goutil/securityUtil"
	"strconv"
	"time"
)

func init() {

	//注册接口
	webServer.RegisterFunction(new(UserApi))
}

func init() {
	moduleName := "UserApi"
	desc := "用户接口"
	author := "tangping"
	mendor := ""
	date := "2024-12-25"
	remark.RegisterModuleRemark(moduleName, desc, author, mendor, date)
}

// UserApi 用户接口
type UserApi struct {
}

// ---------------------------------------- 接口 --------------------------------------------------
func init() {
	moduleName := "UserApi"
	methodName := "Register"
	skipVerifyTokenPage := true
	methodDesc := "注册用户"
	methodAuthor := "tangping"
	methodMendor := ""
	methodDate := "2024-12-25 15:55:00"
	methodInParam := []string{"string 账号,string:用户名称,string:用户密码,string:用户性别,string:用户生日,int64:用户手机号,string:用户邮箱,string:用户微信群,string:用户备注"}
	methodOutParam := `
	{
		"Code '类型:int'": "响应结果的状态值",
		"Message '类型:string'": "响应结果的状态值所对应的描述信息",
		"Data '类型:interface{}'": "响应结果的数据"
		{
			"id '类型:int'": "用户id",
		}
	}`
	remark.RegisterMethodRemark(moduleName, methodName, methodDesc, methodAuthor, methodMendor, methodDate, methodInParam, methodOutParam, skipVerifyTokenPage)
}
func (a *UserApi) Register(account string, name string, password string, sex int32, birthday string, phone int64, email string, wechatGroup string, describe string) (responseObj *webServer.ResponseObject) {
	responseObj = webServer.GetInitResponseObj()

	//校验参数
	if account == "" || name == "" || password == "" || sex == 0 || birthday == "" || phone == 0 || email == "" || wechatGroup == "" {
		responseObj.SetResultStatus(resultStatus.APIDataError)
		return
	}

	//密码md5加密
	password = securityUtil.Md5String(password, true)

	//处理数据
	UserModel := &User{
		Account:  account,
		Name:     name,
		Password: password,
		Sex:      sex,
		Birthday: birthday,
		Phone:    phone,
		Email:    email,
		Describe: describe,
	}

	//添加到数据库
	AddUser(UserModel)

	resultMap := make(map[string]any)
	resultMap["id"] = UserModel.ID
	responseObj.SetData(resultMap)
	return
}

// 用户登录
func init() {
	moduleName := "UserApi"
	methodName := "Login"
	skipVerifyTokenPage := true
	methodDesc := "用户登录"
	methodAuthor := "tangping"
	methodMendor := ""
	methodDate := "2024-12-26 15:55:00"
	methodInParam := []string{"string:账号,string:密码"}
	methodOutParam := `
	{
		"Code '类型:int'": "响应结果的状态值",
		"Message '类型:string'": "响应结果的状态值所对应的描述信息",
		"Data '类型:interface{}'": "响应结果的数据"
		{
			"Token '类型:string'": "登录令牌",
		}
	}`

	remark.RegisterMethodRemark(moduleName, methodName, methodDesc, methodAuthor, methodMendor, methodDate, methodInParam, methodOutParam, skipVerifyTokenPage)
}

func (a *UserApi) Login(account string, password string) (responseObj *webServer.ResponseObject) {

	responseObj = webServer.GetInitResponseObj()

	//验证参数
	if account == "" || password == "" {
		responseObj.SetResultStatus(resultStatus.APIDataError)
		return
	}

	userData, err := Login(account, securityUtil.Md5String(password, true))
	if err != nil {
		responseObj.SetResultStatus(resultStatus.DataError)
		return
	}

	//生成一个随机token
	token, err := intUtil.ShuffleIntDigits(time.Now().UnixNano())
	if err != nil {
		responseObj.SetResultStatus(resultStatus.DataError)
		return
	}

	//添加登录用户
	webServer.AddLoginUserToken(token, &webServer.TokenInfo{Id: userData.ID, Account: account, UserInfo: userData})

	//UserData映射成map
	resultMap := make(map[string]any)
	resultMap["Token"] = strconv.FormatInt(token, 10)

	responseObj.SetData(resultMap)
	return
}
