<?php
/**
 * Genera assets/data/install-geo-latam.json (ejecutar una vez tras cambios).
 */
declare(strict_types=1);

$root = dirname(__DIR__);
$out = $root . '/assets/data/install-geo-latam.json';

$latamIso = [
    'MX', 'GT', 'BZ', 'SV', 'HN', 'NI', 'CR', 'PA', 'CO', 'VE', 'EC', 'PE', 'BO', 'PY', 'UY',
    'AR', 'CL', 'BR', 'CU', 'DO', 'HT', 'ES', 'GY', 'SR', 'GF', 'FK', 'PR', 'JM', 'TT', 'BB',
    'LC', 'GD', 'VC', 'AG', 'KN', 'DM', 'BS', 'AW', 'CW', 'SX', 'BQ', 'KY', 'TC', 'VG', 'VI',
    'MS', 'GP', 'MQ', 'NI',
];

$otherIso = ['US', 'CA', 'GB', 'FR', 'DE', 'IT', 'PT', 'NL', 'BE', 'CH', 'AT', 'IE', 'AU', 'NZ', 'JP', 'CN', 'IN', 'KR'];

$mxStates = [
    ['code' => 'MX-AGU', 'name' => 'Aguascalientes', 'cities' => ['Aguascalientes', 'Jesús María', 'Calvillo']],
    ['code' => 'MX-BCN', 'name' => 'Baja California', 'cities' => ['Tijuana', 'Mexicali', 'Ensenada', 'Tecate', 'Rosarito']],
    ['code' => 'MX-BCS', 'name' => 'Baja California Sur', 'cities' => ['La Paz', 'Los Cabos', 'Loreto', 'Comondú']],
    ['code' => 'MX-CAM', 'name' => 'Campeche', 'cities' => ['Campeche', 'Ciudad del Carmen', 'Champotón']],
    ['code' => 'MX-CHP', 'name' => 'Chiapas', 'cities' => ['Tuxtla Gutiérrez', 'Tapachula', 'San Cristóbal de las Casas', 'Comitán']],
    ['code' => 'MX-CHH', 'name' => 'Chihuahua', 'cities' => ['Chihuahua', 'Ciudad Juárez', 'Delicias', 'Parral', 'Cuauhtémoc']],
    ['code' => 'MX-CMX', 'name' => 'Ciudad de México', 'cities' => ['Ciudad de México', 'Coyoacán', 'Iztapalapa', 'Benito Juárez']],
    ['code' => 'MX-COA', 'name' => 'Coahuila', 'cities' => ['Saltillo', 'Torreón', 'Monclova', 'Piedras Negras', 'Acuña']],
    ['code' => 'MX-COL', 'name' => 'Colima', 'cities' => ['Colima', 'Manzanillo', 'Tecomán', 'Villa de Álvarez']],
    ['code' => 'MX-DUR', 'name' => 'Durango', 'cities' => ['Durango', 'Gómez Palacio', 'Lerdo', 'Santiago Papasquiaro']],
    ['code' => 'MX-GUA', 'name' => 'Guanajuato', 'cities' => ['León', 'Irapuato', 'Celaya', 'Guanajuato', 'Salamanca', 'Silao']],
    ['code' => 'MX-GRO', 'name' => 'Guerrero', 'cities' => ['Acapulco', 'Chilpancingo', 'Iguala', 'Zihuatanejo', 'Taxco']],
    ['code' => 'MX-HID', 'name' => 'Hidalgo', 'cities' => ['Pachuca', 'Tulancingo', 'Tula', 'Ixmiquilpan', 'Mineral del Monte']],
    ['code' => 'MX-JAL', 'name' => 'Jalisco', 'cities' => ['Guadalajara', 'Zapopan', 'Tlaquepaque', 'Tonalá', 'Puerto Vallarta', 'Lagos de Moreno', 'Ocotlán']],
    ['code' => 'MX-MEX', 'name' => 'Estado de México', 'cities' => ['Ecatepec', 'Naucalpan', 'Toluca', 'Nezahualcóyotl', 'Tlalnepantla', 'Metepec', 'Cuautitlán Izcalli']],
    ['code' => 'MX-MIC', 'name' => 'Michoacán', 'cities' => ['Morelia', 'Uruapan', 'Zamora', 'Lázaro Cárdenas', 'Pátzcuaro']],
    ['code' => 'MX-MOR', 'name' => 'Morelos', 'cities' => ['Cuernavaca', 'Cuautla', 'Jiutepec', 'Temixco']],
    ['code' => 'MX-NAY', 'name' => 'Nayarit', 'cities' => ['Tepic', 'Bahía de Banderas', 'Compostela', 'Xalisco']],
    ['code' => 'MX-NLE', 'name' => 'Nuevo León', 'cities' => ['Monterrey', 'San Pedro Garza García', 'Guadalupe', 'Apodaca', 'Santa Catarina', 'San Nicolás']],
    ['code' => 'MX-OAX', 'name' => 'Oaxaca', 'cities' => ['Oaxaca de Juárez', 'Salina Cruz', 'Juchitán', 'Tuxtepec', 'Huajuapan']],
    ['code' => 'MX-PUE', 'name' => 'Puebla', 'cities' => ['Puebla', 'Tehuacán', 'San Martín Texmelucan', 'Atlixco', 'Cholula']],
    ['code' => 'MX-QUE', 'name' => 'Querétaro', 'cities' => ['Querétaro', 'San Juan del Río', 'Corregidora', 'El Marqués']],
    ['code' => 'MX-ROO', 'name' => 'Quintana Roo', 'cities' => ['Cancún', 'Playa del Carmen', 'Chetumal', 'Tulum', 'Cozumel']],
    ['code' => 'MX-SLP', 'name' => 'San Luis Potosí', 'cities' => ['San Luis Potosí', 'Soledad', 'Ciudad Valles', 'Matehuala']],
    ['code' => 'MX-SIN', 'name' => 'Sinaloa', 'cities' => ['Culiacán', 'Mazatlán', 'Los Mochis', 'Guasave', 'Navolato']],
    ['code' => 'MX-SON', 'name' => 'Sonora', 'cities' => ['Hermosillo', 'Ciudad Obregón', 'Nogales', 'San Luis Río Colorado', 'Guaymas']],
    ['code' => 'MX-TAB', 'name' => 'Tabasco', 'cities' => ['Villahermosa', 'Cárdenas', 'Comalcalco', 'Macuspana']],
    ['code' => 'MX-TAM', 'name' => 'Tamaulipas', 'cities' => ['Reynosa', 'Matamoros', 'Nuevo Laredo', 'Tampico', 'Ciudad Victoria', 'Altamira']],
    ['code' => 'MX-TLA', 'name' => 'Tlaxcala', 'cities' => ['Tlaxcala', 'Apizaco', 'Huamantla', 'Chiautempan']],
    ['code' => 'MX-VER', 'name' => 'Veracruz', 'cities' => ['Veracruz', 'Xalapa', 'Coatzacoalcos', 'Córdoba', 'Poza Rica', 'Orizaba', 'Minatitlán']],
    ['code' => 'MX-YUC', 'name' => 'Yucatán', 'cities' => ['Mérida', 'Valladolid', 'Progreso', 'Tizimín', 'Kanasín']],
    ['code' => 'MX-ZAC', 'name' => 'Zacatecas', 'cities' => ['Zacatecas', 'Fresnillo', 'Guadalupe', 'Jerez', 'Calera']],
];

