"use client" import { FileText, Calendar, Hash, Users, Car, Building2, Clock, Mail, Phone, AlertTriangle, CheckCircle2, TimerIcon, } from "lucide-react" import { Card, CardContent, CardHeader, CardTitle, } from "@/shared/components/ui/card" import { Badge } from "@/shared/components/ui/badge" import { Separator } from "@/shared/components/ui/separator" import { cn } from "@/shared/lib/utils" import { formatDate, formatCurrency, formatEnum, formatNumber } from "@/shared/utils/formatters" import { useInvoice } from "./invoice-context" function InfoItem({ icon: Icon, label, value, }: { icon: React.ComponentType<{ className?: string }> label: string value?: string | null }) { return (
{label} {value || }
) } const statusVariantMap: Record = { draft: "secondary", open: "default", paid: "default", overdue: "destructive", void: "outline", } function getDueInfo(dueDateStr?: string, status?: string) { if (!dueDateStr) return null const now = new Date() const due = new Date(dueDateStr) const diffMs = due.getTime() - now.getTime() const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24)) const isPaid = status === "paid" || status === "void" if (isPaid) return { label: formatDate(dueDateStr), variant: "neutral" as const } if (diffDays < 0) return { label: `${Math.abs(diffDays)} days overdue`, variant: "overdue" as const } if (diffDays === 0) return { label: "Due today", variant: "today" as const } if (diffDays <= 7) return { label: `Due in ${diffDays} day${diffDays === 1 ? "" : "s"}`, variant: "soon" as const } return { label: formatDate(dueDateStr), variant: "neutral" as const } } export function InvoiceGeneralInfo() { const _invoice = useInvoice() if (!_invoice) return null // eslint-disable-next-line @typescript-eslint/no-explicit-any const invoice = _invoice as any const customer = invoice.customer || {} const vehicle = invoice.vehicle || {} const insurer = invoice.insurer || {} const department = invoice.department || null const total = parseFloat(String(invoice.total ?? 0)) || 0 const paid = parseFloat(String(invoice.payments_recieved ?? invoice.received_payment ?? 0)) || 0 const balanceDue = parseFloat(String(invoice.balance_due ?? 0)) || 0 const dueInfo = getDueInfo(invoice.due_date as string | undefined, invoice.status as string | undefined) return (
{/* ── Summary Hero ── */}
{/* Status */} Status
{invoice.status === "paid" && } {invoice.status === "overdue" && } {(invoice.status === "draft" || invoice.status === "open") && } {formatEnum(String(invoice.status ?? ""))}
{invoice.invoice_number && ( {invoice.invoice_number} )}
{/* Due Date */} Due Date {formatDate(invoice.due_date) || "—"} {dueInfo && dueInfo.variant !== "neutral" && ( {dueInfo.label} )} {/* Total Amount */} Total Amount {formatCurrency(total)} {paid > 0 && ( {formatCurrency(paid)} received )} {/* Balance Due */} 0 && invoice.status !== "paid" && "border-primary/40 bg-primary/5", balanceDue <= 0 && "border-green-500/40 bg-green-50 dark:bg-green-950/20", )}> Balance Due 0 && invoice.status !== "paid" && "text-primary", balanceDue <= 0 && "text-green-600", )}> {formatCurrency(balanceDue)} {balanceDue <= 0 && ( Fully paid )} {invoice.discount && invoice.discount !== "no" && ( Discount: {formatEnum(invoice.discount)} )}
{/* ── Customer & Vehicle ── */}
Customer Information
{customer.address_line_1 && ( <>
Address

{customer.address_line_1} {customer.address_line_2 ? `, ${customer.address_line_2}` : ""}
{customer.city ?? ""}{customer.zip_code ? `, ${customer.zip_code}` : ""}

)}
Vehicle Information
{vehicle.mileage && ( <> )}
{/* ── Invoice Meta ── */} Invoice Details
{invoice.has_insurance && insurer.id && ( )} {invoice.kms_in ? ( ) : null} {invoice.invoice_title ? ( ) : null}
{/* ── Notes & Terms ── */} {(invoice.notes || invoice.terms_and_conditions) && (
{invoice.notes && ( Notes

{invoice.notes}

)} {invoice.terms_and_conditions && ( Terms & Conditions

{invoice.terms_and_conditions}

)}
)}
) }