"""P1 (assessment §3 #12 + P1.11) — FileValidator coverage on previously
unvalidated FileField targets.

Coverage:
- An oversize file rejected by FileValidator surfaces as ValidationError on
  full_clean for GrantCallDocument.file.
- MilestoneEvidence.file picks up the same validator chain.
"""
from __future__ import annotations

from datetime import timedelta
from decimal import Decimal

import pytest
from django.core.exceptions import ValidationError
from django.core.files.uploadedfile import SimpleUploadedFile
from django.utils import timezone

from apps.rims.grants.models import (
    Application,
    Award,
    AwardTranche,
    GrantCall,
    GrantCallDocument,
    MilestoneEvidence,
)


def _published_call():
    return GrantCall.objects.create(
        title="P1 validator call",
        slug=f"p1-val-{int(timezone.now().timestamp() * 1000) % 10_000_000}",
        opens_at=timezone.now(),
        closes_at=timezone.now() + timedelta(days=10),
        status=GrantCall.Status.PUBLISHED,
    )


@pytest.mark.django_db
def test_grant_call_document_rejects_unknown_extension():
    call = _published_call()
    bad = SimpleUploadedFile("payload.exe", b"MZ\x90\x00", content_type="application/octet-stream")
    doc = GrantCallDocument(call=call, label="bad", file=bad)
    with pytest.raises(ValidationError):
        doc.full_clean()


@pytest.mark.django_db
def test_milestone_evidence_rejects_unknown_extension(applicant_user):
    call = _published_call()
    application = Application.objects.create(
        call=call,
        applicant=applicant_user,
        status=Application.Status.AWARDED,
    )
    award = Award.objects.create(
        application=application,
        amount=Decimal("1000"),
        currency="USD",
        status=Award.Status.ACTIVE,
        project_end_date=(timezone.now() + timedelta(days=365)).date(),
    )
    tranche = AwardTranche.objects.create(
        award=award,
        label="T1",
        amount=Decimal("500"),
    )
    bad = SimpleUploadedFile("evidence.xyz", b"abc", content_type="application/octet-stream")
    evidence = MilestoneEvidence(tranche=tranche, file=bad, summary="bad type")
    with pytest.raises(ValidationError):
        evidence.full_clean()
