package service

import (
	"encoding/json"
	"errors"
	"fmt"

	"git.zkcoi.com/zkcoi/meshray/internal/model"
	sqlite "git.zkcoi.com/zkcoi/meshray/internal/store/sqlite"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

// SettingsService 系统设置服务
type SettingsService struct {
	store  *sqlite.Store
	logger *zap.Logger
}

// NewSettingsService 创建系统设置服务
func NewSettingsService(store *sqlite.Store, logger *zap.Logger) *SettingsService {
	return &SettingsService{
		store:  store,
		logger: logger,
	}
}

// GetSettings 获取系统设置（单例）
func (s *SettingsService) GetSettings() (*model.SystemSetting, error) {
	var setting model.SystemSetting

	// 尝试查找 ID=1 的记录
	result := s.store.DB().First(&setting, 1)
	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			// 如果不存在，创建默认设置
			setting = model.SystemSetting{
				ID:         1,
				ServerIP:   "",
				ServerPort: 51820,
				LogLevel:   "info",
				LogFormat:  "console",
				MaxBackups: 7,
				MaxAge:     30,
				Theme:      "light",
				Language:   "zh-CN",
			}
			if err := s.store.DB().Create(&setting).Error; err != nil {
				return nil, fmt.Errorf("创建默认设置失败：%w", err)
			}
			s.logger.Info("已创建默认系统设置")
			return &setting, nil
		}
		return nil, fmt.Errorf("查询设置失败：%w", result.Error)
	}

	return &setting, nil
}

// UpdateSettings 更新系统设置
func (s *SettingsService) UpdateSettings(updates map[string]interface{}) (*model.SystemSetting, error) {
	// 先获取现有设置
	setting, err := s.GetSettings()
	if err != nil {
		return nil, err
	}

	// JSON 序列化 updates，确保数据有效
	data, err := json.Marshal(updates)
	if err != nil {
		return nil, fmt.Errorf("序列化更新数据失败：%w", err)
	}

	// 反序列化到临时对象，过滤无效字段
	var validUpdates map[string]interface{}
	if err := json.Unmarshal(data, &validUpdates); err != nil {
		return nil, fmt.Errorf("解析更新数据失败：%w", err)
	}

	// 移除敏感字段和不可变字段
	delete(validUpdates, "id")
	delete(validUpdates, "created_at")
	delete(validUpdates, "updated_at")

	// 构建 GORM 的 Updates map
	updatesMap := make(map[string]interface{})
	for key, value := range validUpdates {
		// 驼峰转蛇形转换（可选，这里直接使用前端传来的键名）
		updatesMap[key] = value
	}

	// 执行更新
	if err := s.store.DB().Model(&setting).Updates(updatesMap).Error; err != nil {
		return nil, fmt.Errorf("更新设置失败：%w", err)
	}

	s.logger.Info("系统设置已更新", zap.Any("updates", updates))

	// 返回最新数据
	return s.GetSettings()
}

// ResetSettings 重置为默认设置
func (s *SettingsService) ResetSettings() (*model.SystemSetting, error) {
	_, err := s.GetSettings()
	if err != nil {
		return nil, err
	}

	defaultSetting := model.SystemSetting{
		ID:         1,
		ServerIP:   "",
		ServerPort: 51820,
		LogLevel:   "info",
		LogFormat:  "console",
		MaxBackups: 7,
		MaxAge:     30,
		Theme:      "light",
		Language:   "zh-CN",
	}

	if err := s.store.DB().Save(&defaultSetting).Error; err != nil {
		return nil, fmt.Errorf("重置设置失败：%w", err)
	}

	s.logger.Info("系统设置已重置为默认值")
	return &defaultSetting, nil
}
