import http, {HttpError} from '@/http';

/** Défi captcha émis par l'API : la question est affichée, le jeton renvoyé avec la réponse. */
export interface Captcha {
  token: string;
  question: string;
}

/** Résultat d'un envoi : erreurs par champ (`captcha`, `plateau`, `affiche`, `eprHeure`…) quand l'API refuse. */
export interface EnvoiResultat {
  ok: boolean;
  message: string;
  erreurs: Record<string, string>;
  eprId?: number;
}

/** Valeurs qui pré-remplissent le formulaire quand on propose une modification d'événement. */
export interface PropositionInitialValues {
  tevId?: number;
  date: string;
  heure: string;
  lieu: string;
  lieuDesc: string;
  prix: string;
  description: string;
  url: string;
  artistesDesc: string;
  participants: {value: number; label: string}[];
}

interface EvenementSource {
  eveId?: number;
  eveDate?: string | null;
  eveHeure?: string | null;
  eveLibelle?: string | null;
  evePrixLibelle?: string | null;
  eveHorsBase?: string | null;
  eveUrlReservation?: string | null;
  eveTev?: {tevId?: number; tevLibelle?: string | null} | null;
  eveVil?: {vilNom?: string | null} | null;
  evePla?: {plaNom?: string | null; plaAdresse?: string | null} | null;
  aenParticipants?: {aenId: number; aenLibelle?: string | null}[] | null;
}

/** Un nouveau défi, ou null si l'API ne répond pas (le formulaire l'explique et propose de réessayer). */
export async function getCaptcha(): Promise<Captcha | null> {
  try {
    const response = await http.get('/captcha');
    return {token: response.data.token, question: response.data.question};
  } catch {
    return null;
  }
}

/** Envoie le formulaire (multipart) ; un 422 remonte les erreurs par champ, tout autre échec un message vide. */
export async function envoyerProposition(formData: FormData): Promise<EnvoiResultat> {
  try {
    const response = await http.post('/evenement_propositions', formData);
    return {ok: true, message: response.data?.message ?? '', eprId: response.data?.eprId, erreurs: {}};
  } catch (error) {
    if (error instanceof HttpError && error.status === 422) {
      const data = (error.data ?? {}) as {message?: string; erreurs?: Record<string, string>};
      return {ok: false, message: data.message ?? '', erreurs: data.erreurs ?? {}};
    }
    return {ok: false, message: '', erreurs: {}};
  }
}

/** Reprend les informations connues de l'événement dans les champs du formulaire de modification. */
export function initialValuesFromEvenement(event: EvenementSource): PropositionInitialValues {
  const place = event.evePla?.plaNom?.trim();
  const ville = event.eveVil?.vilNom?.trim();

  return {
    tevId: event.eveTev?.tevId,
    date: (event.eveDate ?? '').slice(0, 10),
    heure: (event.eveHeure ?? '').trim().replace(':', 'h'),
    lieu: [place, ville].filter(Boolean).join(', '),
    lieuDesc: event.evePla?.plaAdresse?.trim() ?? '',
    prix: event.evePrixLibelle ?? '',
    description: event.eveLibelle ?? '',
    url: event.eveUrlReservation ?? '',
    artistesDesc: event.eveHorsBase ?? '',
    participants: (event.aenParticipants ?? []).map((aen) => ({value: aen.aenId, label: aen.aenLibelle ?? `#${aen.aenId}`})),
  };
}
