package tool

import (
	"context"
	"testing"
)

// REGRESYON: bellek tool'ları modele sunulabiliyor mu?
// Canlı hata: tool'lar "write" izniyle tanımlıydı; varsayılan politika yalnızca
// execute verdiği için policy.Allows() reddediyor ve agentCatalog.Available()
// bellek tool'larını LİSTEYE ALMIYORDU. Model onları hiç görmüyor, dolayısıyla
// ne memory.update ne memory.ask çağrılabiliyordu.
func TestBuiltinMemoryTools_AreOfferedToModel(t *testing.T) {
	ctx := context.Background()
	reg := NewRegistry(NewMemoryRepo(), nil)
	defs := []struct {
		name  string
		perms []string
	}{
		{"memory.remember", []string{"execute"}},
		{"memory.update", []string{"execute"}},
		{"memory.recall", []string{"execute"}},
		{"memory.ask", []string{"execute"}},
	}
	for _, d := range defs {
		tool := Tool{
			Name: d.name, Title: d.name, Description: "test", Version: "1.0.0",
			Status: StatusEnabled, Kind: KindBuiltin,
			InputSchema: map[string]any{"type": "object"},
			Permissions: d.perms, Risk: RiskLow,
		}
		if _, _, err := reg.EnsureBuiltin(ctx, tool, func(context.Context, *Tool, map[string]any) (map[string]any, error) {
			return map[string]any{}, nil
		}, true); err != nil {
			t.Fatalf("%s kaydedilemedi: %v", d.name, err)
		}
	}

	// ajanCatalog.Available ile AYNI filtreyi uygula.
	grants := NewGrantStore(DefaultPolicy())
	got := map[string]bool{}
	for _, name := range []string{"memory.remember", "memory.update", "memory.recall", "memory.ask"} {
		tl, err := reg.GetByName(ctx, name)
		if err != nil {
			t.Fatalf("%s bulunamadı: %v", name, err)
		}
		if !reg.ExecutableTool(tl) {
			t.Errorf("%s çalıştırılabilir değil", name)
		}
		if !grants.PolicyFor("local").Allows(tl) {
			t.Errorf("%s modele SUNULAMIYOR (izin reddi: %v) — bellek çalışmayacak", name,
				grants.PolicyFor("local").Authorize(tl))
		}
		got[name] = true
	}
	if len(got) != 4 {
		t.Errorf("4 bellek tool'u sunulmalıydı: %d", len(got))
	}
}
