/**
 * Le ménage RÉEL d'un départ ou d'une mi-séjour, tel que le planning le reçoit
 * du CRM (`App\Services\Missions\PlanningCleaningTimes`) : démarrage et
 * clôture horodatés par l'app de la femme de ménage, et qui l'a fait.
 */
export interface CleaningTimes {
    status: string;
    arrived_at: string | null;
    left_at: string | null;
    duration_minutes?: number | null;
    /** L'instant du démarrage (ISO) — le temps écoulé se calcule à l'ouverture. */
    started_at?: string | null;
    cleaners?: string[];
}

export type CleaningSummary =
    | { kind: 'done'; arrivedAt: string; leftAt: string; durationMinutes: number | null; cleaners: string[] }
    | { kind: 'in_progress'; arrivedAt: string; elapsedMinutes: number | null; cleaners: string[] };

/**
 * Ce que l'encadré du dialogue montre (recette A, D1 : « en clair et gros avec
 * la durée ») :
 *  - terminée → Arrivée · Départ · Durée ;
 *  - en cours → « En cours depuis HH:MM » et le temps écoulé à `now` ;
 *  - rien pour une mission pas démarrée, à refaire, ou un évènement sans
 *    mission.
 */
export function cleaningSummary(cleaning: CleaningTimes | null | undefined, now: Date): CleaningSummary | null {
    if (!cleaning || !cleaning.arrived_at) return null;
    const cleaners = cleaning.cleaners ?? [];

    if ((cleaning.status === 'completed' || cleaning.status === 'verified') && cleaning.left_at) {
        return {
            kind: 'done',
            arrivedAt: cleaning.arrived_at,
            leftAt: cleaning.left_at,
            durationMinutes: cleaning.duration_minutes ?? null,
            cleaners,
        };
    }

    if (cleaning.status === 'in_progress') {
        const started = cleaning.started_at ? Date.parse(cleaning.started_at) : Number.NaN;
        return {
            kind: 'in_progress',
            arrivedAt: cleaning.arrived_at,
            // Les minutes de l'horloge AFFICHÉE, des deux côtés : « depuis
            // 10:25 » avec 11:40 au poste fait 1 h 15, jamais 1 h 14 à cause de
            // secondes que personne ne voit. Tunis est à +01:00 sans heure
            // d'été : la minute du navigateur est celle de Tunis. Et une
            // horloge de poste en retard ne rend jamais « depuis -3 min ».
            elapsedMinutes: Number.isNaN(started) ? null : Math.max(0, wholeMinutes(now.getTime()) - wholeMinutes(started)),
            cleaners,
        };
    }

    return null;
}

function wholeMinutes(ms: number): number {
    return Math.floor(ms / 60000);
}

/** `45 min`, `1 h`, `1 h 15` — la durée telle que l'app l'écrit. */
export function durationLabel(minutes: number): string {
    const hours = Math.floor(minutes / 60);
    const rest = minutes % 60;
    if (hours === 0) return `${rest} min`;
    if (rest === 0) return `${hours} h`;
    return `${hours} h ${rest.toString().padStart(2, '0')}`;
}

/** « Khaoula », « Khaoula et Ghada », « Khaoula, Ghada et Sonia ». */
export function joinNames(names: string[], and: string): string {
    if (names.length <= 1) return names[0] ?? '';
    return `${names.slice(0, -1).join(', ')} ${and} ${names[names.length - 1]}`;
}
