package builtin

// ui_test.go görünüm türetme kuralını sınar: "hangi tool hangi arayüzü alır".
// Buradaki tablo, arayüzün beklentisiyle BİREBİR aynı olmalıdır; ön ek değişirse
// test kırmızıya döner ve frontend sessizce yanlış bileşen göstermeye başlamaz.
//
// Kuralın TEK doğruluk kaynağı tool.ResolveUI'dir (bkz. ResolveUI/TUI testleri);
// buradaki DeriveUI sarmalayıcısı yalnızca builtin tarafındaki beklentiyi sabitler.

import (
	"testing"

	"fiko-ai/internal/tool"
)

func TestDeriveUI(t *testing.T) {
	cases := []struct {
		name string
		want tool.UI
	}{
		// Kayıt listesi döndüren alanlar -> tablo.
		{"biz.find", tool.UITable},
		{"biz.add", tool.UITable},
		{"memory.recall", tool.UITable},
		{"knowledge.search", tool.UITable},
		// Dosya içeriği -> dosya görünümü.
		{"fs.read_text", tool.UIFile},
		{"fs.write_text", tool.UIFile},
		// İnternet -> liste.
		{"web.search", tool.UIList},
		// Süreç -> terminal.
		{"sys.exec", tool.UICode},
		// Tanımayan / noktasız adlar güvenli JSON'a düşmeli.
		{"fiko.echo", tool.UIJson},
		{"catia.create_plane", tool.UIJson},
		{"noktasiz", tool.UIJson},
		{"", tool.UIJson},
	}
	for _, c := range cases {
		if got := DeriveUI(c.name); got != c.want {
			t.Errorf("DeriveUI(%q) = %q, beklenen %q", c.name, got, c.want)
		}
	}
}

// DeriveUI sonucu daima geçerli bir UI olmalıdır (arayüz "auto"yu göremez).
func TestDeriveUIAlwaysValid(t *testing.T) {
	names := []string{"biz.find", "fs.read_text", "web.search", "sys.exec", "x.y", "", "..", "A.B"}
	for _, n := range names {
		if u := DeriveUI(n); !u.Valid() {
			t.Errorf("DeriveUI(%q) geçersiz UI döndürdü: %q", n, u)
		}
	}
}

// DeriveUITool: tanımda AÇIK görünüm önceliklidir, yoksa ön ek tablosu kullanılır.
// (Örn. biz.summary tanımda metrics yazılıdır; "biz" ön ekinden gelen table DEĞİL.)
func TestDeriveUIToolPrefersExplicitField(t *testing.T) {
	cases := []struct {
		label string
		tool  tool.Tool
		want  tool.UI
	}{
		{"açık alan kazanır", tool.Tool{Name: "biz.summary", UI: tool.UIMetrics}, tool.UIMetrics},
		{"auto -> ön ek", tool.Tool{Name: "biz.find", UI: tool.UIAuto}, tool.UITable},
		{"boş -> ön ek", tool.Tool{Name: "fs.read_text"}, tool.UIFile},
		{"bilinmeyen -> json", tool.Tool{Name: "catia.plane", UI: tool.UIAuto}, tool.UIJson},
	}
	for _, c := range cases {
		if got := DeriveUITool(c.tool); got != c.want {
			t.Errorf("%s: DeriveUITool = %q, beklenen %q", c.label, got, c.want)
		}
	}
}

// Kayıtlı builtin tanımları NORMALIZE EDİLDİKTEN SONRA geçerli ve anlamlı bir
// görünüm taşımalıdır (Normalize, boş ui alanını "auto"ya düşürür).
func TestBuiltinDefinitionsResolveToValidUI(t *testing.T) {
	for _, d := range Definitions(Options{BizEnabled: true}) {
		if u := DeriveUITool(d.Tool); !u.Valid() || u == tool.UIAuto {
			t.Errorf("%s: çözülen görünüm geçersiz: %q", d.Tool.Name, u)
		}
	}
}
