package com.gzzm.lobster.tool;

import com.gzzm.lobster.common.ToolCategory;
import com.gzzm.lobster.common.ToolRiskLevel;
import com.gzzm.lobster.llm.ToolSpec;
import org.junit.Before;
import org.junit.Test;

import java.util.Collections;
import java.util.List;

import static org.junit.Assert.*;

/**
 * ToolRegistry 基本注册 + 查询契约。
 */
public class ToolRegistryTest {

    private ToolRegistry registry;

    @Before
    public void setup() {
        registry = new ToolRegistry();
    }

    @Test
    public void registerAndFind() {
        BuiltinToolDefinition d = BuiltinToolDefinition.builder()
                .name("t1")
                .displayName("Test Tool")
                .description("test")
                .category(ToolCategory.WORKSPACE)
                .risk(ToolRiskLevel.READ_ONLY)
                .inputSchema(Collections.emptyMap())
                .build();
        registry.register(d, (ctx, args) -> ToolResult.ok("done", null));
        assertNotNull(registry.find("t1"));
        assertEquals("t1", registry.find("t1").getToolName());
    }

    @Test
    public void toToolSpecsIncludesAllRegistered() {
        for (int i = 0; i < 3; i++) {
            String name = "tool" + i;
            BuiltinToolDefinition d = BuiltinToolDefinition.builder()
                    .name(name)
                    .category(ToolCategory.WORKSPACE)
                    .risk(ToolRiskLevel.READ_ONLY)
                    .description("d")
                    .inputSchema(Collections.emptyMap())
                    .build();
            registry.register(d, (ctx, args) -> ToolResult.ok("ok", null));
        }
        List<ToolSpec> specs = registry.toToolSpecs(null);
        assertEquals(3, specs.size());
    }

    @Test
    public void filterByCategoryWorks() {
        BuiltinToolDefinition ws = BuiltinToolDefinition.builder()
                .name("ws").category(ToolCategory.WORKSPACE)
                .risk(ToolRiskLevel.READ_ONLY).description("")
                .build();
        BuiltinToolDefinition mem = BuiltinToolDefinition.builder()
                .name("mem").category(ToolCategory.MEMORY)
                .risk(ToolRiskLevel.READ_ONLY).description("")
                .build();
        registry.register(ws, (ctx, args) -> ToolResult.ok(null, null));
        registry.register(mem, (ctx, args) -> ToolResult.ok(null, null));
        assertEquals(1, registry.byCategory(ToolCategory.WORKSPACE).size());
        assertEquals(1, registry.byCategory(ToolCategory.MEMORY).size());
    }
}
