from django.contrib.auth import get_user_model
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase

from core.forms import ListingForm, MultipleFileInput
from core.models import Category, Listing, Conversation


class ListingFormTests(TestCase):
    def test_listing_form_uses_multi_file_widget_for_photos(self):
        Category.objects.create(name="Apartments", slug="apartments", is_active=True)

        form = ListingForm()

        self.assertIn("photos", form.fields)
        self.assertIsInstance(form.fields["photos"].widget, MultipleFileInput)
        self.assertTrue(form.fields["photos"].widget.allow_multiple_selected)

    def test_listing_form_accepts_multiple_photo_uploads(self):
        category = Category.objects.create(name="Apartments", slug="apartments", is_active=True)
        files = [
            SimpleUploadedFile(f"photo{i}.jpg", b"img-data", content_type="image/jpeg")
            for i in range(4)
        ]

        form = ListingForm(data={
            "category": category.pk,
            "title": "Cozy apartment",
            "description": "A great place to stay",
            "purpose": Listing.PURPOSE_RENT,
            "address": "123 Main Street",
            "price": "100",
            "currency": "USD",
        }, files={"photos": files})

        self.assertTrue(form.is_valid(), form.errors)
        self.assertEqual(len(form.cleaned_data["photos"]), 4)


class MessagingViewTests(TestCase):
    def test_conversation_start_allows_get_requests_for_authenticated_users(self):
        User = get_user_model()
        lister = User.objects.create_user(username="lister", email="lister@example.com", password="secret123")
        buyer = User.objects.create_user(username="buyer", email="buyer@example.com", password="secret123")

        category = Category.objects.create(name="Apartments", slug="apartments", is_active=True)
        listing = Listing.objects.create(
            lister=lister,
            category=category,
            title="Lovely apartment",
            description="A nice place",
            address="123 Main Street",
            status=Listing.STATUS_ACTIVE,
        )

        self.client.login(username="buyer", password="secret123")
        response = self.client.get(f"/listings/{listing.slug}/message/")

        self.assertEqual(response.status_code, 302)
        self.assertTrue(Conversation.objects.filter(listing=listing, participants=buyer).exists())
