// LATAM countries with phone codes and major cities
const COUNTRIES = [
  { code: 'CO', name: 'Colombia',     dial: '+57',  cities: ['Bogotá', 'Medellín', 'Cali', 'Barranquilla', 'Cartagena', 'Bucaramanga', 'Pereira', 'Manizales', 'Cúcuta', 'Santa Marta'] },
  { code: 'MX', name: 'México',       dial: '+52',  cities: ['Ciudad de México', 'Guadalajara', 'Monterrey', 'Puebla', 'Querétaro', 'Tijuana', 'Mérida', 'León', 'Cancún'] },
  { code: 'AR', name: 'Argentina',    dial: '+54',  cities: ['Buenos Aires', 'Córdoba', 'Rosario', 'Mendoza', 'La Plata', 'Mar del Plata', 'Salta', 'Tucumán'] },
  { code: 'CL', name: 'Chile',        dial: '+56',  cities: ['Santiago', 'Valparaíso', 'Concepción', 'La Serena', 'Antofagasta', 'Temuco', 'Viña del Mar'] },
  { code: 'PE', name: 'Perú',         dial: '+51',  cities: ['Lima', 'Arequipa', 'Trujillo', 'Chiclayo', 'Piura', 'Cusco', 'Iquitos'] },
  { code: 'EC', name: 'Ecuador',      dial: '+593', cities: ['Quito', 'Guayaquil', 'Cuenca', 'Manta', 'Ambato', 'Loja'] },
  { code: 'UY', name: 'Uruguay',      dial: '+598', cities: ['Montevideo', 'Punta del Este', 'Salto', 'Paysandú'] },
  { code: 'PY', name: 'Paraguay',     dial: '+595', cities: ['Asunción', 'Ciudad del Este', 'Encarnación'] },
  { code: 'BO', name: 'Bolivia',      dial: '+591', cities: ['La Paz', 'Santa Cruz', 'Cochabamba', 'Sucre', 'Oruro'] },
  { code: 'VE', name: 'Venezuela',    dial: '+58',  cities: ['Caracas', 'Maracaibo', 'Valencia', 'Barquisimeto', 'Maracay'] },
  { code: 'CR', name: 'Costa Rica',   dial: '+506', cities: ['San José', 'Alajuela', 'Heredia', 'Cartago'] },
  { code: 'PA', name: 'Panamá',       dial: '+507', cities: ['Ciudad de Panamá', 'Colón', 'David'] },
  { code: 'GT', name: 'Guatemala',    dial: '+502', cities: ['Ciudad de Guatemala', 'Quetzaltenango', 'Antigua'] },
  { code: 'DO', name: 'Rep. Dominicana', dial: '+1', cities: ['Santo Domingo', 'Santiago', 'La Romana', 'Puerto Plata'] },
  { code: 'SV', name: 'El Salvador',  dial: '+503', cities: ['San Salvador', 'Santa Ana', 'San Miguel'] },
  { code: 'HN', name: 'Honduras',     dial: '+504', cities: ['Tegucigalpa', 'San Pedro Sula', 'La Ceiba'] },
  { code: 'NI', name: 'Nicaragua',    dial: '+505', cities: ['Managua', 'León', 'Granada'] },
  { code: 'US', name: 'Estados Unidos', dial: '+1', cities: ['Miami', 'Nueva York', 'Los Ángeles', 'Houston', 'Chicago'] },
  { code: 'ES', name: 'España',       dial: '+34',  cities: ['Madrid', 'Barcelona', 'Valencia', 'Sevilla', 'Bilbao'] },
];

const COUNTRY_BY_CODE = Object.fromEntries(COUNTRIES.map(c => [c.code, c]));

// Time slots offered in a day
const TIME_SLOTS = [
  '09:00', '10:00', '11:00', '12:00',
  '14:00', '15:00', '16:00', '17:00',
];

// Mock unavailable date keys (yyyy-mm-dd) — would come from a real calendar API
// We'll generate them based on weekdays + some specific blocked dates.
function buildAvailability(monthOffset = 0) {
  const today = new Date();
  today.setHours(0, 0, 0, 0);
  // Block weekends + some scattered days within the upcoming weeks.
  // Also block dates earlier than 2 business days from today (lead time).
  const minLeadDays = 2;
  const leadDate = new Date(today);
  leadDate.setDate(today.getDate() + minLeadDays);

  const isAvailable = (date) => {
    if (date < leadDate) return false;
    const dow = date.getDay();
    if (dow !== 4 && dow !== 5 && dow !== 6) return false;
    // Block a few "booked" dates to make it feel real
    const dayOfMonth = date.getDate();
    const blockedSet = [3, 11, 18, 24]; // arbitrary blocked
    if (blockedSet.includes(dayOfMonth)) return false;
    return true;
  };

  // Per-day slot availability: hide a slot or two on some days
  const slotsForDate = (date) => {
    if (!isAvailable(date)) return [];
    const seed = date.getDate() + date.getMonth();
    return TIME_SLOTS.map((t, i) => {
      // Block ~1-2 slots pseudo-randomly
      const blocked = (seed + i) % 5 === 0 || (seed * (i + 1)) % 7 === 0;
      return { time: t, available: !blocked };
    });
  };

  return { isAvailable, slotsForDate };
}

const MONTH_NAMES = [
  'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio',
  'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
];

const DOW_SHORT = ['L', 'M', 'X', 'J', 'V', 'S', 'D'];

function fmtDateLong(d) {
  if (!d) return '';
  const dow = ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'][d.getDay()];
  return `${dow}, ${d.getDate()} de ${MONTH_NAMES[d.getMonth()].toLowerCase()} de ${d.getFullYear()}`;
}

function fmtDateShort(d) {
  if (!d) return '';
  return `${d.getDate()} ${MONTH_NAMES[d.getMonth()].slice(0,3)} ${d.getFullYear()}`;
}

function dateKey(d) {
  return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`;
}

window.COUNTRIES = COUNTRIES;
window.COUNTRY_BY_CODE = COUNTRY_BY_CODE;
window.TIME_SLOTS = TIME_SLOTS;
window.MONTH_NAMES = MONTH_NAMES;
window.DOW_SHORT = DOW_SHORT;
window.buildAvailability = buildAvailability;
window.fmtDateLong = fmtDateLong;
window.fmtDateShort = fmtDateShort;
window.dateKey = dateKey;
