"use client";
import { useCallback, useEffect, useState } from "react";
import { useParams, useRouter } from "next/navigation";
import { Spinner } from "@/Components/UI";
import { TripFormModal } from "@/Components/Trip/Tripformmodal";
import { TripDeleteModal } from "@/Components/Trip/Tripdeletemodal";
import { TripReportPanel } from "@/Components/Trip_Report/Tripreportpanel";
import { tripService } from "@/services/trip.service";
import { getStoredToken } from "@/lib/auth";
import type {
Trip,
CreateTripPayload,
UpdateTripPayload,
} from "@/types/trip";
import { TRIP_STATUS_MAP } from "@/types/trip";
// ── Helpers ───────────────────────────────────────────────────────────────────
function fmtDate(iso?: string | null): string {
if (!iso) return "—";
return new Date(iso).toLocaleDateString("ar-SA", {
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
});
}
function fmtNumber(n?: number | string | null): string {
if (n == null || n === "") return "—";
return Number(n).toLocaleString("ar-SA");
}
// ── Sub-components ────────────────────────────────────────────────────────────
function SectionCard({ title, children }: { title: string; children: React.ReactNode }) {
return (
);
}
function DetailRow({
label,
value,
mono = false,
}: {
label: string;
value: string;
mono?: boolean;
}) {
return (
{label}
{value}
);
}
// ── Stat card (للأعداد) ───────────────────────────────────────────────────────
function StatCard({
label,
value,
color = "var(--color-brand-600)",
bg = "var(--color-brand-50, #EFF6FF)",
}: {
label: string;
value: string;
color?: string;
bg?: string;
}) {
return (
{label}
{value}
);
}
// ── Page ──────────────────────────────────────────────────────────────────────
export default function TripDetailPage() {
const params = useParams();
const router = useRouter();
const tripId = params?.tripId as string;
const [trip, setTrip] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
// ── Modal state ───────────────────────────────────────────────────────────
const [editOpen, setEditOpen] = useState(false);
const [deleteOpen, setDeleteOpen] = useState(false);
const [deleting, setDeleting] = useState(false);
// ── Load trip ─────────────────────────────────────────────────────────────
const loadTrip = useCallback(async () => {
if (!tripId) return;
setLoading(true);
setError(null);
try {
const token = getStoredToken();
const res = await tripService.getById(tripId, token);
setTrip((res as unknown as { data: Trip }).data);
} catch (err: unknown) {
setError(err instanceof Error ? err.message : "تعذّر تحميل بيانات الرحلة.");
} finally {
setLoading(false);
}
}, [tripId]);
useEffect(() => { loadTrip(); }, [loadTrip]);
// ── Edit submit ───────────────────────────────────────────────────────────
const handleEditSubmit = useCallback(
async (
payload: CreateTripPayload | UpdateTripPayload,
_isNew: boolean,
): Promise => {
if (!trip) return false;
try {
const token = getStoredToken();
await tripService.update(trip.id, payload as UpdateTripPayload, token);
await loadTrip();
return true;
} catch {
return false;
}
},
[trip, loadTrip],
);
// ── Delete ────────────────────────────────────────────────────────────────
const handleConfirmDelete = useCallback(async () => {
if (!trip) return;
setDeleting(true);
try {
const token = getStoredToken();
await tripService.delete(trip.id, token);
router.back();
} catch {
setDeleting(false);
setDeleteOpen(false);
}
}, [trip, router]);
const statusConfig = trip ? TRIP_STATUS_MAP[trip.status] : null;
// ── Loading ───────────────────────────────────────────────────────────────
if (loading) {
return (
);
}
// ── Error ─────────────────────────────────────────────────────────────────
if (error || !trip) {
return (
{error ?? "الرحلة غير موجودة."}
);
}
return (
<>
{/* ── Header ── */}
{/* Back + trip info */}
{/* Trip icon */}
{trip.title}
{trip.tripNumber}
{statusConfig && (
{statusConfig.label}
)}
{trip.isDeleted && (
محذوفة
)}
{/* Actions */}
{/* ── Stats row ── */}
{/* ── Content grid ── */}
{/* Basic Info */}
{/* Driver */}
{trip.driver ? (
<>
>
) : (
لا توجد بيانات للسائق.
)}
{/* Car */}
{trip.car ? (
<>
>
) : (
لا توجد بيانات للسيارة.
)}
{/* System Info */}
{trip.isDeleted && (
)}
{/* ── Notes (full width, if any) ── */}
{trip.notes && (
{trip.notes}
)}
{/* ── Report section ── */}
{/* ── Edit modal ── */}
{editOpen && (
setEditOpen(false)}
onSubmit={handleEditSubmit}
/>
)}
{/* ── Delete modal ── */}
{deleteOpen && (
setDeleteOpen(false)}
onConfirm={handleConfirmDelete}
/>
)}
>
);
}