import pytest
from django.contrib.auth import get_user_model
from apps.publications.models import Publication, PublicationCategory, Author, Submission, ExternalPublication
from apps.companies.models import Organization


@pytest.fixture
def user(db):
    User = get_user_model()
    return User.objects.create_user(email="pub@example.com", password="pass123")


@pytest.fixture
def organization(db):
    return Organization.objects.create(name="Test Org")


@pytest.fixture
def category(db, organization):
    return PublicationCategory.objects.create(organization=organization, name="Technology")


@pytest.mark.django_db
class TestPublicationCategoryModel:
    def test_create_category(self, organization):
        cat = PublicationCategory.objects.create(organization=organization, name="Science")
        assert cat.slug == "science"


@pytest.mark.django_db
class TestPublicationModel:
    def test_create_publication(self, user, category, organization):
        pub = Publication.objects.create(
            organization=organization,
            title="AI Trends 2026",
            content="Article content...",
            author=user,
            category=category
        )
        assert pub.status == "draft"


@pytest.mark.django_db
class TestAuthorModel:
    def test_create_author(self, user, organization):
        author = Author.objects.create(
            organization=organization,
            user=user,
            bio="Tech writer"
        )
        assert author.bio == "Tech writer"


@pytest.mark.django_db
class TestSubmissionModel:
    def test_create_submission(self, user, category, organization):
        pub = Publication.objects.create(
            organization=organization,
            title="Research Paper",
            content="Research content",
            author=user,
            category=category
        )
        submission = Submission.objects.create(
            organization=organization,
            publication=pub,
            submitted_by=user
        )
        assert submission.status == "submitted"


@pytest.mark.django_db
class TestExternalPublicationModel:
    def test_create_external_publication(self, organization):
        ext_pub = ExternalPublication.objects.create(
            organization=organization,
            title="Industry Report 2025",
            source="Research Firm",
            url="https://example.com/report"
        )
        assert ext_pub.source == "Research Firm"