from hef.catalog import Record, validate
from hef.selection import Coordinate
from tools.review import approve, proposed_records


def make_record(**o):
    base = dict(
        id="a",
        title="t",
        source_url="u",
        source_archive="nasa",
        license="public_domain",
        mode="video",
        left=0,
        right=0,
        dark=0,
        light=0,
        duration_s=1,
        file_path="p",
    )
    base.update(o)
    return Record(**base)


def test_proposed_records_filters():
    a = make_record(id="a", review_status="proposed")
    b = make_record(id="b", review_status="approved")
    assert [r.id for r in proposed_records([a, b])] == ["a"]


def test_approve_sets_status_and_timestamp():
    r = make_record(review_status="proposed")
    out = approve(r, reviewed_at="2026-06-04T13:00:00+00:00")
    assert out.review_status == "approved"
    assert out.reviewed_at == "2026-06-04T13:00:00+00:00"


def test_approve_can_override_coordinates():
    r = make_record(left=0, right=0, dark=0, light=0, review_status="proposed")
    out = approve(r, reviewed_at="t", coordinate=Coordinate(4, 1, 2, 3))
    assert (out.left, out.right, out.dark, out.light) == (4, 1, 2, 3)


def test_approve_does_not_mutate_input():
    r = make_record(review_status="proposed")
    approve(r, reviewed_at="t")
    assert r.review_status == "proposed" and r.reviewed_at is None


def test_approve_can_set_rationale():
    r = make_record(review_status="proposed", rationale="auto")
    out = approve(r, reviewed_at="t", rationale="human note")
    assert out.rationale == "human note"


def test_approved_record_revalidates():
    r = make_record(review_status="proposed")
    out = approve(r, reviewed_at="t", coordinate=Coordinate(2, 2, 1, 1))
    validate(out)  # must not raise
