from django.contrib.auth import get_user_model
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework_simplejwt.tokens import RefreshToken

from .models import Country, State, City

User = get_user_model()


class MasterDataAPITests(APITestCase):
    def setUp(self):
        # Create user
        self.user = User.objects.create_user(
            email="testuser@ta-ats.local",
            password="testpassword",
            first_name="Test",
            last_name="User",
        )
        self.user.role = "ADMIN"
        self.user.is_superuser = True
        self.user.is_staff = True
        self.user.save()

        # Generate JWT and apply to client
        token = RefreshToken.for_user(self.user)
        self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {token.access_token}")

        # Seed test data
        self.country = Country.objects.create(
            name="Testland",
            iso2="TL",
            iso3="TSL",
            phone_code="+999",
            region="Test Region",
            subregion="Test Subregion",
            status=1,
        )

        self.state = State.objects.create(
            name="Stateland",
            country=self.country,
            country_code="TL",
        )

        self.city = City.objects.create(
            name="Cityville",
            country=self.country,
            state=self.state,
            country_code="TL",
        )

    def test_list_countries(self):
        url = reverse("countries-list")
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertTrue(response.data["success"])
        results = response.data["data"]["results"]
        self.assertEqual(len(results), 1)
        self.assertEqual(results[0]["name"], "Testland")
        self.assertEqual(results[0]["iso2"], "TL")
        self.assertEqual(results[0]["iso3"], "TSL")
        self.assertEqual(results[0]["phone_code"], "+999")
        self.assertEqual(results[0]["region"], "Test Region")
        self.assertEqual(results[0]["subregion"], "Test Subregion")
        self.assertEqual(results[0]["status"], 1)

    def test_list_states(self):
        url = reverse("states-list")
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        results = response.data["data"]["results"]
        self.assertEqual(len(results), 1)
        self.assertEqual(results[0]["name"], "Stateland")
        self.assertEqual(results[0]["country_code"], "TL")
        self.assertEqual(results[0]["country_name"], "Testland")

    def test_list_cities(self):
        url = reverse("cities-list")
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        results = response.data["data"]["results"]
        self.assertEqual(len(results), 1)
        self.assertEqual(results[0]["name"], "Cityville")
        self.assertEqual(results[0]["country_code"], "TL")
        self.assertEqual(results[0]["country_name"], "Testland")
        self.assertEqual(results[0]["state_name"], "Stateland")
