import HttpClient from '@/services/HttpClient';
import {
  InstallationRequestDetail,
  InstallationRequestSummary,
} from '@/models/teltoinstall/_index';

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

function unwrapObject<T>(res: MaybeWrapped<T>): T {
  if (res && typeof res === 'object' && 'data' in (res as object) && !Array.isArray(res)) {
    return (res as Wrapped<T>).data;
  }
  return res as T;
}

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

const InstallationRequestRepository = {
  list() {
    return HttpClient.get<MaybeWrapped<InstallationRequestSummary[]>>('/installation-requests').then(
      unwrapArray<InstallationRequestSummary>
    );
  },
  getDetail(id: number) {
    return HttpClient.get<MaybeWrapped<InstallationRequestDetail>>(
      `/installation-requests/${id}`
    ).then(unwrapObject<InstallationRequestDetail>);
  },
  // `dates` : 3 créneaux ISO 8601, futurs et distincts (validé côté backend).
  proposeDates(id: number, dates: string[]) {
    return HttpClient.post<MaybeWrapped<InstallationRequestDetail>>(
      `/installation-requests/${id}/propose-dates`,
      { dates }
    ).then(unwrapObject<InstallationRequestDetail>);
  },
  // Proposition de créneaux par GROUPE de véhicules. Chaque groupe :
  // { vehicle_ids, dates } (3 créneaux ISO, futurs et distincts). Soumission
  // partielle autorisée (tous les véhicules n'ont pas à être groupés en une fois).
  proposeGroups(id: number, groups: { vehicle_ids: number[]; dates: string[] }[]) {
    return HttpClient.post<MaybeWrapped<InstallationRequestDetail>>(
      `/installation-requests/${id}/propose-groups`,
      { groups }
    ).then(unwrapObject<InstallationRequestDetail>);
  },
  // L'installateur accepte une des dates suggérées par le client (contre-
  // proposition). `groupId` cible un groupe précis (sinon niveau demande legacy).
  acceptClientDate(id: number, date: string, groupId?: number) {
    return HttpClient.post<MaybeWrapped<InstallationRequestDetail>>(
      `/installation-requests/${id}/accept-client-date`,
      groupId != null ? { date, group_id: groupId } : { date }
    ).then(unwrapObject<InstallationRequestDetail>);
  },
  // L'installateur re-propose 3 créneaux (ISO, futurs, distincts) pour un groupe
  // existant (typiquement après une contre-proposition du client).
  reproposeGroupDates(id: number, groupId: number, dates: string[]) {
    return HttpClient.post<MaybeWrapped<InstallationRequestDetail>>(
      `/installation-requests/${id}/repropose-dates`,
      { group_id: groupId, dates }
    ).then(unwrapObject<InstallationRequestDetail>);
  },
};

export default InstallationRequestRepository;
