package storage

import (
	"errors"
	"log"
	"os"
	"strings"
)

var errEmptyAdminToken = errors.New("admin_token 不能为空")

// EffectiveAdminToken 管理员令牌：环境变量 ADMIN_TOKEN 优先，否则读 MySQL monitor_kv
func (s *Storage) EffectiveAdminToken() string {
	if v := strings.TrimSpace(os.Getenv("ADMIN_TOKEN")); v != "" {
		return v
	}
	return strings.TrimSpace(s.adminTokenFromDB())
}

func (s *Storage) adminTokenFromDB() string {
	var row MonitorKV
	if err := s.db.Where("cfg_key = ?", kvKeyAdminToken).Limit(1).Find(&row).Error; err != nil {
		return ""
	}
	if row.CfgKey == "" {
		return ""
	}
	return row.CfgValue
}

// SetAdminToken 更新数据库中的管理员令牌（需已能通过 AdminAuth）
func (s *Storage) SetAdminToken(token string) error {
	token = strings.TrimSpace(token)
	if token == "" {
		return errEmptyAdminToken
	}
	var row MonitorKV
	s.db.Where("cfg_key = ?", kvKeyAdminToken).Limit(1).Find(&row)
	if row.CfgKey == "" {
		return s.db.Create(&MonitorKV{CfgKey: kvKeyAdminToken, CfgValue: token}).Error
	}
	row.CfgValue = token
	return s.db.Save(&row).Error
}

func (s *Storage) seedAdminTokenKV() {
	var n int64
	s.db.Model(&MonitorKV{}).Where("cfg_key = ?", kvKeyAdminToken).Count(&n)
	if n > 0 {
		return
	}
	val := strings.TrimSpace(os.Getenv("ADMIN_TOKEN"))
	if val == "" {
		log.Println("提示: 数据库 monitor_kv 中尚无 admin_token。可设置环境变量 ADMIN_TOKEN 后重启以自动写入，或对 monitor_kv 执行 INSERT。")
		return
	}
	if err := s.db.Create(&MonitorKV{CfgKey: kvKeyAdminToken, CfgValue: val}).Error; err != nil {
		log.Printf("写入初始 admin_token 失败: %v", err)
		return
	}
	log.Println("已从环境变量 ADMIN_TOKEN 写入数据库 monitor_kv（后续可去掉该环境变量，改用库中令牌）。")
}
