import pytest
from django.contrib.auth import get_user_model
from datetime import datetime, timedelta
from apps.activities.models import Activity
from apps.contacts.models import Contact
from apps.companies.models import Company, Organization


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


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


@pytest.fixture
def contact(db, user, organization):
    return Contact.objects.create(
        organization=organization,
        name="John Doe",
        email="john@example.com",
        created_by=user
    )


@pytest.fixture
def company(db, user, organization):
    return Company.objects.create(
        organization=organization,
        name="Acme Corp",
        created_by=user
    )


@pytest.mark.django_db
class TestActivityModel:
    def test_create_activity(self, user, contact, organization):
        activity = Activity.objects.create(
            organization=organization,
            title="Sales Call",
            activity_type="call",
            description="Discussed new product",
            contact=contact,
            user=user
        )
        assert activity.title == "Sales Call"
        assert activity.activity_type == "call"
        assert activity.is_completed is False

    def test_activity_types(self, user, contact, organization):
        Activity.objects.create(organization=organization, title="Call", activity_type="call", contact=contact, user=user)
        Activity.objects.create(organization=organization, title="Email", activity_type="email", contact=contact, user=user)
        Activity.objects.create(organization=organization, title="Meeting", activity_type="meeting", contact=contact, user=user)
        assert Activity.objects.filter(activity_type="call").count() == 1
        assert Activity.objects.filter(activity_type="email").count() == 1
        assert Activity.objects.filter(activity_type="meeting").count() == 1

    def test_activity_completion(self, user, contact, organization):
        activity = Activity.objects.create(
            organization=organization,
            title="Follow up",
            activity_type="task",
            contact=contact,
            user=user
        )
        activity.is_completed = True
        activity.completed_at = datetime.now()
        activity.save()
        activity.refresh_from_db()
        assert activity.is_completed is True
        assert activity.completed_at is not None

    def test_activity_with_due_date(self, user, contact, organization):
        due = datetime.now() + timedelta(days=7)
        activity = Activity.objects.create(
            organization=organization,
            title="Deadline Task",
            activity_type="deadline",
            contact=contact,
            user=user,
            due_date=due
        )
        assert activity.due_date == due

    def test_activity_linked_to_company(self, user, company, organization):
        activity = Activity.objects.create(
            organization=organization,
            title="Company Meeting",
            activity_type="meeting",
            company=company,
            user=user
        )
        assert activity.company == company
        assert activity.contact is None

    def test_activity_metadata(self, user, contact, organization):
        metadata = {"priority": "high", "category": "sales"}
        activity = Activity.objects.create(
            organization=organization,
            title="Important Call",
            activity_type="call",
            contact=contact,
            user=user,
            metadata=metadata
        )
        assert activity.metadata == {"priority": "high", "category": "sales"}
