from django.test import TestCase
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from api.property_api.property.models.property import Property
from api.property_api.property_media.models.property_media import PropertyMedia
from common.exceptions.exceptions import custom_exception_handler


class PropertyMediaAPITestCase(APITestCase):
    def setUp(self):
        self.property_1 = Property.objects.create(name="housing",address="ctg",per_sqr_ft_price=200.00,description="beautiful")
        self.media_1 = PropertyMedia.objects.create(media_url="abc",media_type=1,property_ID=self.property_1,is_featured=True)
        self.list_url = reverse("property_media-list-create")
        self.detail_url = lambda pk: reverse("property_media-detail", kwargs={"pk": pk})

    def test_create_facility(self):
        data = {"media_url": "Restaurant","media_type":"1","property_ID":"1","is_featured":"True"}
        response = self.client.post(self.list_url, data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertTrue(PropertyMedia.objects.filter(media_url="Restaurant").exists())

    def test_list_active_media(self):
        response = self.client.get(self.list_url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data["results"]), 1)  # only active

    def test_get_media_detail(self):
        response = self.client.get(self.detail_url(self.media_1.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["media_url"], self.media_1.media_url)

    def test_get_invalid_media_detail(self):
        response = self.client.get(self.detail_url(9999))
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

    def test_update_media_detail(self):
        data = {"media_url": "School","media_type":"1","property_ID":self.property_1.id,"is_featured":True}
        response = self.client.put(self.detail_url(self.media_1.id), data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.media_1.refresh_from_db()
        self.assertEqual(self.media_1.media_url, "School")

    def test_soft_delete_media_details(self):
        response = self.client.delete(self.detail_url(self.media_1.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.media_1.refresh_from_db()
        self.assertFalse(self.media_1.is_active)
