package com.gzzm.lobster.runtime;

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

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

/**
 * 验证 SSE pending_request 事件带 type / toolName 字段。
 *
 * <p>回归 review 里的 B4：前端依赖 SSE 直接拿到 type 才能决定弹窗形态，
 * 不再走 REST 补齐（fallback 仅用于 prompt 详情）。
 */
public class PendingStreamEventTest {

    @Test
    public void pendingFrameContainsTypeAndToolName() {
        List<StreamEvent> captured = new ArrayList<>();
        StreamEmitter emitter = captured::add;

        emitter.pendingRequest("th_1", "run_1", "pr_x",
                "confirm_action", "是否覆盖原文件？", "save_to_oa");

        assertEquals(1, captured.size());
        StreamEvent e = captured.get(0);
        assertEquals(StreamEventType.pending_request, e.getType());
        assertEquals("pr_x", e.getPayload().get("pendingRequestId"));
        assertEquals("confirm_action", e.getPayload().get("type"));
        assertEquals("save_to_oa", e.getPayload().get("toolName"));
        assertEquals("是否覆盖原文件？", e.getPayload().get("title"));
    }

    @Test
    public void backCompatOverloadPassesNullsForNewFields() {
        List<StreamEvent> captured = new ArrayList<>();
        StreamEmitter emitter = captured::add;

        emitter.pendingRequest("th_1", "run_1", "pr_y", "需要您的响应");

        assertEquals(1, captured.size());
        StreamEvent e = captured.get(0);
        // 旧签名里 type / toolName 应显式为 null（前端兜底正则可接管）
        assertNull(e.getPayload().get("type"));
        assertNull(e.getPayload().get("toolName"));
        assertEquals("需要您的响应", e.getPayload().get("title"));
    }

    @Test
    public void sseFrameSerializationRetainsType() {
        List<StreamEvent> captured = new ArrayList<>();
        StreamEmitter emitter = captured::add;
        emitter.pendingRequest("th_1", "run_1", "pr_z",
                "ask_user", "请补充信息", "ask_user");
        String frame = captured.get(0).toSseFrame();
        assertTrue(frame.startsWith("event: pending_request\n"));
        assertTrue(frame.contains("\"type\":\"ask_user\""));
        assertTrue(frame.contains("\"toolName\":\"ask_user\""));
    }
}
