package setting

import (
	"testing"

	"system-altrak/internal/domain"
	"system-altrak/internal/repository"

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

func setupSettingRepositoryTestDB(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 TestRepositoryGetMissingReturnsEmptySettingWithoutError(t *testing.T) {
	db := setupSettingRepositoryTestDB(t)
	repo := NewRepository(repository.NewRepository(db))

	setting, err := repo.Get("cp_format")
	if err != nil {
		t.Fatalf("expected no error for missing setting, got %v", err)
	}
	if setting == nil {
		t.Fatal("expected setting object")
	}
	if setting.Key != "cp_format" {
		t.Fatalf("expected key cp_format, got %q", setting.Key)
	}
	if setting.Value != "" {
		t.Fatalf("expected empty value for missing setting, got %q", setting.Value)
	}
}

func TestRepositorySetCreatesAndUpdatesSetting(t *testing.T) {
	db := setupSettingRepositoryTestDB(t)
	repo := NewRepository(repository.NewRepository(db))

	if err := repo.Set("cp_format", domain.CustomerProfileDefaultNumberFormat); err != nil {
		t.Fatalf("set missing setting: %v", err)
	}

	setting, err := repo.Get("cp_format")
	if err != nil {
		t.Fatalf("get setting after create: %v", err)
	}
	if setting.Value != domain.CustomerProfileDefaultNumberFormat {
		t.Fatalf("expected %s, got %q", domain.CustomerProfileDefaultNumberFormat, setting.Value)
	}

	if err := repo.Set("cp_format", "{INC}/CS-BJM/{ROM}/{YY}"); err != nil {
		t.Fatalf("update setting: %v", err)
	}

	updated, err := repo.Get("cp_format")
	if err != nil {
		t.Fatalf("get setting after update: %v", err)
	}
	if updated.Value != "{INC}/CS-BJM/{ROM}/{YY}" {
		t.Fatalf("expected updated value {INC}/CS-BJM/{ROM}/{YY}, got %q", updated.Value)
	}
}
