package repository

import (
	"context"

	"gorm.io/gorm"

	"github.com/user-management-system/internal/domain"
)

// ThemeConfigRepository 主题配置数据访问层
type ThemeConfigRepository struct {
	db *gorm.DB
}

// NewThemeConfigRepository 创建主题配置数据访问层
func NewThemeConfigRepository(db *gorm.DB) *ThemeConfigRepository {
	return &ThemeConfigRepository{db: db}
}

// Create 创建主题配置
func (r *ThemeConfigRepository) Create(ctx context.Context, theme *domain.ThemeConfig) error {
	return r.db.WithContext(ctx).Create(theme).Error
}

// Update 更新主题配置
func (r *ThemeConfigRepository) Update(ctx context.Context, theme *domain.ThemeConfig) error {
	return r.db.WithContext(ctx).Save(theme).Error
}

// Delete 删除主题配置
func (r *ThemeConfigRepository) Delete(ctx context.Context, id int64) error {
	return r.db.WithContext(ctx).Delete(&domain.ThemeConfig{}, id).Error
}

// GetByID 根据ID获取主题配置
func (r *ThemeConfigRepository) GetByID(ctx context.Context, id int64) (*domain.ThemeConfig, error) {
	var theme domain.ThemeConfig
	err := r.db.WithContext(ctx).First(&theme, id).Error
	if err != nil {
		return nil, err
	}
	return &theme, nil
}

// GetByName 根据名称获取主题配置
func (r *ThemeConfigRepository) GetByName(ctx context.Context, name string) (*domain.ThemeConfig, error) {
	var theme domain.ThemeConfig
	err := r.db.WithContext(ctx).Where("name = ?", name).First(&theme).Error
	if err != nil {
		return nil, err
	}
	return &theme, nil
}

// GetDefault 获取默认主题
func (r *ThemeConfigRepository) GetDefault(ctx context.Context) (*domain.ThemeConfig, error) {
	var theme domain.ThemeConfig
	err := r.db.WithContext(ctx).Where("is_default = ?", true).First(&theme).Error
	if err != nil {
		// 如果没有默认主题，返回默认配置
		if err == gorm.ErrRecordNotFound {
			return domain.DefaultThemeConfig(), nil
		}
		return nil, err
	}
	return &theme, nil
}

// List 获取所有已启用的主题配置
func (r *ThemeConfigRepository) List(ctx context.Context) ([]*domain.ThemeConfig, error) {
	var themes []*domain.ThemeConfig
	err := r.db.WithContext(ctx).Where("enabled = ?", true).Order("is_default DESC, id ASC").Find(&themes).Error
	if err != nil {
		return nil, err
	}
	return themes, nil
}

// ListAll 获取所有主题配置
func (r *ThemeConfigRepository) ListAll(ctx context.Context) ([]*domain.ThemeConfig, error) {
	var themes []*domain.ThemeConfig
	err := r.db.WithContext(ctx).Order("is_default DESC, id ASC").Find(&themes).Error
	if err != nil {
		return nil, err
	}
	return themes, nil
}

// SetDefault 设置默认主题
func (r *ThemeConfigRepository) SetDefault(ctx context.Context, id int64) error {
	// 使用事务确保原子性：先清除所有默认标记，再设置新默认
	return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
		// 先清除所有默认标记
		if err := tx.Model(&domain.ThemeConfig{}).Where("is_default = ?", true).Update("is_default", false).Error; err != nil {
			return err
		}
		// 设置新的默认主题
		return tx.Model(&domain.ThemeConfig{}).Where("id = ?", id).Update("is_default", true).Error
	})
}
