using ClaudeDo.Ui.Helpers;

namespace ClaudeDo.Ui.Tests.Helpers;

public class StreamLineFormatterTests
{
    private readonly StreamLineFormatter _formatter = new();

    // --- Assistant text blocks ---

    [Fact]
    public void FormatLine_AssistantTextBlock_ReturnsTextContent()
    {
        var line = """{"type":"assistant","message":{"content":[{"type":"text","text":"Hello world"}]}}""";
        Assert.Equal("Hello world\n", _formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_AssistantConsecutiveTextBlocks_ReturnEachAppended()
    {
        var line1 = """{"type":"assistant","message":{"content":[{"type":"text","text":"Hello "}]}}""";
        var line2 = """{"type":"assistant","message":{"content":[{"type":"text","text":"world"}]}}""";
        Assert.Equal("Hello \n", _formatter.FormatLine(line1));
        Assert.Equal("world\n", _formatter.FormatLine(line2));
    }

    [Fact]
    public void FormatLine_AssistantThinkingBlock_IsFiltered()
    {
        var line = """{"type":"assistant","message":{"content":[{"type":"thinking","text":"hidden"}]}}""";
        Assert.Null(_formatter.FormatLine(line));
    }

    // --- Tool use, result, system, fallback ---

    [Fact]
    public void FormatLine_AssistantToolUseBlock_ReturnsToolNameLine()
    {
        var line = """{"type":"assistant","message":{"content":[{"type":"tool_use","id":"x","name":"Bash","input":{"command":"ls"}}]}}""";
        Assert.Equal("[Bash] $ ls\n", _formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_InputJsonDelta_ReturnsNull()
    {
        var line = """{"type":"stream_event","event":{"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"cmd\":"}}}""";
        Assert.Null(_formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_Result_ReturnsFormattedResult()
    {
        var line = """{"type":"result","result":"Done."}""";
        Assert.Equal("\n--- Result ---\nDone.\n", _formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_ApiRetry_ReturnsRetryNotice()
    {
        var line = """{"type":"system","subtype":"api_retry"}""";
        Assert.Equal("[Retrying API call...]\n", _formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_SystemUnknownSubtype_ReturnsNull()
    {
        var line = """{"type":"system","subtype":"some_unknown_subtype"}""";
        Assert.Null(_formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_AssistantType_ReturnsNull()
    {
        var line = """{"type":"assistant","message":{}}""";
        Assert.Null(_formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_MalformedJson_ReturnsRawLine()
    {
        var line = "not json at all";
        Assert.Equal("not json at all", _formatter.FormatLine(line));
    }

    [Fact]
    public void FormatLine_MessageStartAndDelta_ReturnsNull()
    {
        var start = """{"type":"stream_event","event":{"type":"message_start","message":{}}}""";
        var delta = """{"type":"stream_event","event":{"type":"message_delta","delta":{}}}""";
        Assert.Null(_formatter.FormatLine(start));
        Assert.Null(_formatter.FormatLine(delta));
    }

    // --- Trim ---
}
