"""PRD §5.1 FRFA-CS019 — GrantCallDocument version history."""
from datetime import timedelta

import pytest
from django.core.files.base import ContentFile
from django.utils import timezone

from apps.rims.grants.models import GrantCall, GrantCallDocument
from apps.rims.grants.services import upload_call_document_version


def _make_call():
    return GrantCall.objects.create(
        title="Doc version call",
        slug=f"dv-{int(timezone.now().timestamp())}",
        opens_at=timezone.now() - timedelta(days=1),
        closes_at=timezone.now() + timedelta(days=10),
        status=GrantCall.Status.PUBLISHED,
    )


@pytest.mark.django_db
def test_upload_new_document_starts_at_version_one():
    call = _make_call()
    doc = upload_call_document_version(
        call, label="Guidelines", file=ContentFile(b"%PDF-1.4\n", name="g1.pdf"), is_guideline=True
    )
    assert doc.version == 1
    assert doc.superseded is False
    assert doc.supersedes is None


@pytest.mark.django_db
def test_upload_revision_supersedes_prior_and_increments_version():
    call = _make_call()
    v1 = upload_call_document_version(call, label="Guidelines", file=ContentFile(b"v1", name="g.pdf"))
    v2 = upload_call_document_version(call, label="Guidelines", file=ContentFile(b"v2", name="g.pdf"))
    v3 = upload_call_document_version(call, label="Guidelines", file=ContentFile(b"v3", name="g.pdf"))

    v1.refresh_from_db()
    v2.refresh_from_db()
    v3.refresh_from_db()

    assert v1.superseded is True
    assert v2.superseded is True
    assert v3.superseded is False
    assert v3.version == 3
    assert v3.supersedes_id == v2.pk
    assert v2.supersedes_id == v1.pk


@pytest.mark.django_db
def test_different_labels_track_independent_version_counters():
    call = _make_call()
    g1 = upload_call_document_version(call, label="Guidelines", file=ContentFile(b"x", name="g.pdf"))
    b1 = upload_call_document_version(call, label="Budget template", file=ContentFile(b"x", name="b.pdf"))
    g2 = upload_call_document_version(call, label="Guidelines", file=ContentFile(b"x", name="g.pdf"))

    assert g1.version == 1
    assert b1.version == 1  # independent counter
    assert g2.version == 2


@pytest.mark.django_db
def test_current_documents_query_excludes_superseded():
    call = _make_call()
    upload_call_document_version(call, label="A", file=ContentFile(b"x", name="a.pdf"))
    upload_call_document_version(call, label="A", file=ContentFile(b"y", name="a.pdf"))
    current = GrantCallDocument.objects.filter(call=call, superseded=False)
    assert current.count() == 1
    assert current.first().version == 2
