"""FRREP-INT009 — RimsIngestView is an inbound path and previously never wrote
an IntegrationOutbox row, so the integration-status dashboard always showed
0 sent / no last-sync for RIMS even while ingestion was actively succeeding
or failing. These tests pin the fix: every ingest attempt (success or
validation failure) leaves a row behind.
"""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from django.test import Client
from django.urls import reverse

from apps.repository.documents.models import Document, IntegrationOutbox

User = get_user_model()


@pytest.fixture
def rims_service_account(db):
    return User.objects.create_superuser(
        email="rims.service@test.example", password="pw-test-1234"
    )


@pytest.mark.django_db(transaction=True)
def test_rims_ingest_success_logs_sent_outbox_row(
    rims_service_account, public_collection, sample_pdf
):
    client = Client()
    client.force_login(rims_service_account)
    resp = client.post(
        reverse("repo_integration:rims_ingest"),
        data={
            "title": "INT009 close-out report",
            "grant_reference": "RU/2024/INT009",
            "document_type": Document.DocumentType.TECHNICAL_REPORT,
            "researcher_name": "Jane Researcher",
            "collection_slug": public_collection.slug,
            "file": sample_pdf,
        },
    )
    assert resp.status_code == 201, resp.content
    row = IntegrationOutbox.objects.filter(
        target=IntegrationOutbox.Target.RIMS
    ).order_by("-created_at").first()
    assert row is not None
    assert row.status == IntegrationOutbox.Status.SENT
    assert row.sent_at is not None


@pytest.mark.django_db(transaction=True)
def test_rims_ingest_validation_failure_logs_failed_outbox_row(rims_service_account):
    client = Client()
    client.force_login(rims_service_account)
    resp = client.post(
        reverse("repo_integration:rims_ingest"),
        data={},
    )
    assert resp.status_code == 400
    row = IntegrationOutbox.objects.filter(
        target=IntegrationOutbox.Target.RIMS
    ).order_by("-created_at").first()
    assert row is not None
    assert row.status == IntegrationOutbox.Status.FAILED
    assert row.error
