package com.gzzm.lobster.tool;

import com.gzzm.lobster.common.ToolResultStatus;
import org.junit.Test;

import java.util.LinkedHashMap;
import java.util.Map;

import static org.junit.Assert.*;

public class ToolResultTest {

    @Test
    public void okCarriesData() {
        Map<String, Object> data = new LinkedHashMap<>();
        data.put("k", "v");
        ToolResult r = ToolResult.ok("fine", data);
        assertEquals(ToolResultStatus.ok, r.getStatus());
        assertEquals("v", r.getData().get("k"));
        assertTrue(r.toToolMessageContent().contains("\"status\":\"ok\""));
    }

    @Test
    public void errorHasMessage() {
        ToolResult r = ToolResult.error("bad");
        assertEquals(ToolResultStatus.error, r.getStatus());
        assertEquals("bad", r.getMessage());
    }

    @Test
    public void errorDataIsIncludedInToolMessage() {
        Map<String, Object> data = new LinkedHashMap<>();
        data.put("stderr", "ReferenceError: pptxgen is not defined");
        ToolResult r = ToolResult.errorData("code_exec.script_error: exit=1", data);
        assertEquals("ReferenceError: pptxgen is not defined", r.getData().get("stderr"));
        assertTrue(r.toToolMessageContent().contains("\"data\""));
        assertTrue(r.toToolMessageContent().contains("ReferenceError"));
    }

    @Test
    public void pendingCarriesId() {
        ToolResult r = ToolResult.pending("pr_xxx", "wait");
        assertEquals(ToolResultStatus.pending, r.getStatus());
        assertEquals("pr_xxx", r.getPendingRequestId());
        assertTrue(r.toToolMessageContent().contains("pendingRequestId"));
        // 向后兼容重载默认 confirm_action
        assertEquals(com.gzzm.lobster.common.PendingRequestType.confirm_action, r.getPendingType());
    }

    @Test
    public void pendingCarriesExplicitType() {
        ToolResult r = ToolResult.pending("pr_yyy",
                com.gzzm.lobster.common.PendingRequestType.ask_user, "问补料");
        assertEquals(com.gzzm.lobster.common.PendingRequestType.ask_user, r.getPendingType());
        // type 也落进 canonical data 供 LLM transcript 里看到
        assertTrue(r.toToolMessageContent().contains("\"type\":\"ask_user\""));
    }

    /** Fix B6: 4 参重载携带真实 pending title，并把它 canonical 化进 data。 */
    @Test
    public void pendingCarriesExplicitTitle() {
        ToolResult r = ToolResult.pending("pr_zzz",
                com.gzzm.lobster.common.PendingRequestType.confirm_action,
                "覆盖原 OA 文件",               // 真实 title
                "已发出确认请求，等待用户响应"); // 通用 userMessage
        assertEquals("覆盖原 OA 文件", r.getPendingTitle());
        assertTrue(r.toToolMessageContent().contains("\"title\":\"覆盖原 OA 文件\""));
    }

    /** 3 参老重载（无 title）应回退：pendingTitle == userMessage，向后兼容。 */
    @Test
    public void pendingThreeArgFallsBackTitleToMessage() {
        ToolResult r = ToolResult.pending("pr_w",
                com.gzzm.lobster.common.PendingRequestType.ask_user, "问补料");
        assertEquals("问补料", r.getPendingTitle());
    }
}
