import http from '@/http';
import type {Evenement} from '@/types/stage';

interface GetUpcomingEventsOptions {
  organisateurs?: number[];
  itemsPerPage?: number;
  eveTev?: number;
  /** Domaine de pratique (accueil de domaine, spec L77). */
  domaine?: number;
}

export async function getUpcomingEvents(options?: GetUpcomingEventsOptions): Promise<Evenement[]> {
  const today = new Date().toISOString().slice(0, 10);

  const params = new URLSearchParams();
  params.set('eveDate[after]', today);

  if (options?.itemsPerPage) {
    params.set('itemsPerPage', String(options.itemsPerPage));
  }

  if (options?.eveTev) {
    params.set('eveTev', String(options.eveTev));
  }

  if (options?.domaine) {
    params.set('eveTev.tevDpr', String(options.domaine));
  }

  if (options?.organisateurs) {
    options.organisateurs.forEach(id => {
      params.append('aenOrganisateurs[]', String(id));
    });
  }

  const response = await http.get(`/evenements?${params.toString()}`);

  return response.data['hydra:member'];
}

export async function getEventImageUrl(eveId: number): Promise<string | null> {
  try {
    const response = await http.get(`/media/evenement/${eveId}/affiche`);

    return response.data;
  } catch (error: any) {
    if (error.response?.status === 404) {
      return null;
    }
    throw error;
  }
}

/** Affiche d'un prochain événement organisé par un adhérent (pied de page, spec L12). */
export interface AfficheAdherent {
  eveId: number;
  libelle: string;
  date: string | null;
  vilNom: string | null;
  afficheUrl: string;
}

/** Affiches des prochains événements des adhérents, le plus proche d'abord. Vide si l'API échoue. */
export async function getAffichesAdherents(limit = 12): Promise<AfficheAdherent[]> {
  try {
    const response = await http.get(`/agenda/affiches-adherents?limit=${limit}`);
    return response.data ?? [];
  } catch {
    return [];
  }
}
