import HttpClient from '@/services/HttpClient';
import {
  CanModuleType,
  Accessory,
  Wire,
  WireAccessory,
  DeviceModel,
  FleetVehicle,
  TelematicsBox,
} from '@/models/teltoinstall/_index';

type MaybeWrapped<T> = T | { data: T };

function unwrap<T>(res: MaybeWrapped<T[]>): T[] {
  if (Array.isArray(res)) return res;
  if (res && typeof res === 'object' && Array.isArray((res as { data: T[] }).data)) {
    return (res as { data: T[] }).data;
  }
  return [];
}

const ReferenceRepository = {
  canModuleTypes() {
    return HttpClient.get<MaybeWrapped<CanModuleType[]>>('/reference/can-module-types', { cache: true } as never).then(unwrap<CanModuleType>);
  },
  accessories() {
    return HttpClient.get<MaybeWrapped<Accessory[]>>('/reference/accessories', { cache: true } as never).then(unwrap<Accessory>);
  },
  wires() {
    return HttpClient.get<MaybeWrapped<Wire[]>>('/reference/wires', { cache: true } as never).then(unwrap<Wire>);
  },
  wireAccessories() {
    return HttpClient.get<MaybeWrapped<WireAccessory[]>>('/reference/wire-accessories', { cache: true } as never).then(unwrap<WireAccessory>);
  },
  deviceModels() {
    return HttpClient.get<MaybeWrapped<DeviceModel[]>>('/reference/device-models', { cache: true } as never).then(unwrap<DeviceModel>);
  },
  /** Recherche dans le parc fleet (plaque ou VIN) — pas de cache client, la saisie pilote la recherche. */
  fleetVehicles(search: string) {
    const qs = search ? `?search=${encodeURIComponent(search)}` : '';
    return HttpClient.get<MaybeWrapped<FleetVehicle[]>>(`/reference/fleet-vehicles${qs}`).then(unwrap<FleetVehicle>);
  },
  /** Catalogue des boîtiers fleet (source de vérité distante du produit posé). */
  telematicsBoxes() {
    return HttpClient.get<MaybeWrapped<TelematicsBox[]>>('/reference/telematics-boxes').then(unwrap<TelematicsBox>);
  },
};

export default ReferenceRepository;
