package main

// tools_schema_test.go: modele giden araç şemasının ajan alanlarını gizlediğini doğrular.
//
// CANLI HATA (04.10.2026): biz.* araçlarının şemasında `confirmed` alanı görünüyordu.
// Küçük model bu alanı doldurup kullanıcı onayını atlamaya çalışabiliyordu.

import (
	"testing"

	"fiko-ai/internal/tool"
)

func bizToolSchema() map[string]any {
	return map[string]any{
		"type": "object",
		"properties": map[string]any{
			"collection": map[string]any{"type": "string"},
			"ref":        map[string]any{"type": "string"},
			"confirmed":  map[string]any{"type": "boolean"},
		},
		"required": []any{"collection", "ref"},
	}
}

func TestModelSchema_HidesConfirmedFromBizTools(t *testing.T) {
	tl := tool.Tool{Name: "biz.delete", InputSchema: bizToolSchema()}
	got := modelSchema(tl)

	props, _ := got["properties"].(map[string]any)
	if _, ok := props["confirmed"]; ok {
		t.Error("modele giden şemada `confirmed` görünmemeli")
	}
	if _, ok := props["collection"]; !ok {
		t.Error("gerçek alanlar korunmalı")
	}
	// Orijinal kayıt MUTASYONA UĞRAMAMALI (Mongo'daki şema bozulursa araç bozulur).
	if orig, _ := tl.InputSchema["properties"].(map[string]any); orig == nil {
		t.Fatal("test hatası: kaynak şema beklenmedik biçimde değişti")
	} else if _, ok := orig["confirmed"]; !ok {
		t.Error("kaynak şemadan `confirmed` silinmiş (mutasyon)")
	}
}

func TestModelSchema_RequiredListStaysConsistent(t *testing.T) {
	schema := bizToolSchema()
	schema["required"] = []any{"collection", "ref", "confirmed"}
	got := modelSchema(tool.Tool{Name: "biz.delete", InputSchema: schema})

	req, ok := got["required"].([]any)
	if !ok {
		t.Fatalf("required listesi bozuldu: %v", got["required"])
	}
	for _, r := range req {
		if s, _ := r.(string); s == "confirmed" {
			t.Errorf("required listesinde `confirmed` kalmamalı: %v", req)
		}
	}
}

// biz.* dışındaki araçlara dokunulmaz (onay alanı yoktur; şema aynen iletilir).
func TestModelSchema_LeavesOtherToolsUntouched(t *testing.T) {
	schema := map[string]any{"type": "object",
		"properties": map[string]any{"path": map[string]any{"type": "string"}}}
	tl := tool.Tool{Name: "fs.read_text", InputSchema: schema}
	if got := modelSchema(tl); len(got) != len(schema) {
		t.Errorf("biz.* olmayan araç şeması değişmemeli: %v", got)
	}
}

// Şemasında confirmed olmayan biz aracı da olduğu gibi döner (kopya üretmek gereksiz).
func TestModelSchema_NoConfirmedFieldReturnsSameSchema(t *testing.T) {
	schema := map[string]any{"type": "object",
		"properties": map[string]any{"collection": map[string]any{"type": "string"}}}
	got := modelSchema(tool.Tool{Name: "biz.find", InputSchema: schema})
	if len(got["properties"].(map[string]any)) != 1 {
		t.Errorf("beklenmeyen değişiklik: %v", got)
	}
}
