import http from '@/http';
import type {VilleEvent} from '@/types/ville';

/** Région (niveau 1) ou département (niveau 2), tel que l'expose `GET /geolocale_subdivisions/{id}`. */
export interface Subdivision {
  subId: number;
  subNom: string;
  subCode?: string | null;
  subNiveau: number;
  subGeoX?: number | null;
  subGeoY?: number | null;
  subGeoZoom?: number | null;
  subNbCommunes?: number | null;
  subMere?: {subId: number; subNom: string; subNiveau?: number} | null;
  subPay?: {payNom: string; payCode?: string} | null;
  /** Départements d'une région. */
  subdivisions?: {subId: number; subNom: string; subNiveau: number}[];
}

export interface CommuneResume {
  vilId: number;
  vilNom: string;
  vilCodepostal?: string | null;
}

export interface CommunesPage {
  communes: CommuneResume[];
  total: number;
  page: number;
  itemsPerPage: number;
}

export const COMMUNES_PAR_PAGE = 60;

export async function getSubdivision(subId: string): Promise<Subdivision> {
  try {
    const response = await http.get(`/geolocale_subdivisions/${subId}`);
    return response.data;
  } catch (error: unknown) {
    const httpError = error as {response?: {status: number}};
    if (httpError.response?.status === 404) {
      throw new Error(`Subdivision not found for ID: ${subId}`);
    }
    throw error;
  }
}

/** Communes d'une région (niveau 1) ou d'un département (niveau 2), par ordre alphabétique, paginées (spec L156). */
export async function getCommunesDeSubdivision(sub: {subId: number; subNiveau: number}, page = 1, itemsPerPage = COMMUNES_PAR_PAGE): Promise<CommunesPage> {
  try {
    const filtre = sub.subNiveau === 1 ? 'vilSub1' : 'vilSub2';
    const response = await http.get(`/geolocale_villes?${filtre}=${sub.subId}&order%5BvilNom%5D=asc&page=${page}&itemsPerPage=${itemsPerPage}`);
    return {
      communes: response.data?.['hydra:member'] ?? [],
      total: response.data?.['hydra:totalItems'] ?? 0,
      page,
      itemsPerPage,
    };
  } catch {
    return {communes: [], total: 0, page, itemsPerPage};
  }
}

/** Prochains événements valides des communes de la région ou du département. Vide si l'API échoue. */
export async function getEvenementsDeSubdivision(sub: {subId: number; subNiveau: number}, itemsPerPage = 4): Promise<VilleEvent[]> {
  try {
    const today = new Date().toISOString().slice(0, 10);
    const filtre = sub.subNiveau === 1 ? 'eveVil.vilSub1' : 'eveVil.vilSub2';
    const response = await http.get(`/evenements?page=1&itemsPerPage=${itemsPerPage}&${filtre}=${sub.subId}&eveValide=1&eveDate%5Bafter%5D=${today}`);
    return response.data?.['hydra:member'] ?? [];
  } catch {
    return [];
  }
}