$countryNames = [
    'MX' => 'México', 'GT' => 'Guatemala', 'BZ' => 'Belice', 'SV' => 'El Salvador', 'HN' => 'Honduras',
    'NI' => 'Nicaragua', 'CR' => 'Costa Rica', 'PA' => 'Panamá', 'CO' => 'Colombia', 'VE' => 'Venezuela',
    'EC' => 'Ecuador', 'PE' => 'Perú', 'BO' => 'Bolivia', 'PY' => 'Paraguay', 'UY' => 'Uruguay',
    'AR' => 'Argentina', 'CL' => 'Chile', 'BR' => 'Brasil', 'CU' => 'Cuba', 'DO' => 'República Dominicana',
    'HT' => 'Haití', 'ES' => 'España', 'GY' => 'Guyana', 'SR' => 'Surinam', 'GF' => 'Guayana Francesa',
    'FK' => 'Islas Malvinas', 'PR' => 'Puerto Rico', 'JM' => 'Jamaica', 'TT' => 'Trinidad y Tobago',
    'BB' => 'Barbados', 'LC' => 'Santa Lucía', 'GD' => 'Granada', 'VC' => 'San Vicente y las Granadinas',
    'AG' => 'Antigua y Barbuda', 'KN' => 'San Cristóbal y Nieves', 'DM' => 'Dominica', 'BS' => 'Bahamas',
    'AW' => 'Aruba', 'CW' => 'Curazao', 'SX' => 'Sint Maarten', 'BQ' => 'Caribe Neerlandés',
    'KY' => 'Islas Caimán', 'TC' => 'Islas Turcas y Caicos', 'VG' => 'Islas Vírgenes Británicas',
    'VI' => 'Islas Vírgenes de EE.UU.', 'MS' => 'Montserrat', 'GP' => 'Guadalupe', 'MQ' => 'Martinica',
    'US' => 'Estados Unidos', 'CA' => 'Canadá', 'GB' => 'Reino Unido', 'FR' => 'Francia', 'DE' => 'Alemania',
    'IT' => 'Italia', 'PT' => 'Portugal', 'NL' => 'Países Bajos', 'BE' => 'Bélgica', 'CH' => 'Suiza',
    'AT' => 'Austria', 'IE' => 'Irlanda', 'AU' => 'Australia', 'NZ' => 'Nueva Zelanda', 'JP' => 'Japón',
    'CN' => 'China', 'IN' => 'India', 'KR' => 'Corea del Sur',
];

