// Horario de venta por categoria: "las sopas solo los domingos", "las arepas
// desde las 5pm". Bloquea SOLO la venta en linea (el candado de verdad vive en
// crear_pedido); esto es para que el cliente lo VEA antes de armar el carrito y
// para que el dueno lo configure.
//
// FUENTE CANONICA: la usan el panel (configurar) y la tienda (mostrar).

export type HorarioCategoria = {
  dias_semana?: number[] | null; // 0=domingo .. 6=sabado; null o vacio = todos
  hora_desde?: string | null; // 'HH:MM:SS' hora de Venezuela
  hora_hasta?: string | null;
};

export const DIAS_CORTO = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'];
export const DIAS_LARGO = ['domingos', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábados'];

/** Fecha y hora de Venezuela, sin importar cómo tenga el reloj el cliente. */
export function ahoraVenezuela(base: Date = new Date()): Date {
  return new Date(base.toLocaleString('en-US', { timeZone: 'America/Caracas' }));
}

function minutosDe(hora: string): number {
  const [h, m] = hora.split(':');
  return Number(h) * 60 + Number(m ?? 0);
}

/** ¿Esta categoría se está vendiendo en línea en este momento? */
export function categoriaEnHorario(c: HorarioCategoria | null | undefined, base?: Date): boolean {
  if (!c) return true;
  const ahora = ahoraVenezuela(base);
  const dias = c.dias_semana ?? null;
  if (dias && dias.length > 0 && !dias.includes(ahora.getDay())) return false;
  const desde = c.hora_desde ? minutosDe(c.hora_desde) : null;
  const hasta = c.hora_hasta ? minutosDe(c.hora_hasta) : null;
  if (desde == null && hasta == null) return true;
  const min = ahora.getHours() * 60 + ahora.getMinutes();
  // Franja que cruza la medianoche (ej. 17:00 a 02:00).
  if (desde != null && hasta != null && desde > hasta) return min >= desde || min <= hasta;
  if (desde != null && min < desde) return false;
  if (hasta != null && min > hasta) return false;
  return true;
}

/** "5:00 pm" a partir de 'HH:MM:SS'. */
export function horaBonita(hora: string): string {
  const [hStr, m] = hora.split(':');
  const h = Number(hStr);
  const ampm = h >= 12 ? 'pm' : 'am';
  const h12 = h % 12 === 0 ? 12 : h % 12;
  return `${h12}:${(m ?? '00').padStart(2, '0')} ${ampm}`;
}

/**
 * Frase lista para el cliente cuando la categoría está apagada.
 * Ej: "Se vende solo los domingos, de 11:00 am a 5:00 pm" · "Se vende desde las 5:00 pm".
 */
export function motivoFueraDeHorario(c: HorarioCategoria | null | undefined): string | null {
  const t = textoHorarioCategoria(c);
  if (!t) return null;
  return `Se vende ${t.charAt(0).toLowerCase()}${t.slice(1)}`;
}

/** Texto corto del horario, o null si se vende siempre. Ej: "Solo los domingos, desde las 5:00 pm". */
export function textoHorarioCategoria(c: HorarioCategoria | null | undefined): string | null {
  if (!c) return null;
  const dias = c.dias_semana ?? null;
  const partes: string[] = [];
  if (dias && dias.length > 0 && dias.length < 7) {
    const nombres = [...dias].sort((a, b) => a - b).map((d) => DIAS_LARGO[d] ?? '');
    partes.push(
      nombres.length === 1
        ? `Solo los ${nombres[0]}`
        : `Solo ${nombres.slice(0, -1).join(', ')} y ${nombres[nombres.length - 1]}`,
    );
  }
  if (c.hora_desde && c.hora_hasta) partes.push(`de ${horaBonita(c.hora_desde)} a ${horaBonita(c.hora_hasta)}`);
  else if (c.hora_desde) partes.push(`desde las ${horaBonita(c.hora_desde)}`);
  else if (c.hora_hasta) partes.push(`hasta las ${horaBonita(c.hora_hasta)}`);
  if (!partes.length) return null;
  return partes.join(', ');
}
