import { Form, Head, Link } from '@inertiajs/react';
import { ArrowLeft, Save } from 'lucide-react';
import { useEffect } from 'react';
import { store } 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 { isNumericSigno, toInputValue } from './lib/codigoInventario';
import { useCodigoCatastral } from './stores/useCodigoCatastral';
import type { CodigoInventarioState, Registro } from './types';

type Props = {
    registro: Registro;
};

export default function FichaInventarioCreate({ 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(registro.codigo_zona),
            manzano: toInputValue(registro.codigo_manzano),
            lote: toInputValue(registro.codigo_lote),
            sublote: toInputValue(
                isNumericSigno(registro.codigo_signo)
                    ? registro.codigo_signo
                    : '',
            ),
        });
        return () => reset();
    }, [registro, 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="Nueva 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">
                            Crear ficha de inventario
                        </h1>
                    </div>

                    <Form
                        action={store.url(registro.id)}
                        method="post"
                        className="flex flex-1 flex-col gap-6"
                    >
                        {({ errors, processing }) => (
                            <>
                                <CodigoRegistro registro={registro} />
                                <CodigoInventario
                                    codigo={codigo}
                                    errors={errors}
                                />

                                <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="Creando ficha"
                                        icon={Save}
                                    >
                                        Crear ficha
                                    </SubmitButton>
                                </div>
                            </>
                        )}
                    </Form>
                </div>
            </main>
        </>
    );
}

FichaInventarioCreate.layout = MainLayout;
