# documents/tests/test_documents.py

import pytest
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient
from users.models import User
from documents.models import Document, Folder, DocumentVersion
from django.core.files.uploadedfile import SimpleUploadedFile


@pytest.mark.django_db
def test_list_documents_returns_only_accessible():
    user1 = User.objects.create_user(
        email="user1@test.com", name="User1", password="pass123"
    )
    folder = Folder.objects.create(name="Privada", created_by=user1, is_public=False)
    doc_public = Document.objects.create(name="Doc Público", created_by=user1, is_public=True)
    doc_private = Document.objects.create(name="Doc Privado", created_by=user1, folder=folder, is_public=False)

    client = APIClient()
    client.force_authenticate(user=user1)

    url = reverse("document-list")
    response = client.get(url)

    assert response.status_code == status.HTTP_200_OK
    ids = [d["id"] for d in response.data]
    assert doc_public.id in ids
    assert doc_private.id in ids  # porque es creador


@pytest.mark.django_db
def test_add_user_access_success():
    owner = User.objects.create_user(email="owner@test.com", name="Owner", password="pass123", can_edit_documents=True)
    other = User.objects.create_user(email="other@test.com", name="Other", password="pass123", can_edit_documents=True)
    doc = Document.objects.create(name="Documento1", created_by=owner, is_public=False)

    client = APIClient()
    client.force_authenticate(user=owner)

    url = reverse("document-add-user-access", args=[doc.id])
    response = client.post(url, {"user_id": other.id}, format="json")

    assert response.status_code == status.HTTP_200_OK
    doc.refresh_from_db()
    assert other in doc.allowed_users.all()


@pytest.mark.django_db
def test_add_user_access_requires_permission():
    owner = User.objects.create_user(email="owner@test.com", name="Owner", password="pass123", can_edit_documents=True)
    other = User.objects.create_user(email="other@test.com", name="Other", password="pass123")
    doc = Document.objects.create(name="Documento1", created_by=owner, is_public=False)

    client = APIClient()
    client.force_authenticate(user=other)

    url = reverse("document-add-user-access", args=[doc.id])
    response = client.post(url, {"user_id": owner.id}, format="json")

    assert response.status_code == status.HTTP_403_FORBIDDEN


@pytest.mark.django_db
def test_add_user_access_user_not_found():
    owner = User.objects.create_user(email="owner@test.com", name="Owner", password="pass123", can_edit_documents=True)
    doc = Document.objects.create(name="Documento1", created_by=owner, is_public=False)

    client = APIClient()
    client.force_authenticate(user=owner)

    url = reverse("document-add-user-access", args=[doc.id])
    response = client.post(url, {"user_id": 999}, format="json")

    assert response.status_code == status.HTTP_404_NOT_FOUND


@pytest.mark.django_db
def test_remove_user_access_success():
    owner = User.objects.create_user(email="owner@test.com", name="Owner", password="pass123", can_edit_documents=True)
    other = User.objects.create_user(email="other@test.com", name="Other", password="pass123")
    doc = Document.objects.create(name="Documento1", created_by=owner, is_public=False)
    doc.allowed_users.add(other)

    client = APIClient()
    client.force_authenticate(user=owner)

    url = reverse("document-remove-user-access", args=[doc.id])
    response = client.post(url, {"user_id": other.id}, format="json")

    assert response.status_code == status.HTTP_200_OK
    doc.refresh_from_db()
    assert other not in doc.allowed_users.all()


@pytest.mark.django_db
def test_versions_returns_document_versions():
    owner = User.objects.create_user(email="owner@test.com", name="Owner", password="pass123")
    doc = Document.objects.create(name="Documento1", created_by=owner, is_public=True)
    DocumentVersion.objects.create(document=doc, version_number=1, created_by=owner, file="dummy.txt")
    DocumentVersion.objects.create(document=doc, version_number=2, created_by=owner, file="dummy2.txt")

    client = APIClient()
    client.force_authenticate(user=owner)

    url = reverse("document-versions", args=[doc.id])
    response = client.get(url)

    assert response.status_code == status.HTTP_200_OK
    assert len(response.data) == 2


@pytest.mark.django_db
def test_create_version_success():
    owner = User.objects.create_user(
        email="owner@test.com", name="Owner", password="pass123", can_edit_documents=True
    )
    doc = Document.objects.create(name="Documento1", created_by=owner, is_public=True)

    client = APIClient()
    client.force_authenticate(user=owner)

    file = SimpleUploadedFile("dummy.txt", b"contenido de prueba", content_type="text/plain")

    url = reverse("document-create-version", args=[doc.id])
    response = client.post(
        url,
        {"file": file, "comment": "Primera versión"},
        format="multipart"
    )

    assert response.status_code == status.HTTP_201_CREATED
    assert DocumentVersion.objects.filter(document=doc).count() == 1