#!/usr/bin/env python

from collections import defaultdict

from pycountry import countries, subdivisions
from pycountry_convert import country_alpha2_to_continent_code

subs = defaultdict(dict)
for subdivision in subdivisions:
    # Route53 only supports US states, Dyn (and others) support US states and CA provinces
    if subdivision.country_code not in ('US', 'CA'):
        continue
    subs[subdivision.country_code][subdivision.code[3:]] = {
        'name': subdivision.name
    }
subs = dict(subs)

# These are best guesses at things pycountry_convert doesn't map
continent_backups = {
    'AQ': 'AN',
    'EH': 'AF',
    'PN': 'OC',
    'SX': 'NA',
    'TF': 'AN',
    'TL': 'AS',
    'UM': 'OC',
    'VA': 'EU',
}

geos = defaultdict(dict)
for country in countries:
    try:
        continent_code = country_alpha2_to_continent_code(country.alpha_2)
    except KeyError:
        try:
            continent_code = continent_backups[country.alpha_2]
        except KeyError:
            raise
            print(
                '{} {} {}'.format(
                    country.alpha_2,
                    country.name,
                    getattr(country, 'official_name', ''),
                )
            )

    geos[continent_code][country.alpha_2] = {'name': country.name}

    try:
        geos[continent_code][country.alpha_2]['provinces'] = subs[
            country.alpha_2
        ]
    except KeyError:
        pass

geos = dict(geos)

print(
    '''#
# -*- coding: utf-8 -*-
#
# This file is generated using
#   ./script/generate-geo-data > octodns/record/geo_data.py
# do not modify it directly
#

geo_data = {'''
)

for continent, details in sorted(geos.items()):
    print(f"    '{continent}': {{")
    for country, info in sorted(details.items()):
        name = info['name']
        quoted_name = f'"{name}"' if "'" in name else f"'{name}'"
        if 'provinces' in info:
            print(f"        '{country}': {{")
            print(f"            'name': {quoted_name},")
            print("            'provinces': {")
            for prov, info in sorted(info['provinces'].items()):
                name = info['name']
                quoted_name = f'"{name}"' if "'" in name else f"'{name}'"
                print(f"                '{prov}': {{'name': {quoted_name}}},")
            print('            },')
            print('        },')
        else:
            print(f"        '{country}': {{'name': {quoted_name}}},")
    print('    },')
print('}')
