package dto

import (
	"errors"
	"regexp"
	"time"

	validation "github.com/go-ozzo/ozzo-validation/v4"
)

// TeamKey 结构体定义
type TeamKey struct {
	ID             *int64  `json:"id,omitempty"`
	UserID         *int64  `json:"userID,omitempty"`
	Name           *string `json:"name,omitempty"` // 必须
	Key            *string `json:"key,omitempty"`
	Status         *int64  `json:"status,omitempty"`         // 默认1 允许，0禁止
	Quota          *int64  `json:"quota,omitempty"`          // UnlimitedQuota不为1 的时候必须
	UnlimitedQuota *bool   `json:"unlimitedQuota,omitempty"` // 默认1 不限制，0限制
	UsedQuota      *int64  `json:"usedQuota,omitempty"`
	CreatedAt      *int64  `json:"createdAt,omitempty"`
	ExpiredAt      *int64  `json:"expiredAt,omitempty"` // 可选
}

// DefaultTeamKey 创建一个具有默认值的 TeamKey
func DefaultTeamKey() TeamKey {
	status := int64(1)     // 默认允许
	unlimitedQuota := true // 默认不限制
	createdAt := time.Now().Unix()

	return TeamKey{
		Status:         &status,
		UnlimitedQuota: &unlimitedQuota,
		CreatedAt:      &createdAt,
	}
}

// Validate 验证 TeamKey 结构体
func (t TeamKey) Validate() error {
	// 自定义验证规则
	var quotaRule validation.Rule = validation.Skip
	if t.UnlimitedQuota != nil && !*t.UnlimitedQuota {
		quotaRule = validation.Required.Error("当 UnlimitedQuota 为 false 时，Quota 是必填项")
	}

	// 过期时间校验
	var expiredAtRule validation.Rule = validation.Skip
	if t.ExpiredAt != nil {
		expiredAtRule = validation.Min(time.Now().Unix()).Error("过期时间不能早于当前时间")
	}

	return validation.ValidateStruct(&t,
		// ID 通常由系统生成，不需要验证

		// UserID 可选，但如果提供必须大于 0
		validation.Field(&t.UserID,
			validation.When(t.UserID != nil, validation.Min(int64(1)).Error("用户 ID 必须大于 0"))),

		// Name 是必填字段
		validation.Field(&t.Name,
			validation.Required.Error("名称不能为空"),
			validation.When(t.Name != nil, validation.Length(1, 100).Error("名称长度应在 1-100 之间"))),

		// Key 可选，但如果提供需要符合特定格式
		validation.Field(&t.Key,
			validation.When(t.Key != nil,
				validation.Length(1, 255).Error("Key 长度应在 1-255 之间")),
			validation.Match(regexp.MustCompile(`^[^\s]+$`)).Error("Key 不能包含空格"),
		),

		// Status 只能是 0 或 1
		validation.Field(&t.Status,
			validation.When(t.Status != nil, validation.In(int64(0), int64(1)).Error("状态只能是 0(禁止) 或 1(允许)"))),

		// Quota 要求依赖于 UnlimitedQuota
		validation.Field(&t.Quota, quotaRule,
			validation.When(t.Quota != nil, validation.Min(int64(1)).Error("配额必须大于 0"))),

		// UnlimitedQuota 是否限制配额
		validation.Field(&t.UnlimitedQuota),

		// UsedQuota 系统维护，不需要验证
		validation.Field(&t.UsedQuota,
			validation.When(t.UsedQuota != nil, validation.Min(int64(0)).Error("已使用配额不能为负数"))),

		// CreatedAt 系统维护，不需要验证
		validation.Field(&t.CreatedAt),

		// ExpiredAt 可选，但如果提供必须大于当前时间
		validation.Field(&t.ExpiredAt, expiredAtRule),
	)
}

// ValidateCreate 创建时的特殊验证
func (t TeamKey) ValidateCreate() error {
	// 首先进行基本验证
	if err := t.Validate(); err != nil {
		return err
	}

	// 创建时的额外验证
	if t.Name == nil {
		return errors.New("创建时必须提供名称")
	}

	return nil
}
