from datetime import datetime, timedelta, timezone

from db.channel_readiness_cache import cache_meta, readiness_api_payload, readiness_row_snapshot, readiness_scope_key
from db.models import ChannelPipelineReadiness


def test_readiness_scope_key_is_stable():
    key_a = readiness_scope_key(only_assigned=True)
    key_b = readiness_scope_key(only_assigned=True, connection_id=None)
    assert key_a == key_b
    assert "assigned=1" in key_a


def test_cache_meta_marks_old_ready_rows_as_stale():
    row = ChannelPipelineReadiness(
        channel_code="magento",
        scope_key="assigned=1|conn=|magento=|shopify=",
        status="ready",
        computed_at=datetime.now(timezone.utc) - timedelta(hours=5),
    )
    meta = cache_meta(row)
    assert meta["state"] == "stale"


def test_readiness_api_payload_hides_stale_report_while_recompute_queued():
    from datetime import datetime, timedelta, timezone

    from db.channel_readiness_cache import readiness_api_payload

    requested = datetime.now(timezone.utc)
    computed = requested - timedelta(hours=1)
    snapshot = {
        "status": "queued",
        "computed_at": computed,
        "refresh_requested_at": requested,
        "refresh_started_at": None,
        "last_error": None,
        "report": {
            "ready": False,
            "blockers": ["critical_attribute_mappings_incomplete"],
            "checks": {},
            "samples": {},
        },
    }
    payload = readiness_api_payload(snapshot=snapshot)
    assert payload["blockers"] == ["readiness_cache_not_ready"]
    assert payload["status"] == "pending"


def test_readiness_api_payload_uses_snapshot_after_detach():
    row = ChannelPipelineReadiness(
        channel_code="shopify",
        scope_key="assigned=1|conn=|magento=|shopify=",
        status="ready",
        computed_at=datetime.now(timezone.utc),
        report={"ready": True, "blockers": [], "checks": {}, "samples": {}},
    )
    snapshot = readiness_row_snapshot(row)
    payload = readiness_api_payload(snapshot=snapshot)
    assert payload["ready"] is True
    assert payload["cache"]["state"] == "ready"
