"""FRREP-SR008 — the public can discover + search the Open Access corpus."""

from __future__ import annotations

import itertools

import pytest
from django.test import Client
from django.urls import reverse

from apps.repository.documents.models import Document

_seq = itertools.count(1)


def _doc(collection, title, visibility):
    return Document.objects.create(
        title=title,
        collection=collection,
        status=Document.Status.PUBLISHED,
        visibility=visibility,
        public_document_id=f"PUB-{next(_seq):05d}",
    )


@pytest.mark.django_db
def test_landing_page_links_to_repository_search(client):
    resp = client.get("/")
    assert resp.status_code == 200
    assert reverse("repo_search:search") in resp.content.decode()


@pytest.mark.django_db
def test_anonymous_search_returns_only_public_docs(public_collection, restricted_collection):
    pub = _doc(public_collection, "Open maize thesis", Document.Visibility.PUBLIC_OPEN)
    restricted = _doc(restricted_collection, "Internal donor report", Document.Visibility.RESTRICTED)

    client = Client()
    resp = client.get(reverse("repo_search:search") + "?q=")
    assert resp.status_code == 200
    objs = list(resp.context["object_list"])
    assert pub in objs
    assert restricted not in objs


@pytest.mark.django_db
def test_anonymous_can_open_public_detail(public_collection):
    pub = _doc(public_collection, "Open maize thesis", Document.Visibility.PUBLIC_OPEN)
    client = Client()
    resp = client.get(reverse("repo_documents:document_detail", kwargs={"uid": pub.document_uid}))
    assert resp.status_code == 200


@pytest.mark.django_db
def test_anonymous_restricted_detail_is_blocked(restricted_collection):
    restricted = _doc(restricted_collection, "Donor report", Document.Visibility.RESTRICTED)
    client = Client()
    resp = client.get(reverse("repo_documents:document_detail", kwargs={"uid": restricted.document_uid}))
    # No bytes / metadata leak — anonymous users can't open a restricted record.
    assert resp.status_code in (302, 403)
