export interface TelematicsOrderOrganization {
  name: string;
  contact_name?: string | null;
}

export interface TelematicsOrderDelivery {
  primary: string | null;
  site_count: number;
}

export interface TelematicsOrder {
  id: number;
  reference: string;
  status: string;
  status_label: string;
  status_color: string;
  organization: TelematicsOrderOrganization | null;
  products: string[];
  quantity: number;
  delivery: TelematicsOrderDelivery;
  date: string;
  /** Date de commande saisie par l'admin à l'acceptation (null tant que « Lancé »). */
  order_date: string | null;
  /** Date de réception saisie par l'admin au passage à « Livré ». */
  received_at: string | null;
  total_ht: number;
  can_accept: boolean;
  can_reject: boolean;
  /** Vrai quand la commande est « En cours » et peut passer à « Livré ». */
  can_mark_delivered: boolean;
}

export interface TelematicsOrderLine {
  id: number;
  product_name: string;
  product_tagline: string | null;
  quantity: number;
  unit_price: number;
  line_total: number;
}

export interface TelematicsOrderShipment {
  site_name: string;
  address: string | null;
  contact_name: string | null;
  contact_phone: string | null;
  contact_email: string | null;
  units: number;
}

export interface TelematicsOrderPricing {
  total_ht: number;
  vat_rate: number;
  vat_amount: number;
  total_ttc: number;
  installation_mode: string;
}

export interface TelematicsOrderSummary {
  lines: number;
  boxes: number;
  sites: number;
}

export interface TelematicsOrderVehicle {
  /** Id du véhicule de ligne (telematics_box_order_line_vehicles) — clé d'affectation. */
  id: number;
  plate: string | null;
  vin: string | null;
  model: string | null;
  year: number | string | null;
  /** Boîtier (produit) à installer sur ce véhicule — nom de la ligne parente. */
  box: string | null;
  /** Site de livraison/installation du véhicule (null si non rattaché). */
  site_id: number | null;
  /** Nom du site, dénormalisé pour l'affichage et le regroupement. */
  site_name: string | null;
}

export interface TelematicsOrderDemandeur {
  name: string;
  email: string | null;
  organization: string | null;
}

export interface TelematicsOrderDetail {
  id: number;
  reference: string;
  status: string;
  status_label: string;
  status_color: string;
  submitted_at: string;
  /** Date de commande saisie par l'admin à l'acceptation (null tant que « Lancé »). */
  order_date: string | null;
  /** Date de réception saisie par l'admin au passage à « Livré ». */
  received_at: string | null;
  organization: TelematicsOrderOrganization;
  lines: TelematicsOrderLine[];
  shipments: TelematicsOrderShipment[];
  needs: string[];
  pricing: TelematicsOrderPricing;
  summary: TelematicsOrderSummary;
  demandeur: TelematicsOrderDemandeur;
  vehicles: TelematicsOrderVehicle[];
}

export interface TelematicsOrderStats {
  total: number;
  en_attente: number;
  en_cours: number;
  installes: number;
}

/**
 * Affectation d'un groupe de véhicules à un ou plusieurs installateurs
 * (relation many-to-many véhicule ↔ installateur). Affectation conjointe : chaque
 * installateur du groupe reçoit sa propre demande pour ces véhicules.
 */
export interface InstallationAssignment {
  vehicle_ids: number[];
  installer_ids: number[];
}

/**
 * Demande d'installation : l'admin construit plusieurs groupes
 * (véhicules → installateurs) et les soumet en une fois, une fois tous les
 * véhicules affectés.
 */
export interface RequestInstallationPayload {
  assignments: InstallationAssignment[];
}

export interface RequestInstallationResult {
  created: unknown[];
  order: TelematicsOrderDetail;
}

/**
 * Réponse d'un installateur notifié (suivi admin lecture seule). Statut et
 * créneaux proposés tels qu'exposés par le service installateur.
 */
export interface OrderInstallationRequest {
  id: number;
  reference: string | null;
  status: string;
  status_label: string;
  status_color: string;
  installer_name: string | null;
  assigned_user_id: number | null;
  proposed_dates: string[];
  client_suggested_dates: string[];
  selected_date: string | null;
  box_type: string | null;
  /** Véhicules affectés à cette demande (sous-ensemble de la commande). */
  vehicles: OrderInstallationRequestVehicle[];
  /**
   * Groupes de planification : l'installateur scinde les véhicules en
   * sous-groupes, chacun avec ses propres créneaux/statut. Vide pour les
   * demandes legacy négociées au niveau demande.
   */
  groups?: OrderInstallationRequestGroup[];
}

/** Groupe de planification d'une demande (sous-ensemble de véhicules + créneaux). */
export interface OrderInstallationRequestGroup {
  id: number;
  status: string;
  status_label: string;
  status_color: string;
  vehicle_ids: number[];
  vehicles: OrderInstallationRequestVehicle[];
  proposed_dates: string[];
  client_suggested_dates: string[];
  selected_date: string | null;
}

/** Véhicule porté par une demande d'installation (snapshot dénormalisé). */
export interface OrderInstallationRequestVehicle {
  id: number | null;
  plate: string | null;
  vin: string | null;
  model: string | null;
  year: number | string | null;
  box: string | null;
}
