package database

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"sync"
)

// DBConfigFile 数据库配置文件结构
type DBConfigFile struct {
	Type         string `json:"type"`          // "sqlite" 或 "mysql"
	Host         string `json:"host"`          // MySQL 主机
	Port         string `json:"port"`          // MySQL 端口
	User         string `json:"user"`          // MySQL 用户名
	Password     string `json:"password"`      // MySQL 密码
	Database     string `json:"database"`      // MySQL 数据库名
	TablePrefix  string `json:"table_prefix"`  // 表前缀
	DSN          string `json:"dsn"`          // SQLite 数据目录
	Initialized  bool   `json:"initialized"`   // 是否已初始化
}

var (
	configFile     *DBConfigFile
	configFileLock sync.RWMutex
	configFilePath = "data/db-config.json"
)

// LoadDBConfig 加载数据库配置
func LoadDBConfig() (*DBConfigFile, error) {
	configFileLock.RLock()
	if configFile != nil {
		configFileLock.RUnlock()
		return configFile, nil
	}
	configFileLock.RUnlock()

	configFileLock.Lock()
	defer configFileLock.Unlock()

	// 双重检查
	if configFile != nil {
		return configFile, nil
	}

	// 确保目录存在
	dir := filepath.Dir(configFilePath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return nil, fmt.Errorf("创建配置目录失败: %w", err)
	}

	// 读取配置文件
	data, err := os.ReadFile(configFilePath)
	if err != nil {
		if os.IsNotExist(err) {
			// 配置文件不存在，返回默认配置
			configFile = &DBConfigFile{
				Type:        "mysql",
				Host:        "localhost",
				Port:        "3306",
				User:        "root",
				Password:    "",
				Database:    "software_download_center",
				TablePrefix: "",
				DSN:         "data",
				Initialized: false,
			}
			return configFile, nil
		}
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	configFile = &DBConfigFile{}
	if err := json.Unmarshal(data, configFile); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %w", err)
	}

	return configFile, nil
}

// SaveDBConfig 保存数据库配置
func SaveDBConfig(config *DBConfigFile) error {
	configFileLock.Lock()
	defer configFileLock.Unlock()

	// 确保目录存在
	dir := filepath.Dir(configFilePath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("创建配置目录失败: %w", err)
	}

	// 序列化配置
	data, err := json.MarshalIndent(config, "", "  ")
	if err != nil {
		return fmt.Errorf("序列化配置失败: %w", err)
	}

	// 写入文件
	if err := os.WriteFile(configFilePath, data, 0644); err != nil {
		return fmt.Errorf("写入配置文件失败: %w", err)
	}

	configFile = config
	return nil
}

// IsDBInitialized 检查数据库是否已初始化
func IsDBInitialized() bool {
	config, err := LoadDBConfig()
	if err != nil {
		return false
	}
	return config.Initialized
}
