import { Head, Link } from '@inertiajs/react';
import { ArrowLeft, Check, Pencil, Send, Trash2 } from 'lucide-react';
import type { ReactNode } from 'react';
import { useEffect, useState } from 'react';
import {
    Accordion,
    AccordionContent,
    AccordionItem,
    AccordionTrigger,
} from '@/components/ui/accordion';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import { Progress } from '@/components/ui/progress';
import { useFlashMessages } from '@/hooks/use-flash-messages';
import { cn, formatTimestamp } from '@/lib/utils';
import {
    destroy as fichaDestroy,
    edit as fichaEdit,
    submitReview as fichaSubmitReview,
} from '@/routes/ficha';
import { show as fichasRegistroShow } from '@/routes/fichas-registro';
import { CodigoCatastral } from './components/CodigoCatastral';
import { ConfirmDialog } from './components/ConfirmDialog';
import { EstadoBadge } from './components/estado-badge';
import MainLayout from './layouts/main';
import { toInputValue } from './lib/codigoInventario';
import { type SeccionCodigo, seccionShowUrl } from './sections';
import { useCodigoCatastral } from './stores/useCodigoCatastral';
import type { FichaInventario } from './types';

type SeccionEstado = {
    codigo: SeccionCodigo;
    label: string;
    completa: boolean;
};

type Props = {
    ficha: FichaInventario;
    secciones: SeccionEstado[];
};

