"""Tests for the TableUnifier Protocol and its implementations."""

import asyncio
from pathlib import Path

import pytest

from quber.agents.unifier import (
    CandidateInput,
    MockUnifier,
    TableUnifier,
    UnifiedTable,
    UnifierResult,
    get_unifier,
)


def test_mock_satisfies_protocol():
    assert isinstance(MockUnifier(), TableUnifier)


def test_mock_passthrough_keeps_each_candidate():
    candidates = [
        CandidateInput(candidate_id="lattice-p1-0", markdown="| a |\n|---|\n| 1 |"),
        CandidateInput(candidate_id="stream-p1-0", markdown="| b |\n|---|\n| 2 |"),
    ]
    out = asyncio.run(MockUnifier().unify(Path("page.png"), candidates))
    assert isinstance(out, UnifierResult)
    assert len(out.tables) == 2
    assert out.tables[0].source_candidate_ids == ["lattice-p1-0"]
    assert out.tables[1].source_candidate_ids == ["stream-p1-0"]


def test_mock_passthrough_empty_candidates():
    out = asyncio.run(MockUnifier().unify(Path("page.png"), []))
    assert out.tables == []


def test_mock_injected_result_combines():
    forced = UnifierResult(
        tables=[
            UnifiedTable(
                markdown="| unified |\n|---|\n| x |",
                source_candidate_ids=["lattice-p1-0", "stream-p1-0"],
            )
        ]
    )
    out = asyncio.run(MockUnifier(forced).unify(Path("p.png"), []))
    assert out is forced
    assert out.tables[0].source_candidate_ids == ["lattice-p1-0", "stream-p1-0"]


def test_get_unifier_mock():
    assert isinstance(get_unifier("mock"), MockUnifier)


def test_get_unifier_unknown_raises():
    with pytest.raises(ValueError):
        get_unifier("bogus")  # type: ignore[arg-type]
