package model

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"log"
	"math/rand"
)

type Admin struct {
	Id            interface{} `json:"id" bson:"_id"`                          // 自增ID
	Username      string      `json:"username" bson:"username"`               // 用户名
	Password      string      `json:"password" bson:"password"`               // 密码
	RealName      string      `json:"real_name" bson:"real_name"`             // 真实姓名
	Pid           any         `json:"pid" bson:"pid"`                         // 父级ID
	RoleId        string      `json:"role_id" bson:"role_id"`                 // 角色ID
	Status        int         `json:"status" bson:"status"`                   // 状态 0:禁用 1:启用
	ManagerAuth   int8        `json:"manager_auth" bson:"manager_auth"`       // 管理员权限
	LastLoginIp   string      `json:"last_login_ip" bson:"last_login_ip"`     // 最后登录IP
	LastLoginTime int64       `json:"last_login_time" bson:"last_login_time"` // 最后登录时间
	CreatedAt     int64       `json:"created_at" bson:"created_at"`
	UpdatedAt     int64       `json:"updated_at" bson:"updated_at"`
	DeletedAt     int64       `json:"deleted_at" bson:"deleted_at"`
}

func (a *Admin) TableName() string {
	return "admin"
}

const tokenLength = 32 // 定义token长度

// GenerateToken 生成一个安全的token字符串
func (a *Admin) GenerateToken() (string, error) {
	key := make([]byte, 32) // AES-256 key length
	_, err := rand.Read(key)
	if err != nil {
		log.Printf("Failed to generate random key: %s", err)
		return "", err
	}

	block, err := aes.NewCipher(key)
	if err != nil {
		log.Printf("Failed to create AES cipher: %s", err)
		return "", err
	}

	token := make([]byte, tokenLength)
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		log.Printf("Failed to create GCM: %s", err)
		return "", err
	}

	nonce := make([]byte, gcm.NonceSize())
	_, err = rand.Read(nonce)
	if err != nil {
		log.Printf("Failed to generate random nonce: %s", err)
		return "", err
	}
	token = gcm.Seal(nil, nonce, token, nil)
	return base64.URLEncoding.EncodeToString(token), nil
}

func (a *Admin) GetID() interface{} {
	return a.Id
}
