import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import AppLayout from '@/layouts/app-layout';
import { type BreadcrumbItem } from '@/types';
import { Head, Link, usePage } from '@inertiajs/react';
import { AlertTriangle, ArrowLeft, ExternalLink } from 'lucide-react';
import * as React from 'react';

interface Depense {
    id: number;
    title: string | null;
    date_dep: string | null;
    created_at: string | null;
    amount: number;
    pic_name: string | null;
    image_url: string | null;
    image_missing: boolean;
    property: { id: number; name: string } | null;
    creator: string | null;
}

interface PageProps {
    depense: Depense;
    [k: string]: unknown;
}

function frDate(value: string | null, withTime = false): string {
    if (!value) return '—';
    const d = new Date(value);
    if (Number.isNaN(d.getTime())) return value;
    const dd = String(d.getDate()).padStart(2, '0');
    const mm = String(d.getMonth() + 1).padStart(2, '0');
    const yy = d.getFullYear();
    const base = `${dd}/${mm}/${yy}`;
    if (!withTime) return base;
    const h = String(d.getHours()).padStart(2, '0');
    const min = String(d.getMinutes()).padStart(2, '0');
    const s = String(d.getSeconds()).padStart(2, '0');
    return `${base} ${h}:${min}:${s}`;
}

export default function Show() {
    const { depense } = usePage<PageProps>().props;

    const breadcrumbs: BreadcrumbItem[] = [
        { title: 'Dépenses', href: '/depenses' },
        { title: `Dépense #${depense.id}`, href: `/depenses/show/${depense.id}` },
    ];

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`Dépense #${depense.id}`} />

            <div className="flex h-full flex-1 flex-col gap-4 p-3 sm:p-4 lg:p-6">
                <div className="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
                    <div className="flex items-center gap-3">
                        <Button variant="ghost" size="icon" asChild>
                            <Link href="/depenses">
                                <ArrowLeft className="h-5 w-5" />
                            </Link>
                        </Button>
                        <div>
                            <h1 className="text-2xl font-semibold tracking-tight">Dépense #{depense.id}</h1>
                            <p className="text-muted-foreground text-sm">{depense.title || 'Sans titre'}</p>
                        </div>
                    </div>
                </div>

                <Card>
                    <CardHeader>
                        <CardTitle>Informations</CardTitle>
                    </CardHeader>
                    <CardContent className="grid grid-cols-1 gap-x-8 gap-y-3 sm:grid-cols-2">
                        <Field label="Titre" value={depense.title} className="sm:col-span-2" />
                        <Field label="Date" value={frDate(depense.date_dep ?? depense.created_at)} />
                        <Field
                            label="Montant"
                            value={
                                <span className="text-red-700 text-lg font-semibold tabular-nums">
                                    {depense.amount.toLocaleString('fr-TN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} TND
                                </span>
                            }
                        />
                        <Field
                            label="Logement"
                            value={
                                depense.property ? (
                                    <Link href={`/logements/show/${depense.property.id}`} className="text-sky-700 inline-flex items-center gap-1 underline">
                                        {depense.property.name} <ExternalLink className="h-3 w-3" />
                                    </Link>
                                ) : null
                            }
                        />
                        <Field label="Créé par" value={depense.creator} />
                    </CardContent>
                </Card>

                <Card>
                    <CardHeader>
                        <CardTitle>Justificatif</CardTitle>
                    </CardHeader>
                    <CardContent>
                        {depense.image_url ? (
                            <a href={depense.image_url} target="_blank" rel="noopener noreferrer">
                                <img
                                    src={depense.image_url}
                                    alt={depense.title || 'Justificatif'}
                                    className="max-h-[600px] rounded-lg border object-contain"
                                />
                            </a>
                        ) : depense.image_missing ? (
                            <div className="border-amber-300 bg-amber-50 text-amber-800 flex items-center gap-2 rounded-md border px-4 py-3 text-sm">
                                <AlertTriangle className="h-4 w-4" />
                                Fichier introuvable sur le serveur : <code className="ml-1 font-mono text-xs">{depense.pic_name}</code>
                            </div>
                        ) : (
                            <span className="text-muted-foreground text-sm">Aucun justificatif joint.</span>
                        )}
                    </CardContent>
                </Card>
            </div>
        </AppLayout>
    );
}

function Field({
    label,
    value,
    className = '',
}: {
    label: string;
    value: React.ReactNode;
    className?: string;
}) {
    return (
        <div className={`flex flex-col gap-0.5 ${className}`}>
            <span className="text-muted-foreground text-xs uppercase tracking-wide">{label}</span>
            <span className="text-base break-words">{value ?? '—'}</span>
        </div>
    );
}
