//
// cfg.go
// Copyright (C) 2024 veypi <i@veypi.com>
// 2025-03-04 16:08:06
// Distributed under terms of the MIT license.
//
// 本地配置文件 - 仅包含启动必需的配置
// 其他配置请在部署后通过管理后台设置（数据库存储）
//

package cfg

import (
	"time"

	"github.com/veypi/vigo/contrib/auth"
	"github.com/veypi/vigo/contrib/config"
)

// Options 本地配置选项（启动时加载，修改需重启）
type Options struct {
	// === 基础设施（必须）===
	DB    config.Database `json:"db"`
	Redis config.Redis    `json:"redis" usage:"Redis 配置，addr: memory 使用内存模式"`
	Key   config.Key      `json:"key" usage:"系统密钥，用于加密敏感数据（建议 32 位以上）"`

	// === JWT 配置（安全敏感，保留在本地） ===
	JWT JWTConfig `json:"jwt" usage:"JWT 配置"`

	// === 初始管理员（无人值守部署时使用）===
	// 当用户表为空且 username/password 都有值时，启动自动创建该管理员
	// 如果 password 为空，则保持默认逻辑：第一个注册用户成为 admin
	InitAdmin InitAdminConfig `json:"init_admin" usage:"初始管理员配置"`
}

// JWTConfig JWT 配置
type JWTConfig struct {
	Secret        string        `json:"secret" usage:"JWT 密钥（为空则使用 Key）"`
	AccessExpiry  time.Duration `json:"access_expiry" usage:"Access Token 有效期"`
	RefreshExpiry time.Duration `json:"refresh_expiry" usage:"Refresh Token 有效期"`
	Issuer        string        `json:"issuer" usage:"JWT 签发者"`
	CookiePath    string        `json:"cookie_path" usage:"Cookie Path，默认 / 全站，可限定为 /api/ 等"`
}

// InitAdminConfig 初始管理员配置
type InitAdminConfig struct {
	Username string `json:"username" usage:"管理员用户名"`
	Password string `json:"password" usage:"管理员密码（为空则禁用自动创建）"`
	Email    string `json:"email" usage:"管理员邮箱"`
}

// Global全局配置实例
var Global = &Options{
	DB: config.Database{
		Type:   "sqlite",
		Prefix: "vb_",
		DSN:    "/tmp/vbase.db",
	},
	Redis: config.Redis{
		Addr: "memory",
	},
	Key: "your-secret-key-change-in-production-min-32-characters",
	JWT: JWTConfig{
		Secret:        "",
		AccessExpiry:  15 * time.Minute,
		RefreshExpiry: 30 * 24 * time.Hour,
		Issuer:        "vbase",
			CookiePath:    "/",
	},
	InitAdmin: InitAdminConfig{
		Username: "admin",
		Password: "", // 为空表示不自动创建，第一个注册用户成为 admin
		Email:    "admin@example.com",
	},
}

var DB = Global.DB.Client

var Redis = Global.Redis.Client

// Auth 是全局的权限检查对象，通过 SetProvider 注入 Provider 实现
var Auth = auth.New()

var OnUserCreate = func(user_id string) error {
	return nil
}