export default function FichaInventarioShow({ ficha, secciones }: Props) {
    useFlashMessages();

    const [dialog, setDialog] = useState<'delete' | 'review' | null>(null);
    const inicializar = useCodigoCatastral((s) => s.inicializar);
    const reset = useCodigoCatastral((s) => s.reset);

    useEffect(() => {
        inicializar({
            zona: toInputValue(ficha.codigo_zona),
            manzano: toInputValue(ficha.codigo_manzano),
            lote: toInputValue(ficha.codigo_lote),
            sublote: toInputValue(ficha.codigo_sublote),
        });

        return () => reset();
    }, [ficha, inicializar, reset]);

    const completadas = secciones.filter((s) => s.completa).length;
    const total = secciones.length;
    const progresoPct = total > 0 ? Math.round((completadas / total) * 100) : 0;
    const todasCompletas = completadas === total;

    return (
        <>
            <Head title={`Ficha de inventario ${ficha.codigo_catastral ?? ''}`} />

            <main className="min-h-0 overflow-y-auto border-r bg-background">
                <div className="flex min-h-full flex-col gap-6 px-4 py-6 md:px-8">
                    <Link
                        href={fichasRegistroShow.url(ficha.registro_id as number)}
                        className="inline-flex w-fit items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground"
                    >
                        <ArrowLeft className="size-4" />
                        Volver a ficha de registro
                    </Link>

                    <div className="space-y-2">
                        <h1 className="text-2xl font-semibold tracking-tight md:text-3xl">
                            Ficha de inventario
                        </h1>
                        <div className="flex flex-wrap items-center gap-2">
                            <EstadoBadge estado={ficha.estado} />
                            <CodigoCatastral
                                zona={ficha.codigo_zona}
                                manzano={ficha.codigo_manzano}
                                lote={ficha.codigo_lote}
                                sublote={ficha.codigo_sublote}
                                size="sm"
                            />
                        </div>
                    </div>

                    <Card>
                        <CardHeader>
                            <CardTitle>Datos generales</CardTitle>
                            <CardDescription>
                                Informacion cabecera de la ficha de inventario.
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="flex flex-col gap-4 text-sm">
                            <DataRow label="Denominacion" value={ficha.denominacion} />
                            <DataRow label="Categoria" value={ficha.categoria} />
                            <div className="flex items-center justify-between gap-4 border-b border-border/50 py-2.5 last:border-b-0">
                                <span className="text-muted-foreground">
                                    Codigo catastral
                                </span>
                                <CodigoCatastral
                                    zona={ficha.codigo_zona}
                                    manzano={ficha.codigo_manzano}
                                    lote={ficha.codigo_lote}
                                    sublote={ficha.codigo_sublote}
                                />
                            </div>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardContent className="pt-6">
                            <Accordion
                                type="single"
                                collapsible
                                defaultValue="secciones"
                            >
                                <AccordionItem
                                    value="secciones"
                                    className="border-b-0"
                                >
                                    <AccordionTrigger className="hover:no-underline">
                                        <div className="flex flex-1 items-center gap-3">
                                            <span className="font-semibold">
                                                Secciones
                                            </span>
                                            <span className="text-xs text-muted-foreground tabular-nums">
                                                {completadas}/{total} (
                                                {progresoPct}%)
                                            </span>
                                            <Progress
                                                value={progresoPct}
                                                className="h-1.5 flex-1"
                                            />
                                        </div>
                                    </AccordionTrigger>
                                    <AccordionContent className="pt-3">
                                        <div className="grid grid-cols-1 gap-0.5 sm:grid-cols-2">
                                            {secciones.map((s) => (
                                                <Link
                                                    key={s.codigo}
                                                    href={seccionShowUrl(
                                                        ficha.id,
                                                        s.codigo,
                                                    )}
                                                    className="flex items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-muted/50"
                                                >
                                                    <span
                                                        className={cn(
                                                            'flex size-5 shrink-0 items-center justify-center rounded font-mono text-[0.6rem] font-semibold',
                                                            s.completa
                                                                ? 'bg-primary/15 text-primary'
                                                                : 'bg-muted text-muted-foreground',
                                                        )}
                                                    >
                                                        {s.codigo.padStart(
                                                            2,
                                                            '0',
                                                        )}
                                                    </span>
                                                    <span className="flex-1 truncate">
                                                        {s.label}
                                                    </span>
                                                    {s.completa ? (
                                                        <Check className="size-3.5 text-primary" />
                                                    ) : null}
                                                </Link>
                                            ))}
                                        </div>
                                    </AccordionContent>
                                </AccordionItem>
                            </Accordion>
                        </CardContent>
                    </Card>

                    <Card>
                        <CardHeader>
                            <CardTitle>Auditoria</CardTitle>
                            <CardDescription>
                                Creacion y ultima actualizacion del registro.
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="flex flex-col gap-4 text-sm">
                            <AuditRow
                                label="Creado por"
                                value={ficha.creator_name ?? 'Desconocido'}
                            />
                            <AuditRow
                                label="Fecha de creacion"
                                value={formatTimestamp(ficha.created_at)}
                            />
                            <AuditRow
                                label="Ultima actualizacion por"
                                value={ficha.updated_by_name ?? 'Sin actualizacion'}
                            />
                            <AuditRow
                                label="Fecha de ultima actualizacion"
                                value={
                                    ficha.updated_by_name
                                        ? formatTimestamp(ficha.updated_at)
                                        : 'Sin actualizacion'
                                }
                            />
                        </CardContent>
                    </Card>

                    {ficha.can_edit || ficha.can_submit_review ? (
                        <div className="flex flex-wrap gap-2">
                            {ficha.can_edit ? (
                                <Link href={fichaEdit.url(ficha.id)}>
                                    <Button>
                                        <Pencil data-icon="inline-start" />
                                        Editar ficha
                                    </Button>
                                </Link>
                            ) : null}
                            {ficha.can_submit_review ? (
                                <div className="flex flex-col items-start gap-1.5">
                                    <Button
                                        variant="secondary"
                                        onClick={() => setDialog('review')}
                                        disabled={!todasCompletas}
                                    >
                                        <Send data-icon="inline-start" />
                                        Enviar a revisión
                                    </Button>
                                    {!todasCompletas ? (
                                        <p className="text-xs text-muted-foreground">
                                            Completa todas las secciones (
                                            {completadas}/{total}) para enviar a
                                            revisión.
                                        </p>
                                    ) : null}
                                </div>
                            ) : null}
                        </div>
                    ) : null}

                    {ficha.can_delete ? (
                        <Card className="border-destructive/30">
                            <CardHeader>
                                <CardTitle className="text-destructive">
                                    Zona sensible
                                </CardTitle>
                                <CardDescription>
                                    Acciones irreversibles sobre la ficha de
                                    inventario.
                                </CardDescription>
                            </CardHeader>
                            <CardContent>
                                <Button
                                    variant="destructive"
                                    onClick={() => setDialog('delete')}
                                >
                                    <Trash2 data-icon="inline-start" />
                                    Eliminar ficha
                                </Button>
                            </CardContent>
                        </Card>
                    ) : null}
                </div>
            </main>

            <ConfirmDialog
                open={dialog === 'delete'}
                onOpenChange={(open) => !open && setDialog(null)}
                variant="destructive"
                title="Eliminar ficha de inventario"
                description="Esta accion no se puede deshacer."
                warningText={`Se eliminara permanentemente la ficha ${ficha.codigo_catastral ?? ''}.`}
                confirmButtonText="Eliminar ficha"
                actionUrl={fichaDestroy.url(ficha.id)}
                method="delete"
            />

            <ConfirmDialog
                open={dialog === 'review'}
                onOpenChange={(open) => !open && setDialog(null)}
                title="Enviar ficha a revision"
                description="La ficha dejara de ser editable una vez enviada."
                warningText="Solo podra ser modificada si resulta observada en el proceso de revision."
                confirmButtonText="Enviar a revision"
                actionUrl={fichaSubmitReview.url(ficha.id)}
                method="patch"
            />
        </>
    );
}

FichaInventarioShow.layout = MainLayout;

function DataRow({
    label,
    value,
}: {
    label: string;
    value: string;
}) {
    return (
        <div className="flex items-center justify-between gap-4 border-b border-border/50 py-2.5 last:border-b-0">
            <span className="text-muted-foreground">{label}</span>
            <span className="flex items-center gap-2 text-right font-medium">
                <span className="truncate">{value || '—'}</span>
            </span>
        </div>
    );
}

function AuditRow({
    label,
    value,
    icon,
}: {
    label: string;
    value: string;
    icon?: ReactNode;
}) {
    return (
        <div className="flex items-center justify-between gap-4 border-b border-border/50 py-2.5 last:border-b-0">
            <span className="text-muted-foreground">{label}</span>
            <span className="flex items-center gap-2 text-right font-medium">
                {icon}
                <span className="truncate">{value}</span>
            </span>
        </div>
    );
}
