// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: LicenseRef-MutuaL-1.2

package mcp

import (
	"context"
	"strings"
	"testing"
)

// tools.READ_TOOL.1 tools.SCHEMA.4 tools.RESPONSES.6
func TestCallToolACIDToolsReadTool1RejectsUnsupportedTargetBeforeCallingCooked(t *testing.T) {
	backend := &fakeBackend{}
	server := NewServer(backend, "test")

	_, err := server.CallReadTool(context.Background(), ReadArguments{Target: "meal_plan"})
	if err == nil {
		t.Fatal("CallReadTool() error = nil, want unsupported target error")
	}
	if err.Error() != `unsupported read target "meal_plan" (supported: shopping_list, recipes, recipe)` {
		t.Fatalf("CallReadTool() error = %q", err.Error())
	}
	if backend.readShoppingListCalls != 0 || backend.metadataCalls != 0 || backend.contentCalls != 0 {
		t.Fatalf(
			"backend calls = shopping list %d metadata %d content %d, want none",
			backend.readShoppingListCalls,
			backend.metadataCalls,
			backend.contentCalls,
		)
	}
}

// recipes.SAVE.10 tools.SCHEMA.4 tools.RESPONSES.6
func TestCallToolACIDRecipesSave10RejectsUnsupportedSourceBeforeCallingCooked(t *testing.T) {
	backend := &fakeBackend{}
	server := NewServer(backend, "test")

	_, _, err := server.callSaveRecipeTool(context.Background(), nil, SaveRecipeArguments{Source: "unsupported"})
	if err == nil {
		t.Fatal("callSaveRecipeTool() error = nil, want unsupported source error")
	}
	if err.Error() != `unsupported save_recipe source "unsupported" (supported: raw_text, prepared, url, draft, existing)` {
		t.Fatalf("callSaveRecipeTool() error = %q", err.Error())
	}
	if backend.saveCalls != 0 || backend.draftSaveCalls != 0 {
		t.Fatalf("save calls = prepared %d draft %d, want none", backend.saveCalls, backend.draftSaveCalls)
	}
}

// tools.SCHEMA.3 tools.SCHEMA.5 tools.SAVE_RECIPE_TOOL.1 tools.CHANGE_SHOPPING_LIST_TOOL.1
func TestToolDescriptionsACIDToolsSchema3And5DescribeCurrentLimits(t *testing.T) {
	save := saveRecipeTool()
	for _, want := range []string{
		"raw text",
		"prepared markdown",
		"URL import",
		"reviewed URL-import draft",
		"existing recipe update",
		"draft_id",
	} {
		if !strings.Contains(save.Description, want) {
			t.Fatalf("save_recipe description missing %q: %q", want, save.Description)
		}
	}

	shopping := changeShoppingListTool()
	for _, want := range []string{
		"add",
		"update_item",
		"replace_selection",
		"add_selection",
		"remove_selection",
		"remove",
		"clear",
		"Remove and clear are destructive",
		"put quantities before names",
		"milk — 1",
	} {
		if !strings.Contains(shopping.Description, want) {
			t.Fatalf("change_shopping_list description missing %q: %q", want, shopping.Description)
		}
	}
}
