/**
 * Aides d'affichage des événements pour le design 2026 :
 * couleur de pill par type d'événement et découpage de date
 * (jour de semaine / numéro / mois) localisé.
 */

export type PillTone = 'orange' | 'blue' | 'olive' | 'neutral';

export function pillToneForType(typeLabel: string | null | undefined): PillTone {
  const label = (typeLabel ?? '').toLowerCase();
  if (label.includes('fest')) return 'orange';
  if (label.includes('concert')) return 'blue';
  if (label.includes('stage') || label.includes('spectacle') || label.includes('atelier')) {
    return 'olive';
  }
  return 'neutral';
}

const LOCALE_MAP: Record<string, string> = {
  fr: 'fr-FR',
  en: 'en-GB',
  de: 'de-DE',
  bzh: 'br',
};

export interface EventDateParts {
  dow: string;
  day: string;
  month: string;
}

export function formatEventDateParts(isoDate: string, locale: string): EventDateParts {
  const date = new Date(isoDate);
  if (Number.isNaN(date.getTime())) {
    return {dow: '', day: '', month: ''};
  }
  const intlLocale = LOCALE_MAP[locale] ?? LOCALE_MAP.fr;
  return {
    dow: date.toLocaleDateString(intlLocale, {weekday: 'short'}).replace('.', ''),
    day: String(date.getDate()),
    month: date.toLocaleDateString(intlLocale, {month: 'short'}).replace('.', ''),
  };
}

export interface DayGroup<T> {
  key: string;
  label: string;
  events: T[];
}

/**
 * Regroupe des événements par jour (clé yyyy-mm-dd), triés
 * chronologiquement, avec un libellé localisé « Samedi 18 juillet ».
 */
export function groupEventsByDay<T extends {eveDate: string}>(
  events: T[],
  locale: string
): DayGroup<T>[] {
  const intlLocale = LOCALE_MAP[locale] ?? LOCALE_MAP.fr;
  const byKey = new Map<string, T[]>();

  for (const event of events) {
    const date = new Date(event.eveDate);
    if (Number.isNaN(date.getTime())) continue;
    const key = date.toISOString().slice(0, 10);
    const group = byKey.get(key);
    if (group) {
      group.push(event);
    } else {
      byKey.set(key, [event]);
    }
  }

  return Array.from(byKey.entries())
    .sort(([a], [b]) => a.localeCompare(b))
    .map(([key, groupEvents]) => {
      const label = new Date(key).toLocaleDateString(intlLocale, {
        weekday: 'long',
        day: 'numeric',
        month: 'long',
      });
      return {
        key,
        label: label.charAt(0).toUpperCase() + label.slice(1),
        events: groupEvents,
      };
    });
}

/**
 * Nettoie un libellé d'événement : l'API renvoie parfois du HTML brut
 * (<br>, etc.) dans eveLibelle — on ne garde que le texte.
 */
export function cleanEventTitle(label: string | null | undefined): string {
  return (label ?? '')
    .replace(/<[^>]*>/g, ' ')
    .replace(/\s+/g, ' ')
    .trim();
}
