import { format, formatDistanceToNowStrict, isToday, isYesterday, parseISO } from "date-fns";
import { fr } from "date-fns/locale";
import type { Comment, Trip, TripStep } from "@/types";

export type ActivityKind = "action" | "comment" | "validation" | "invitation" | "information";
export interface ActivityEvent { id: string; kind: ActivityKind; at: string; title: string; detail: string; href: string; }

export function formatCommunicationTime(value: string, now = new Date()): string {
  const date = parseISO(value);
  const elapsed = Math.max(0, now.getTime() - date.getTime());
  if (elapsed < 24 * 60 * 60 * 1000) return `il y a ${formatDistanceToNowStrict(date, { locale: fr })}`;
  if (isYesterday(date)) return `Hier · ${format(date, "HH:mm")}`;
  if (isToday(date)) return `Aujourd’hui · ${format(date, "HH:mm")}`;
  return format(date, "d MMM · HH:mm", { locale: fr });
}

export function getCommentRole(comment: Comment, plannerId: string): "Planner" | "Voyageur" {
  return comment.userId === plannerId ? "Planner" : "Voyageur";
}

export function getStepConversations(trip: Trip) {
  return trip.steps.filter((step) => step.comments.length > 0).map((step) => ({
    step,
    comments: [...step.comments].sort((a, b) => a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id)),
  })).sort((a, b) => (b.comments.at(-1)?.createdAt || "").localeCompare(a.comments.at(-1)?.createdAt || ""));
}

const memberName = (trip: Trip, userId: string) => trip.members?.find((member) => member.userId === userId)?.name || "Un voyageur";
const stepHref = (trip: Trip, step: TripStep) => `/dashboard/trips/${trip.id}/itinerary?day=${step.day}&step=${encodeURIComponent(step.id)}&panel=step`;

export function deriveTripActivity(trips: Trip[]): ActivityEvent[] {
  return trips.flatMap((trip) => {
    const comments = trip.steps.flatMap((step) => step.comments.map((comment): ActivityEvent => ({ id: `comment:${comment.id}`, kind: "comment", at: comment.createdAt, title: `${comment.userName} a commenté ${step.activity}`, detail: trip.title, href: `/dashboard/trips/${trip.id}/messages?conversation=${step.id}` })));
    const validations = trip.steps.flatMap((step) => (step.validations || []).map((validation): ActivityEvent => ({ id: `validation:${step.id}:${validation.travelerId}`, kind: validation.status === "rejected" ? "action" : "validation", at: validation.updatedAt, title: `${memberName(trip, validation.travelerId)} ${validation.status === "approved" ? "a validé" : "demande une modification de"} ${step.activity}`, detail: trip.title, href: stepHref(trip, step) })));
    const invitations = (trip.invitations || []).flatMap((invitation): ActivityEvent[] => invitation.status === "accepted" && invitation.acceptedAt ? [{ id: `invitation:${trip.id}:${invitation.email}`, kind: "invitation", at: invitation.acceptedAt, title: "Invitation acceptée", detail: `${invitation.email} · ${trip.title}`, href: `/dashboard/trips/${trip.id}/travelers` }] : []);
    const documents = trip.documents.map((document): ActivityEvent => ({ id: `document:${document.id}`, kind: "information", at: document.uploadedAt, title: `${document.name} a été ajouté`, detail: trip.title, href: `/dashboard/trips/${trip.id}/documents` }));
    return [...comments, ...validations, ...invitations, ...documents];
  }).filter((event) => Boolean(event.at)).sort((a, b) => b.at.localeCompare(a.at));
}
