import type { Trip } from "@/types";
import { getPublishedSteps, getVisibleDocuments } from "@/services/travelerViewModel";

export type TravelerActivityKind = "comment" | "step" | "document";
export interface TravelerActivityItem { id: string; kind: TravelerActivityKind; at: string; title: string; detail: string; href: string; action: string; }

export function deriveTravelerActivity(trips: Trip[]): TravelerActivityItem[] {
  return trips.flatMap((trip) => {
    const publishedSteps = getPublishedSteps(trip);
    const comments = publishedSteps.flatMap((step) => step.comments.map((comment): TravelerActivityItem => ({
      id: `comment:${comment.id}`, kind: "comment", at: comment.createdAt,
      title: `Nouveau message sur ${step.activity}`, detail: comment.userName,
      href: `/voyageur/trips/${trip.id}?day=${step.day}&step=${encodeURIComponent(step.id)}`, action: "Lire",
    })));
    const steps = publishedSteps.flatMap((step): TravelerActivityItem[] => step.updatedAt ? [{
      id: `step:${step.id}`, kind: "step", at: step.updatedAt,
      title: `${step.activity} a été mise à jour`, detail: trip.title,
      href: `/voyageur/trips/${trip.id}?day=${step.day}&step=${encodeURIComponent(step.id)}`, action: "Voir l’étape",
    }] : []);
    const documents = getVisibleDocuments(trip).map((document): TravelerActivityItem => ({
      id: `document:${document.id}`, kind: "document", at: document.uploadedAt,
      title: "Nouveau document", detail: document.name,
      href: `/voyageur/documents/${trip.id}`, action: "Ouvrir",
    }));
    return [...comments, ...steps, ...documents];
  }).filter((event) => !Number.isNaN(Date.parse(event.at)))
    .sort((a, b) => b.at.localeCompare(a.at) || a.id.localeCompare(b.id));
}