$latamStates = [
    'GT' => [
        ['code' => 'GT-01', 'name' => 'Guatemala', 'cities' => ['Ciudad de Guatemala', 'Mixco', 'Villa Nueva']],
        ['code' => 'GT-09', 'name' => 'Quetzaltenango', 'cities' => ['Quetzaltenango', 'Salcajá']],
        ['code' => 'GT-12', 'name' => 'San Marcos', 'cities' => ['San Marcos', 'Malacatán']],
    ],
    'SV' => [
        ['code' => 'SV-SS', 'name' => 'San Salvador', 'cities' => ['San Salvador', 'Soyapango', 'Santa Tecla']],
        ['code' => 'SV-SA', 'name' => 'Santa Ana', 'cities' => ['Santa Ana', 'Metapán']],
    ],
    'HN' => [
        ['code' => 'HN-FM', 'name' => 'Francisco Morazán', 'cities' => ['Tegucigalpa', 'Comayagüela']],
        ['code' => 'HN-CR', 'name' => 'Cortés', 'cities' => ['San Pedro Sula', 'Puerto Cortés']],
    ],
    'NI' => [
        ['code' => 'NI-MN', 'name' => 'Managua', 'cities' => ['Managua', 'Ciudad Sandino']],
        ['code' => 'NI-LE', 'name' => 'León', 'cities' => ['León', 'La Paz Centro']],
    ],
    'CR' => [
        ['code' => 'CR-SJ', 'name' => 'San José', 'cities' => ['San José', 'Escazú', 'Desamparados']],
        ['code' => 'CR-A', 'name' => 'Alajuela', 'cities' => ['Alajuela', 'San Ramón']],
    ],
    'PA' => [
        ['code' => 'PA-8', 'name' => 'Panamá', 'cities' => ['Ciudad de Panamá', 'San Miguelito']],
        ['code' => 'PA-4', 'name' => 'Chiriquí', 'cities' => ['David', 'Boquete']],
    ],
    'CO' => [
        ['code' => 'CO-DC', 'name' => 'Bogotá D.C.', 'cities' => ['Bogotá']],
        ['code' => 'CO-ANT', 'name' => 'Antioquia', 'cities' => ['Medellín', 'Bello', 'Envigado', 'Itagüí']],
        ['code' => 'CO-VAC', 'name' => 'Valle del Cauca', 'cities' => ['Cali', 'Palmira', 'Buenaventura']],
        ['code' => 'CO-ATL', 'name' => 'Atlántico', 'cities' => ['Barranquilla', 'Soledad']],
        ['code' => 'CO-BOL', 'name' => 'Bolívar', 'cities' => ['Cartagena', 'Magangué']],
    ],
    'VE' => [
        ['code' => 'VE-A', 'name' => 'Distrito Capital', 'cities' => ['Caracas']],
        ['code' => 'VE-B', 'name' => 'Anzoátegui', 'cities' => ['Barcelona', 'Puerto La Cruz']],
        ['code' => 'VE-Z', 'name' => 'Zulia', 'cities' => ['Maracaibo', 'Cabimas']],
    ],
    'EC' => [
        ['code' => 'EC-P', 'name' => 'Pichincha', 'cities' => ['Quito', 'Cumbayá']],
        ['code' => 'EC-G', 'name' => 'Guayas', 'cities' => ['Guayaquil', 'Durán', 'Samborondón']],
        ['code' => 'EC-A', 'name' => 'Azuay', 'cities' => ['Cuenca', 'Gualaceo']],
    ],
    'PE' => [
        ['code' => 'PE-LIM', 'name' => 'Lima', 'cities' => ['Lima', 'Callao', 'Miraflores', 'San Isidro']],
        ['code' => 'PE-ARE', 'name' => 'Arequipa', 'cities' => ['Arequipa', 'Cayma']],
        ['code' => 'PE-CUS', 'name' => 'Cusco', 'cities' => ['Cusco', 'Sicuani']],
    ],
    'BO' => [
        ['code' => 'BO-L', 'name' => 'La Paz', 'cities' => ['La Paz', 'El Alto']],
        ['code' => 'BO-C', 'name' => 'Cochabamba', 'cities' => ['Cochabamba', 'Quillacollo']],
        ['code' => 'BO-S', 'name' => 'Santa Cruz', 'cities' => ['Santa Cruz de la Sierra', 'Montero']],
    ],
    'PY' => [
        ['code' => 'PY-ASU', 'name' => 'Asunción', 'cities' => ['Asunción', 'Luque', 'San Lorenzo']],
        ['code' => 'PY-11', 'name' => 'Central', 'cities' => ['Fernando de la Mora', 'Capiatá']],
    ],
    'UY' => [
        ['code' => 'UY-MO', 'name' => 'Montevideo', 'cities' => ['Montevideo', 'Ciudad de la Costa']],
        ['code' => 'UY-MA', 'name' => 'Maldonado', 'cities' => ['Maldonado', 'Punta del Este']],
    ],
    'AR' => [
        ['code' => 'AR-C', 'name' => 'Ciudad Autónoma de Buenos Aires', 'cities' => ['Buenos Aires']],
        ['code' => 'AR-B', 'name' => 'Buenos Aires', 'cities' => ['La Plata', 'Mar del Plata', 'Bahía Blanca', 'Quilmes']],
        ['code' => 'AR-X', 'name' => 'Córdoba', 'cities' => ['Córdoba', 'Villa María', 'Río Cuarto']],
        ['code' => 'AR-M', 'name' => 'Mendoza', 'cities' => ['Mendoza', 'San Rafael', 'Godoy Cruz']],
        ['code' => 'AR-S', 'name' => 'Santa Fe', 'cities' => ['Rosario', 'Santa Fe', 'Rafaela']],
    ],
    'CL' => [
        ['code' => 'CL-RM', 'name' => 'Región Metropolitana', 'cities' => ['Santiago', 'Puente Alto', 'Maipú', 'Las Condes']],
        ['code' => 'CL-VS', 'name' => 'Valparaíso', 'cities' => ['Valparaíso', 'Viña del Mar', 'Quilpué']],
        ['code' => 'CL-BI', 'name' => 'Biobío', 'cities' => ['Concepción', 'Talcahuano', 'Los Ángeles']],
    ],
    'BR' => [
        ['code' => 'BR-SP', 'name' => 'São Paulo', 'cities' => ['São Paulo', 'Campinas', 'Santos', 'Guarulhos']],
        ['code' => 'BR-RJ', 'name' => 'Rio de Janeiro', 'cities' => ['Rio de Janeiro', 'Niterói', 'Duque de Caxias']],
        ['code' => 'BR-MG', 'name' => 'Minas Gerais', 'cities' => ['Belo Horizonte', 'Uberlândia', 'Contagem']],
        ['code' => 'BR-DF', 'name' => 'Distrito Federal', 'cities' => ['Brasília', 'Taguatinga']],
        ['code' => 'BR-BA', 'name' => 'Bahia', 'cities' => ['Salvador', 'Feira de Santana']],
        ['code' => 'BR-RS', 'name' => 'Rio Grande do Sul', 'cities' => ['Porto Alegre', 'Caxias do Sul']],
    ],
    'CU' => [
        ['code' => 'CU-03', 'name' => 'La Habana', 'cities' => ['La Habana', 'Playa', 'Centro Habana']],
        ['code' => 'CU-07', 'name' => 'Santiago de Cuba', 'cities' => ['Santiago de Cuba', 'Palma Soriano']],
    ],
    'DO' => [
        ['code' => 'DO-01', 'name' => 'Distrito Nacional', 'cities' => ['Santo Domingo']],
        ['code' => 'DO-25', 'name' => 'Santiago', 'cities' => ['Santiago de los Caballeros', 'Tamboril']],
    ],
    'ES' => [
        ['code' => 'ES-MD', 'name' => 'Madrid', 'cities' => ['Madrid', 'Móstoles', 'Alcalá de Henares', 'Fuenlabrada']],
        ['code' => 'ES-CT', 'name' => 'Cataluña', 'cities' => ['Barcelona', 'Hospitalet de Llobregat', 'Badalona', 'Tarragona', 'Girona']],
        ['code' => 'ES-AN', 'name' => 'Andalucía', 'cities' => ['Sevilla', 'Málaga', 'Córdoba', 'Granada', 'Cádiz']],
        ['code' => 'ES-PV', 'name' => 'País Vasco', 'cities' => ['Bilbao', 'Vitoria-Gasteiz', 'San Sebastián']],
        ['code' => 'ES-VC', 'name' => 'Comunidad Valenciana', 'cities' => ['Valencia', 'Alicante', 'Elche', 'Castellón']],
    ],
    'BZ' => [['code' => 'BZ-BZ', 'name' => 'Belice', 'cities' => ['Belice City', 'San Ignacio']]],
    'HT' => [['code' => 'HT-OU', 'name' => 'Ouest', 'cities' => ['Puerto Príncipe', 'Delmas']]],
    'PR' => [['code' => 'PR-PR', 'name' => 'Puerto Rico', 'cities' => ['San Juan', 'Bayamón', 'Carolina', 'Ponce']]],
];

