package config

import (
	"os"
	"testing"
)

// unsetMemoryEnv bellek anahtarlarını TANIMSIZ yapar (getBool, boş değeri "false" sayar; "" ile temizlemek
// varsayılanı sınamaz). t.Setenv geri yükleme kaydını tutar, Unsetenv değeri kaldırır.
func unsetMemoryEnv(t *testing.T) {
	t.Helper()
	for _, k := range []string{
		"MEMORY_ENABLED", "MEMORY_AUTO_LEARN", "MEMORY_MAX_PER_USER", "MEMORY_RECALL_MIN_SCORE", "MEMORY_LEARN_MODEL",
	} {
		t.Setenv(k, "")
		if err := os.Unsetenv(k); err != nil {
			t.Fatal(err)
		}
	}
}

// Kalıcı bellek (Faz 10): varsayılan AÇIK ve güvenli; yanlış değerler açılışta reddedilir.
func TestMemorySettingsDefaults(t *testing.T) {
	clearEnv(t)
	unsetMemoryEnv(t)
	cfg, err := Load()
	if err != nil {
		t.Fatal(err)
	}
	m := cfg.Memory
	if !m.Enabled || !m.AutoLearn {
		t.Errorf("bellek ve otomatik öğrenme varsayılan AÇIK olmalı: %+v", m)
	}
	if m.MaxPerUser != 0 {
		t.Errorf("MaxPerUser sıfır geçmeli (paket kendi varsayılanını koysun), got=%d", m.MaxPerUser)
	}
	if m.RecallMinScore != 0.35 {
		t.Errorf("RecallMinScore varsayılanı 0.35 olmalı, got=%v", m.RecallMinScore)
	}
	if m.LearnModel != "" {
		t.Errorf("LearnModel boş olmalı (sohbet modeli kullanılsın), got=%q", m.LearnModel)
	}
}

func TestMemorySettingsValues(t *testing.T) {
	clearEnv(t)
	unsetMemoryEnv(t)
	t.Setenv("MEMORY_ENABLED", "false")
	t.Setenv("MEMORY_AUTO_LEARN", "off")
	t.Setenv("MEMORY_MAX_PER_USER", "120")
	t.Setenv("MEMORY_RECALL_MIN_SCORE", "0.5")
	t.Setenv("MEMORY_LEARN_MODEL", "qwen2.5:7b")
	cfg, err := Load()
	if err != nil {
		t.Fatal(err)
	}
	m := cfg.Memory
	if m.Enabled || m.AutoLearn {
		t.Errorf("kapatma değerleri uygulanmalı: %+v", m)
	}
	if m.MaxPerUser != 120 || m.RecallMinScore != 0.5 || m.LearnModel != "qwen2.5:7b" {
		t.Errorf("değerler yanlış: %+v", m)
	}
}

func TestMemorySettingsRejectInvalid(t *testing.T) {
	for _, tc := range []struct{ key, val string }{
		{"MEMORY_RECALL_MIN_SCORE", "1.5"},
		{"MEMORY_RECALL_MIN_SCORE", "-0.1"},
		{"MEMORY_MAX_PER_USER", "-3"},
	} {
		t.Run(tc.key+"="+tc.val, func(t *testing.T) {
			clearEnv(t)
			unsetMemoryEnv(t)
			t.Setenv(tc.key, tc.val)
			if _, err := Load(); err == nil {
				t.Fatalf("%s=%s reddedilmeliydi", tc.key, tc.val)
			}
		})
	}
}
