import type { WorkOrderPriority, WorkOrderStatus } from '@siop/shared';

/** Tri de « Ma journée » (maquette R4, écran 1) : priorité décroissante
 *  (personne bloquée en tête) puis échéance la plus proche ; les OT clos
 *  ou annulés n'apparaissent pas. Fonction pure — testée. */

const POIDS: Record<WorkOrderPriority, number> = {
  PERSON_TRAPPED: 4,
  HIGH: 3,
  MEDIUM: 2,
  LOW: 1,
  NONE: 0,
};

export interface OtJournee {
  priority: WorkOrderPriority;
  status: WorkOrderStatus;
  dueDate: string | null;
  createdAt: string;
}

export function triJournee<T extends OtJournee>(ots: readonly T[]): T[] {
  return ots
    .filter((o) => o.status !== 'DONE' && o.status !== 'CANCELLED')
    .sort(
      (a, b) =>
        POIDS[b.priority] - POIDS[a.priority] ||
        (a.dueDate ? Date.parse(a.dueDate) : Infinity) -
          (b.dueDate ? Date.parse(b.dueDate) : Infinity) ||
        Date.parse(a.createdAt) - Date.parse(b.createdAt),
    );
}
