import { triJournee, type OtJournee } from './journee';

const ot = (sur: Partial<OtJournee>): OtJournee => ({
  priority: 'NONE',
  status: 'OPEN',
  dueDate: null,
  createdAt: '2026-07-01T08:00:00.000Z',
  ...sur,
});

describe('triJournee (écran 1 de la maquette R4)', () => {
  it('met « personne bloquée » en tête, puis la priorité décroissante', () => {
    const tri = triJournee([
      ot({ priority: 'LOW' }),
      ot({ priority: 'PERSON_TRAPPED' }),
      ot({ priority: 'HIGH' }),
      ot({ priority: 'MEDIUM' }),
    ]);
    expect(tri.map((o) => o.priority)).toEqual(['PERSON_TRAPPED', 'HIGH', 'MEDIUM', 'LOW']);
  });

  it('à priorité égale : échéance la plus proche d’abord, sans échéance en dernier', () => {
    const tri = triJournee([
      ot({ priority: 'HIGH', dueDate: null, createdAt: '2026-07-01T08:00:00.000Z' }),
      ot({ priority: 'HIGH', dueDate: '2026-07-20T00:00:00.000Z' }),
      ot({ priority: 'HIGH', dueDate: '2026-07-18T00:00:00.000Z' }),
    ]);
    expect(tri.map((o) => o.dueDate)).toEqual([
      '2026-07-18T00:00:00.000Z',
      '2026-07-20T00:00:00.000Z',
      null,
    ]);
  });

  it('écarte les OT terminés et annulés — la journée ne montre que l’à-faire', () => {
    const tri = triJournee([
      ot({ status: 'DONE' }),
      ot({ status: 'IN_PROGRESS' }),
      ot({ status: 'CANCELLED' }),
      ot({ status: 'ON_HOLD' }),
    ]);
    expect(tri.map((o) => o.status)).toEqual(['IN_PROGRESS', 'ON_HOLD']);
  });
});
