package v1

import (
	"encoding/json"
	"kami/api/commonApi"
	"kami/internal/consts"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gtime"
)

// ====================================================================================
// Token 管理 API 请求/响应结构
// ====================================================================================

// CreateTokenReq 创建 Token 请求
type CreateTokenReq struct {
	g.Meta              `path:"/token/create" tags:"JD V2 Token Management" method:"post" summary:"创建 Token"`
	Name                string  `json:"name" v:"required" description:"Token名称"`
	Phone               string  `json:"phone" v:"phone" description:"绑定的手机号"`
	Remark              string  `json:"remark" description:"备注"`
	RechargeLimitAmount float64 `json:"rechargeLimitAmount" v:"required" description:"充值金额限制"`
	RechargeLimitCount  int     `json:"rechargeLimitCount" v:"required" description:"充值次数限制"`
}

// CreateTokenRes 创建 Token 响应
type CreateTokenRes struct {
	TokenId int64 `json:"tokenId" description:"Token ID"`
}

// GetTokenReq 获取 Token 信息请求
type GetTokenReq struct {
	g.Meta  `path:"/token/get" tags:"JD V2 Token Management" method:"get" summary:"获取 Token 信息"`
	TokenId int64 `json:"tokenId" v:"required" description:"Token ID"`
}

// TokenInfo Token 信息
type TokenInfo struct {
	Id                  int64                      `json:"id" description:"Token ID"`
	UserId              string                     `json:"userId" description:"用户ID，空字符串表示管理员创建"`
	Name                string                     `json:"name" description:"Token名称"`
	LoginToken          string                     `json:"loginToken" description:"登录Token"`
	Phone               string                     `json:"phone" description:"绑定的手机号"`
	Status              consts.CamelOilTokenStatus `json:"status" description:"状态"`
	BindCount           int                        `json:"bindCount" description:"已绑定卡密数量"`
	TotalBindAmount     float64                    `json:"totalBindAmount" description:"累计绑定金额"`
	TotalRechargeAmount float64                    `json:"totalRechargeAmount" description:"总充值金额"`
	RechargeLimitAmount float64                    `json:"rechargeLimitAmount" description:"充值金额限制"`
	RechargeLimitCount  int                        `json:"rechargeLimitCount" description:"充值次数限制"`
	LastBindAt          *gtime.Time                `json:"lastBindAt" description:"最后绑定时间"`
	LastUsedAt          *gtime.Time                `json:"lastUsedAt" description:"最后使用时间"`
	Remark              string                     `json:"remark" description:"备注"`
	CreatedAt           *gtime.Time                `json:"createdAt" description:"创建时间"`
	UpdatedAt           *gtime.Time                `json:"updatedAt" description:"更新时间"`
}

// GetTokenRes 获取 Token 信息响应
type GetTokenRes struct {
	Token TokenInfo `json:"token" description:"Token信息"`
}

// ListTokensRes 列出 Token 响应
type ListTokensRes struct {
	commonApi.CommonPageRes[TokenInfo]
}

// ListTokensReq 列出 Token 请求
type ListTokensReq struct {
	g.Meta `path:"/token/list" tags:"JD V2 Token Management" method:"get" summary:"列出 Token"`
	commonApi.CommonPageReq
	Name   string                     `json:"name" description:"Token名称"`
	Status consts.CamelOilTokenStatus `json:"status" description:"状态"`
}

// UpdateTokenReq 修改 Token 请求
type UpdateTokenReq struct {
	g.Meta              `path:"/token/update" tags:"JD V2 Token Management" method:"post" summary:"修改 Token"`
	TokenId             int64   `json:"tokenId" v:"required" description:"Token ID"`
	Name                string  `json:"name" v:"required" description:"Token名称"`
	Remark              string  `json:"remark" description:"备注"`
	RechargeLimitAmount float64 `json:"rechargeLimitAmount" v:"required" description:"充值金额限制"`
	RechargeLimitCount  int     `json:"rechargeLimitCount" v:"required" description:"充值次数限制"`
}

