"""The expectation mappers: every declared result becomes the same `Answer`
a free-shape question produces, and a forced shape that found nothing comes
back `unanswerable` rather than as an empty figure."""

from quber.playground.answers.declared import DeclaredProse, DeclaredScalar
from quber.playground.answers.expectation import prose_answer, scalar_answer
from quber.playground.answers.shapes import Prose, Scalar, Unanswerable


def test_scalar_maps_to_scalar_payload():
    result = DeclaredScalar(value="6.7 %", unit="percent", period="Q1 2026", cited_ids=["t1-2-3"])
    answer = scalar_answer(result)
    assert isinstance(answer.payload, Scalar)
    assert answer.payload.value == "6.7 %"
    assert answer.payload.unit == "percent"
    assert answer.cited_ids == ["t1-2-3"]


def test_scalar_not_found_becomes_unanswerable():
    result = DeclaredScalar(value="", not_found="the context lacks it", cited_ids=[])
    answer = scalar_answer(result)
    assert isinstance(answer.payload, Unanswerable)
    assert answer.payload.reason == "the context lacks it"


def test_prose_maps_to_prose_payload():
    answer = prose_answer(DeclaredProse(text="margins compressed", cited_ids=["c9"]))
    assert isinstance(answer.payload, Prose)
    assert answer.payload.text == "margins compressed"
    assert answer.cited_ids == ["c9"]


def test_prose_not_found_without_text_becomes_unanswerable():
    answer = prose_answer(DeclaredProse(text="", not_found="nothing on this"))
    assert isinstance(answer.payload, Unanswerable)


def test_prose_with_text_keeps_text_even_when_not_found_is_set():
    answer = prose_answer(DeclaredProse(text="partial reading", not_found="incomplete"))
    assert isinstance(answer.payload, Prose)
