import { Form, Head, Link } from '@inertiajs/react';
import { ArrowLeft, Save } from 'lucide-react';
import { useEffect } from 'react';
import { update as fichaUpdate } from '@/routes/ficha';
import { show as fichasRegistroShow } from '@/routes/fichas-registro';
import { CodigoInventario } from './components/CodigoInventario';
import { CodigoRegistro } from './components/CodigoRegistro';
import { SubmitButton } from './components/SubmitButton';
import MainLayout from './layouts/main';
import { toInputValue } from './lib/codigoInventario';
import { useCodigoCatastral } from './stores/useCodigoCatastral';
import type { CodigoInventarioState, FichaInventario, Registro } from './types';

type Props = {
    ficha: FichaInventario;
    registro: Registro;
};

export default function FichaInventarioEdit({ ficha, registro }: Props) {
    const zona = useCodigoCatastral((s) => s.zona);
    const manzano = useCodigoCatastral((s) => s.manzano);
    const lote = useCodigoCatastral((s) => s.lote);
    const sublote = useCodigoCatastral((s) => s.sublote);
    const setCampo = useCodigoCatastral((s) => s.setCampo);
    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 codigo: CodigoInventarioState = {
        zona,
        manzano,
        lote,
        sublote,
        setZona: (value) => setCampo('zona', value),
        setManzano: (value) => setCampo('manzano', value),
        setLote: (value) => setCampo('lote', value),
        setSublote: (value) => setCampo('sublote', value),
        estaCompleto: [zona, manzano, lote].every(
            (segment) => segment.trim() !== '',
        ),
    };

    return (
        <>
            <Head title="Editar Ficha de Inventario" />

            <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(registro.id)}
                        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">
                            Editar ficha de inventario
                        </h1>
                    </div>

                    <Form
                        action={fichaUpdate.url(ficha.id)}
                        method="put"
                        className="flex flex-1 flex-col gap-6"
                    >
                        {({ errors, processing }) => (
                            <>
                                <CodigoRegistro registro={registro} />
                                <CodigoInventario
                                    codigo={codigo}
                                    errors={errors}
                                    defaults={{
                                        denominacion: ficha.denominacion,
                                        categoria: ficha.categoria,
                                    }}
                                />

                                <div className="sticky bottom-0 mt-auto flex justify-end border-t bg-background/95 py-4 backdrop-blur">
                                    <SubmitButton
                                        disabled={!codigo.estaCompleto}
                                        loading={processing}
                                        loadingText="Guardando..."
                                        icon={Save}
                                    >
                                        Guardar cambios
                                    </SubmitButton>
                                </div>
                            </>
                        )}
                    </Form>
                </div>
            </main>
        </>
    );
}

FichaInventarioEdit.layout = MainLayout;
