package config

import (
	"testing"

	"system-altrak/internal/domain"

	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

func setupConfigSettingsTestDB(t *testing.T) *gorm.DB {
	t.Helper()

	db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Silent),
	})
	if err != nil {
		t.Fatalf("open sqlite db: %v", err)
	}

	if err := db.AutoMigrate(&domain.SystemSetting{}); err != nil {
		t.Fatalf("migrate system settings schema: %v", err)
	}

	return db
}

func TestSeedDefaultSystemSettingsCreatesCustomerProfileAndUiDefaults(t *testing.T) {
	db := setupConfigSettingsTestDB(t)
	if err := db.Create(&domain.SystemSetting{Key: "cp_format", Value: domain.CustomerProfileLegacyNumberFormat}).Error; err != nil {
		t.Fatalf("seed legacy cp_format: %v", err)
	}

	seedDefaultSystemSettings(db)
	seedDefaultSystemSettings(db)

	var formatSetting domain.SystemSetting
	if err := db.Where("`key` = ?", "cp_format").First(&formatSetting).Error; err != nil {
		t.Fatalf("expected cp_format setting: %v", err)
	}
	if formatSetting.Value != domain.CustomerProfileDefaultNumberFormat {
		t.Fatalf("expected default cp_format %s, got %q", domain.CustomerProfileDefaultNumberFormat, formatSetting.Value)
	}

	var resetSetting domain.SystemSetting
	if err := db.Where("`key` = ?", "cp_reset").First(&resetSetting).Error; err != nil {
		t.Fatalf("expected cp_reset setting: %v", err)
	}
	if resetSetting.Value != "global" {
		t.Fatalf("expected default cp_reset global, got %q", resetSetting.Value)
	}

	var visualTransitionsSetting domain.SystemSetting
	if err := db.Where("`key` = ?", "ui_visual_transitions").First(&visualTransitionsSetting).Error; err != nil {
		t.Fatalf("expected ui_visual_transitions setting: %v", err)
	}
	if visualTransitionsSetting.Value != "true" {
		t.Fatalf("expected default ui_visual_transitions true, got %q", visualTransitionsSetting.Value)
	}

	var dynamicSidebarSetting domain.SystemSetting
	if err := db.Where("`key` = ?", "ui_dynamic_sidebar").First(&dynamicSidebarSetting).Error; err != nil {
		t.Fatalf("expected ui_dynamic_sidebar setting: %v", err)
	}
	if dynamicSidebarSetting.Value != "false" {
		t.Fatalf("expected default ui_dynamic_sidebar false, got %q", dynamicSidebarSetting.Value)
	}

	var mfaSetting domain.SystemSetting
	if err := db.Where("`key` = ?", "security_mfa_enabled").First(&mfaSetting).Error; err != nil {
		t.Fatalf("expected security_mfa_enabled setting: %v", err)
	}
	if mfaSetting.Value != "false" {
		t.Fatalf("expected default security_mfa_enabled false, got %q", mfaSetting.Value)
	}

	var autoLogoutSetting domain.SystemSetting
	if err := db.Where("`key` = ?", "security_auto_logout").First(&autoLogoutSetting).Error; err != nil {
		t.Fatalf("expected security_auto_logout setting: %v", err)
	}
	if autoLogoutSetting.Value != "true" {
		t.Fatalf("expected default security_auto_logout true, got %q", autoLogoutSetting.Value)
	}

	var count int64
	if err := db.Model(&domain.SystemSetting{}).Count(&count).Error; err != nil {
		t.Fatalf("count settings: %v", err)
	}
	if count != 6 {
		t.Fatalf("expected exactly 6 seeded settings, got %d", count)
	}
}