// UpdateTokenRes 修改 Token 响应
type UpdateTokenRes struct {
	Message string `json:"message" description:"信息"`
}

// DeleteTokenReq 删除 Token 请求
type DeleteTokenReq struct {
	g.Meta  `path:"/token/delete" tags:"JD V2 Token Management" method:"post" summary:"删除 Token"`
	TokenId int64 `json:"tokenId" v:"required" description:"Token ID"`
}

// DeleteTokenRes 删除 Token 响应
type DeleteTokenRes struct {
	Message string `json:"message" description:"信息"`
}

// InputVerificationCodeReq 输入验证码请求
type InputVerificationCodeReq struct {
	g.Meta  `path:"/token/input-verification-code" tags:"JD V2 Token Management" method:"post" summary:"输入验证码"`
	TokenId int64  `json:"tokenId" v:"required" description:"Token ID"`
	Code    string `json:"code" v:"required" description:"验证码"`
}

// InputVerificationCodeRes 输入验证码响应
type InputVerificationCodeRes struct {
	Message string `json:"message" description:"信息"`
}

// ResendVerificationCodeReq 重新发送验证码请求
type ResendVerificationCodeReq struct {
	g.Meta  `path:"/token/resend-verification-code" tags:"JD V2 Token Management" method:"post" summary:"重新发送验证码"`
	TokenId int64 `json:"tokenId" v:"required" description:"Token ID"`
}

// ResendVerificationCodeRes 重新发送验证码响应
type ResendVerificationCodeRes struct {
	Message string `json:"message" description:"信息"`
}

// ====================================================================================
// 卡密绑定 API 请求/响应结构
// ====================================================================================

// CardBindingInfo 卡密绑定信息
type CardBindingInfo struct {
	Id           int64       `json:"id" description:"绑定记录ID"`
	TokenId      int64       `json:"tokenId" description:"Token ID"`
	Name         string      `json:"name" description:"Token名称"`
	OrderId      int64       `json:"orderId" description:"订单ID"`
	CardNumber   string      `json:"cardNumber" description:"卡号"`
	CardPassword string      `json:"cardPassword" description:"卡密"`
	Amount       float64     `json:"amount" description:"绑定金额"`
	CreatedAt    *gtime.Time `json:"createdAt" description:"创建时间"`
}

// ListCardBindingsByTokenReq 根据 tokenId 查询绑卡记录请求
type ListCardBindingsByTokenReq struct {
	g.Meta `path:"/card-binding/list-by-token" tags:"JD V2 Token Management" method:"get" summary:"查询 Token 绑卡记录"`
	commonApi.CommonPageReq
	TokenId int64 `json:"tokenId" v:"required" description:"Token ID"`
}

// ListCardBindingsByTokenRes 根据 tokenId 查询绑卡记录响应
type ListCardBindingsByTokenRes struct {
	commonApi.CommonPageRes[CardBindingInfo]
}

// MarshalJSON 自定义 JSON 序列化，对敏感字段进行隐私处理
func (t TokenInfo) MarshalJSON() ([]byte, error) {
	type Alias TokenInfo
	return json.Marshal(Alias{
		Id:                  t.Id,
		UserId:              t.UserId,
		Name:                t.Name,
		LoginToken:          t.LoginToken,
		Phone:               t.Phone,
		Status:              t.Status,
		BindCount:           t.BindCount,
		TotalBindAmount:     t.TotalBindAmount,
		TotalRechargeAmount: t.TotalRechargeAmount,
		RechargeLimitAmount: t.RechargeLimitAmount,
		RechargeLimitCount:  t.RechargeLimitCount,
		LastBindAt:          t.LastBindAt,
		LastUsedAt:          t.LastUsedAt,
		Remark:              t.Remark,
		CreatedAt:           t.CreatedAt,
		UpdatedAt:           t.UpdatedAt,
	})
}
