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

package mcp

import (
	"context"
	"testing"
)

// recipes.SAVE.7 recipes.SAVE.9 recipes.SAVE.16 recipes.SAFETY.1 tools.SAVE_RECIPE_TOOL.1 tools.SAVE_RECIPE_TOOL.5
func TestCallToolACIDRecipesSave7And9And16SavesReviewedDraft(t *testing.T) {
	backend := &fakeBackend{draftSaveRecipeID: "recipe-1"}
	server := NewServer(backend, "test")

	_, output, err := server.callSaveRecipeTool(
		context.Background(),
		nil,
		SaveRecipeArguments{
			Source:   " draft ",
			DraftID:  " draft-1 ",
			Markdown: "  # Pasta\n\n1. Boil pasta.\n",
			Portions: 2,
		},
	)
	if err != nil {
		t.Fatalf("callSaveRecipeTool() error = %v", err)
	}

	if backend.draftSaveCalls != 1 {
		t.Fatalf("draft save calls = %d, want 1", backend.draftSaveCalls)
	}
	if backend.draftSaveID != "draft-1" {
		t.Fatalf("backend draft ID = %q, want draft-1", backend.draftSaveID)
	}
	if backend.draftSaveMarkdown != "  # Pasta\n\n1. Boil pasta.\n" {
		t.Fatalf("backend draft markdown = %q, want raw markdown preserved", backend.draftSaveMarkdown)
	}
	if backend.draftSavePortions != 2 {
		t.Fatalf("backend draft portions = %g, want 2", backend.draftSavePortions)
	}
	if output.RecipeID != "recipe-1" || output.DraftID != "" || output.Markdown != "" || output.Portions != 0 {
		t.Fatalf("draft save output = %#v, want recipe_id only", output)
	}
	if backend.importRecipeURLCalls != 0 || backend.metadataCalls != 0 || backend.contentCalls != 0 {
		t.Fatalf(
			"unexpected import/read calls = import %d metadata %d content %d, want none",
			backend.importRecipeURLCalls,
			backend.metadataCalls,
			backend.contentCalls,
		)
	}
	if backend.saveCalls != 0 || backend.updateCalls != 0 {
		t.Fatalf("prepared/update calls = %d/%d, want none", backend.saveCalls, backend.updateCalls)
	}
}

// recipes.SAVE.7-1 recipes.SAVE.7-2 recipes.SAVE.7-3 tools.SAVE_RECIPE_TOOL.5
func TestCallToolACIDRecipesSave7_1To7_3AndToolsSaveRecipeTool5RequiresDraftFields(t *testing.T) {
	tests := []struct {
		name      string
		arguments SaveRecipeArguments
	}{
		{
			name:      "draft_id",
			arguments: SaveRecipeArguments{Source: "draft", DraftID: "   ", Markdown: "# Pasta", Portions: 2},
		},
		{
			name:      "markdown",
			arguments: SaveRecipeArguments{Source: "draft", DraftID: "draft-1", Markdown: "   ", Portions: 2},
		},
		{
			name:      "portions",
			arguments: SaveRecipeArguments{Source: "draft", DraftID: "draft-1", Markdown: "# Pasta", Portions: 0},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			backend := &fakeBackend{}
			server := NewServer(backend, "test")

			_, _, err := server.callSaveRecipeTool(context.Background(), nil, tt.arguments)
			if err == nil {
				t.Fatal("callSaveRecipeTool() error = nil, want missing draft field error")
			}
			if backend.draftSaveCalls != 0 {
				t.Fatalf("draft save calls = %d, want none", backend.draftSaveCalls)
			}
			if backend.saveCalls != 0 || backend.updateCalls != 0 || backend.importRecipeURLCalls != 0 {
				t.Fatalf(
					"unexpected backend calls = prepared %d update %d import %d, want none",
					backend.saveCalls,
					backend.updateCalls,
					backend.importRecipeURLCalls,
				)
			}
		})
	}
}
