package config

import (
	"fmt"
)

// AuthConfig 认证配置
type AuthConfig struct {
	Type     string       `json:"type"`     // 登录方式
	Password AuthPassword `json:"password"` // 密码登录配置
	Logto    AuthLogto    `json:"logto"`    // Logto登录配置
}

// Validate
// @description: 验证认证配置
// @receiver c
// @return error
func (c *AuthConfig) Validate() error {
	if c.Type == "" {
		return fmt.Errorf("auth type cannot be empty")
	}

	switch c.Type {
	case "password":
		if err := c.Password.Validate(); err != nil {
			return err
		}
	case "logto":
		if err := c.Logto.Validate(); err != nil {
			return err
		}
	default:
		return fmt.Errorf("unsupported auth type: %s", c.Type)
	}

	return nil
}

// AuthPassword
// @description: 密码登录
type AuthPassword struct {
	SecretKey   string `mapstructure:"secretKey"`   // 用于JWT签名的密钥
	AdminToken  string `mapstructure:"adminToken"`  // 管理员登录口令
	TokenExpiry int    `mapstructure:"tokenExpiry"` // Token过期时间(小时)
}

// Validate 验证认证配置
func (c *AuthPassword) Validate() error {
	if c.SecretKey == "" {
		return fmt.Errorf("auth secret key cannot be empty")
	}

	if c.AdminToken == "" {
		return fmt.Errorf("admin token cannot be empty")
	}

	if c.TokenExpiry <= 0 {
		c.TokenExpiry = 24 // 默认24小时
	}

	return nil
}

// IsValidToken 检查提供的token是否与配置的管理员token匹配
func (c *AuthPassword) IsValidToken(token string) bool {
	return token == c.AdminToken
}

// AuthLogto
// @description: Logto登录
type AuthLogto struct {
	Endpoint  string `mapstructure:"endpoint"`  // Logto服务地址
	AppId     string `mapstructure:"appId"`     // Logto应用ID
	AppSecret string `mapstructure:"appSecret"` // Logto应用密钥
}

// Validate 验证Logto配置
func (c *AuthLogto) Validate() error {
	if c.Endpoint == "" {
		return fmt.Errorf("logto endpoint cannot be empty")
	}

	if c.AppId == "" {
		return fmt.Errorf("logto app id cannot be empty")
	}

	if c.AppSecret == "" {
		return fmt.Errorf("logto app secret cannot be empty")
	}

	return nil
}
