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.agent.models.agent import Agent


class AgentAPITestCase(APITestCase):
    def setUp(self):
        self.agent_1 = Agent.objects.create(name="Bangladesh", email="BD@gmail.com", contact_no="01987564455")
        self.list_url = reverse("agents-list-create")
        self.detail_url = lambda pk: reverse("agent-detail", kwargs={"pk": pk})

    def test_create_agent(self):
        data = {"name": "Nepal", "email": "NP1820@gmail.com","contact_no":"01987564455"}
        response = self.client.post(self.list_url, data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertTrue(Agent.objects.filter(name="Nepal").exists())

    def test_list_active_agents(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_agent_detail(self):
        response = self.client.get(self.detail_url(self.agent_1.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data["name"], self.agent_1.name)

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

    def test_update_agent(self):
        data = {"name": "Bangla", "email": "BD1802@gmail.com", "contact_no":"01987564455"}
        response = self.client.put(self.detail_url(self.agent_1.id), data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.agent_1.refresh_from_db()
        self.assertEqual(self.agent_1.name, "Bangla")

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