"""
Tests for BorderEffect.
"""

from engine.effects.plugins.border import BorderEffect
from engine.effects.types import EffectContext


def make_ctx(terminal_width: int = 80, terminal_height: int = 24) -> EffectContext:
    """Create a mock EffectContext."""
    return EffectContext(
        terminal_width=terminal_width,
        terminal_height=terminal_height,
        scroll_cam=0,
        ticker_height=terminal_height,
    )


class TestBorderEffect:
    """Tests for BorderEffect."""

    def test_basic_init(self):
        """BorderEffect initializes with defaults."""
        effect = BorderEffect()
        assert effect.name == "border"
        assert effect.config.enabled is True

    def test_adds_border(self):
        """BorderEffect adds border around content."""
        effect = BorderEffect()
        buf = [
            "Hello World",
            "Test Content",
            "Third Line",
        ]
        ctx = make_ctx(terminal_width=20, terminal_height=10)

        result = effect.process(buf, ctx)

        # Should have top and bottom borders
        assert len(result) >= 3
        # First line should start with border character
        assert result[0][0] in "┌┎┍"
        # Last line should end with border character
        assert result[-1][-1] in "┘┖┚"

    def test_border_with_small_buffer(self):
        """BorderEffect handles small buffer (too small for border)."""
        effect = BorderEffect()
        buf = ["ab"]  # Too small for proper border
        ctx = make_ctx(terminal_width=10, terminal_height=5)

        result = effect.process(buf, ctx)

        # Should still try to add border but result may differ
        # At minimum should have output
        assert len(result) >= 1

    def test_metrics_in_border(self):
        """BorderEffect includes FPS and frame time in border."""
        effect = BorderEffect()
        buf = ["x" * 10] * 5
        ctx = make_ctx(terminal_width=20, terminal_height=10)

        # Add metrics to context
        ctx.set_state(
            "metrics",
            {
                "avg_ms": 16.5,
                "frame_count": 100,
                "fps": 60.0,
            },
        )

        result = effect.process(buf, ctx)

        # Check for FPS in top border
        top_line = result[0]
        assert "FPS" in top_line or "60" in top_line

        # Check for frame time in bottom border
        bottom_line = result[-1]
        assert "ms" in bottom_line or "16" in bottom_line

    def test_no_metrics(self):
        """BorderEffect works without metrics."""
        effect = BorderEffect()
        buf = ["content"] * 5
        ctx = make_ctx(terminal_width=20, terminal_height=10)
        # No metrics set

        result = effect.process(buf, ctx)

        # Should still have border characters
        assert len(result) >= 3
        assert result[0][0] in "┌┎┍"

    def test_crops_before_bordering(self):
        """BorderEffect crops input before adding border."""
        effect = BorderEffect()
        buf = ["x" * 100] * 50  # Very large buffer
        ctx = make_ctx(terminal_width=20, terminal_height=10)

        result = effect.process(buf, ctx)

        # Should be cropped to fit, then bordered
        # Result should be <= terminal_height with border
        assert len(result) <= ctx.terminal_height
        # Each line should be <= terminal_width
        for line in result:
            assert len(line) <= ctx.terminal_width
