package service

import (
	"encoding/json"
	"fmt"
	"u-desk/internal/storage"
	"u-desk/internal/storage/models"

	"gorm.io/gorm"
)

// ConfigService 配置服务
type ConfigService struct {
	db *gorm.DB
}

// NewConfigService 创建配置服务实例
func NewConfigService() (*ConfigService, error) {
	db, err := storage.InitFast()
	if err != nil {
		return nil, fmt.Errorf("数据库初始化失败: %w", err)
	}

	return &ConfigService{db: db}, nil
}

// TabDefinition Tab 定义
type TabDefinition struct {
	Key     string `json:"key"`
	Title   string `json:"title"`
	Enabled bool   `json:"enabled"`
}

// TabConfig Tab 配置
type TabConfig struct {
	AvailableTabs []TabDefinition `json:"available_tabs"`
	VisibleTabs   []string        `json:"visible_tabs"`
	DefaultTab    string          `json:"default_tab"`
}

// 默认 Tab 配置
var defaultTabConfig = TabConfig{
	AvailableTabs: []TabDefinition{
		{Key: "file-system", Title: "文件管理", Enabled: true},
		{Key: "markdown-editor", Title: "Markdown", Enabled: true},
		{Key: "version", Title: "版本历史", Enabled: true},
	},
	VisibleTabs: []string{"file-system", "markdown-editor", "version"},
	DefaultTab:  "file-system",
}

const (
	tabConfigKey = "tab_config"
)

// GetTabConfig 获取 Tab 配置
func (s *ConfigService) GetTabConfig() (*TabConfig, error) {
	var config models.AppConfig

	// 查询配置
	err := s.db.Where("`key` = ?", tabConfigKey).First(&config).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			// 不存在配置，返回默认配置
			return &defaultTabConfig, nil
		}
		return nil, fmt.Errorf("查询配置失败: %w", err)
	}

	// 解析 JSON
	var tabConfig TabConfig
	if err := json.Unmarshal([]byte(config.Value), &tabConfig); err != nil {
		// 解析失败，返回默认配置
		return &defaultTabConfig, nil
	}

	// 验证配置完整性
	if len(tabConfig.AvailableTabs) == 0 || len(tabConfig.VisibleTabs) == 0 {
		return &defaultTabConfig, nil
	}

	return &tabConfig, nil
}

// SaveTabConfig 保存 Tab 配置
func (s *ConfigService) SaveTabConfig(config *TabConfig) error {
	// 序列化为 JSON
	jsonData, err := json.Marshal(config)
	if err != nil {
		return fmt.Errorf("序列化配置失败: %w", err)
	}

	// 查询是否存在配置
	var existingConfig models.AppConfig
	err = s.db.Where("`key` = ?", tabConfigKey).First(&existingConfig).Error

	if err == gorm.ErrRecordNotFound {
		// 不存在，创建新配置
		newConfig := models.AppConfig{
			Key:         tabConfigKey,
			Value:       string(jsonData),
			Description: "Tab 显示和排序配置",
		}
		if err := s.db.Create(&newConfig).Error; err != nil {
			return fmt.Errorf("创建配置失败: %w", err)
		}
	} else if err != nil {
		return fmt.Errorf("查询配置失败: %w", err)
	} else {
		// 存在，更新配置
		existingConfig.Value = string(jsonData)
		if err := s.db.Save(&existingConfig).Error; err != nil {
			return fmt.Errorf("更新配置失败: %w", err)
		}
	}

	return nil
}
