from unittest.mock import MagicMock, patch

from django.test import SimpleTestCase

from core.geocoding import reverse_geocode_address, reverse_geocode_country_code


class NominatimReverseGeocodeTests(SimpleTestCase):
    @patch('core.geocoding.urlopen')
    def test_reverse_geocode_address_returns_display_name(self, mock_urlopen):
        payload = b'{"display_name": "Main St, Dubai, UAE", "address": {"country_code": "ae"}}'
        response = MagicMock()
        response.read.return_value = payload
        response.__enter__.return_value = response
        response.__exit__.return_value = False
        mock_urlopen.return_value = response

        self.assertEqual(
            reverse_geocode_address(25.2048, 55.2708),
            'Main St, Dubai, UAE',
        )

    @patch('core.geocoding.urlopen')
    def test_reverse_geocode_country_code_still_works(self, mock_urlopen):
        payload = b'{"display_name": "Dubai", "address": {"country_code": "ae"}}'
        response = MagicMock()
        response.read.return_value = payload
        response.__enter__.return_value = response
        response.__exit__.return_value = False
        mock_urlopen.return_value = response

        self.assertEqual(reverse_geocode_country_code(25.2, 55.2), 'AE')

    def test_reverse_geocode_address_rejects_invalid_coords(self):
        self.assertIsNone(reverse_geocode_address(None, 55.2))
        self.assertIsNone(reverse_geocode_address('bad', 55.2))