$regions = [];
foreach ($latamIso as $iso) {
    $iso = strtoupper($iso);
    if (!isset($countryNames[$iso])) {
        continue;
    }
    $states = [];
    if ($iso === 'MX') {
        $states = $mxStates;
    } elseif (isset($latamStates[$iso])) {
        $states = $latamStates[$iso];
    } else {
        $states = [['code' => $iso . '-GEN', 'name' => 'General', 'cities' => ['Capital / principal']]];
    }
    $regions[] = ['code' => $iso, 'name' => $countryNames[$iso], 'states' => $states];
}

$otherCountries = [];
foreach ($otherIso as $iso) {
    $iso = strtoupper($iso);
    if (!isset($countryNames[$iso])) {
        continue;
    }
    $otherCountries[] = ['code' => $iso, 'name' => $countryNames[$iso], 'states' => []];
}

$payload = ['version' => 1, 'regions' => $regions, 'otherCountries' => $otherCountries];
$json = json_encode($payload, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
if ($json === false) {
    fwrite(STDERR, "json_encode failed\n");
    exit(1);
}
if (!is_dir(dirname($out))) {
    mkdir(dirname($out), 0755, true);
}
file_put_contents($out, $json . "\n");
echo "Wrote " . $out . " (" . strlen($json) . " bytes)\n";
