package builtin

// ui.go tool adının ön ekine bakarak çıktının arayüzde hangi GÖRÜNÜMLE sunulacağını
// türetir.
//
// Neden ayrı dosya ve neden "auto"? Tool tanımında `ui` alanı boş bırakılabilir
// (UIAuto). Bu durumda arayüz, tool adının ön ekinden görünümü çıkarır. Böylece:
//   - Yeni bir tool kodu yazarken görünümü elle seçmek zorunda değildir.
//   - Aynı alanda toplanan tool'lar (biz.*, fs.*, web.*) TUTARLI görünür.
//   - Bilinmeyen bir ön ek sessizce JSON'a düşer — hiçbir tool arayüzsüz kalmaz.
//
// Kural tablosu bilinçli olarak KISA: az sayıda, anlaşılır eşleme. Bir ön eki
// ayrıntılı dallandırmak yerine buraya eklemek daha okunabilir.
//
//	ns.action (biz/memory/knowledge) -> tablo  (kayit listeleri)
//	fs.*                             -> dosya  (icerik)
//	web.*                            -> liste  (arama sonuclari)
//	sys.*                            -> kod    (terminal ciktisi)
//	unit.*                           -> tablo  (birim listeleri)
//	diger / bilinmeyen                -> JSON   (her zaman calisan guvenli varsayilan)

import (
	"strings"

	"fiko-ai/internal/tool"
)

var uiByPrefix = map[string]tool.UI{
	"biz":       tool.UITable,
	"memory":    tool.UITable,
	"knowledge": tool.UITable,
	"fs":        tool.UIFile,
	"web":       tool.UIList,
	"sys":       tool.UICode,
	"unit":      tool.UITable,
}

// DeriveUI, tool adindan görünümü türetir. Ad noktasizsa ya da bilinmeyen bir
// ön ekse UIJson döner (her zaman çalışan güvenli varsayılan).
//
// Ad biçimi "ns.action" (bkz. validate.go: nameRe); ön ek alanı bölünür.
func DeriveUI(name string) tool.UI {
	prefix, _, ok := strings.Cut(name, ".")
	if !ok || prefix == "" {
		return tool.UIJson
	}
	if u, known := uiByPrefix[strings.ToLower(prefix)]; known {
		return u
	}
	return tool.UIJson
}

// DeriveUITool, bir tool tanımının görünümünü çözer: açık `ui` alanı varsa o,
// yoksa (auto/boş) ad ön ekinden türetilir.
//
// NOT: builtin tanımlarında AÇIKça verilen görünüm (örn. biz.summary -> metrics)
// önceliklidir; ön ek tablosu yalnızca "karar verilmemiş" tool'lar içindir.
func DeriveUITool(t tool.Tool) tool.UI {
	if t.UI != "" && t.UI != tool.UIAuto {
		return t.UI
	}
	return DeriveUI(t.Name)
}
