from django.test import Client, TestCase

from home.geo import (
    compose_job_location,
    compose_location,
    get_cities,
    get_regions,
    parse_location,
    region_valid,
)


class GeoServiceTests(TestCase):
    def test_zambia_regions_include_lusaka(self):
        names = {region['name'] for region in get_regions('ZM')}
        self.assertIn('Lusaka Province', names)

    def test_zambia_lusaka_cities_include_lusaka(self):
        cities = get_cities('ZM', 'Lusaka Province')
        self.assertIn('Lusaka', cities)

    def test_legacy_lusaka_region_alias_still_resolves(self):
        self.assertTrue(region_valid('ZM', 'Lusaka'))
        cities = get_cities('ZM', 'Lusaka')
        self.assertIn('Lusaka', cities)

    def test_compose_and_parse_location(self):
        text = compose_location('Lusaka', 'Lusaka Province', 'ZM')
        self.assertEqual(text, 'Lusaka, Lusaka Province, Zambia')
        parsed = parse_location(text)
        self.assertEqual(parsed['country'], 'ZM')
        self.assertEqual(parsed['region'], 'Lusaka Province')
        self.assertEqual(parsed['city'], 'Lusaka')

    def test_region_valid(self):
        self.assertTrue(region_valid('ZM', 'Lusaka Province'))
        self.assertTrue(region_valid('ZM', 'Copperbelt'))
        self.assertFalse(region_valid('ZM', 'Invalid Region'))

    def test_parse_legacy_remote_location(self):
        parsed = parse_location('Remote')
        self.assertEqual(parsed['country'], 'ZM')
        self.assertEqual(parsed['region'], '')
        self.assertEqual(parsed['city'], '')

    def test_parse_remote_prefixed_location(self):
        parsed = parse_location('Remote · Lusaka, Lusaka, Zambia')
        self.assertEqual(parsed['country'], 'ZM')
        self.assertEqual(parsed['region'], 'Lusaka Province')
        self.assertEqual(parsed['city'], 'Lusaka')

    def test_compose_multi_region_location(self):
        text = compose_job_location('', ['Lusaka Province', 'Copperbelt Province'], 'ZM')
        self.assertEqual(text, 'Lusaka Province & Copperbelt Province · Zambia')

    def test_compose_multi_region_location_with_optional_city(self):
        text = compose_job_location(
            'Head office',
            ['Lusaka Province', 'Copperbelt Province', 'Eastern Province'],
            'ZM',
        )
        self.assertEqual(
            text,
            'Head office · Lusaka Province, Copperbelt Province & Eastern Province · Zambia',
        )


class GeoApiTests(TestCase):
    def setUp(self):
        self.client = Client()

    def test_regions_api(self):
        response = self.client.get('/api/geo/regions/', {'country': 'ZM'})
        self.assertEqual(response.status_code, 200)
        data = response.json()
        self.assertTrue(any(item['name'] == 'Lusaka Province' for item in data['regions']))

    def test_cities_api(self):
        response = self.client.get('/api/geo/cities/', {'country': 'ZM', 'region': 'Lusaka Province'})
        self.assertEqual(response.status_code, 200)
        self.assertIn('Lusaka', response.json()['cities'])
        self.assertIn('Kafue', response.json()['cities'])
