import { ComboBoxField, TextInputField } from '@/components/form';
import ImageCarousel from '@/components/image-carousel';
import RegisterBannerCard from '@/components/register-banner-card';
import { Button } from '@/components/ui/button';
import {
    Card,
    CardContent,
    CardDescription,
    CardHeader,
    CardTitle,
} from '@/components/ui/card';
import {
    Flash,
    showFlash,
    useFlashToasts,
} from '@/components/use-flash-toasts';
import AppLayout from '@/layouts/app-layout';
import { useNfcScanner } from '@/hooks/useNfcScanner';
import { index as nfcIndex, store } from '@/routes/nfc';
import { type BreadcrumbItem, Animal, Auth } from '@/types';
import { Head, useForm, usePage } from '@inertiajs/react';
import {
    AlertCircle,
    ArrowRight,
    BadgeCheck,
    CheckCircle2,
    ScanLine,
    Smartphone,
} from 'lucide-react';
import { useState } from 'react';
const breadcrumbs: BreadcrumbItem[] = [
    {
        title: 'NFC',
        href: nfcIndex().url,
    },
];

interface Props {
    animals: Animal[];
    auth: Auth;
    [key: string]: unknown;
}

export default function NFCAdmin() {
    const { animals, auth, flash } = usePage<Props & { flash?: Flash }>().props;
    const user = auth.user;

    // Estados del procedimiento
    const [step, setStep] = useState(1);
    const [error, setError] = useState('');
    const [success, setSuccess] = useState('');

    // useForm para el formulario principal
    const { data, setData, post, processing, errors, reset } = useForm({
        animal_id: '',
        uuid: '',
        user_id: auth.user.id,
    });

    useFlashToasts({ errors });

    // Estados para animal seleccionado
    const [selectedAnimal, setSelectedAnimal] = useState<Animal | null>(null);

    // Hook de NFC Scanner con timeout de 10 segundos
    const {
        isScanning,
        error: nfcError,
        nfcSupported,
        scannedCode,
        timeLeft,
        startScan,
        stopScan,
        clearError: clearNfcError,
    } = useNfcScanner({
        onSuccess: (serialNumber) => {
            setData('uuid', serialNumber);
            setError('');
        },
        onError: (errorMsg) => {
            console.error('NFC Error:', errorMsg);
            setError(errorMsg);
        },
        timeout: 10000, // 10 segundos
    });

    // Actualiza el código NFC en el form
    const setNfcCodeAndForm = (code: string) => {
        setData('uuid', code);
    };

    // Actualiza el animal seleccionado en el form
    const setSelectedAnimalAndForm = (animal: Animal | null) => {
        setSelectedAnimal(animal);
        setData('animal_id', animal?.id || '');
    };

    const handleNextStep = () => {
        if (step === 1 && data.uuid.trim()) {
            setStep(2);
            setError('');
            clearNfcError();
        } else if (step === 2 && selectedAnimal) {
            setStep(3);
            setError('');
        }
    };

    const handleConfirm = (e?: React.FormEvent) => {
        if (e) e.preventDefault();
        if (processing) return;
        post(store().url, {
            preserveScroll: true,
            onSuccess: (page) => {
                const flashMsg = page.props.flash as Flash;
                showFlash(flashMsg);
                setSuccess(
                    `✓ NFC ${data.uuid} vinculado exitosamente al animal: ${selectedAnimal?.name}`,
                );
                setTimeout(() => {
                    handleReset();
                }, 3000);
            },
            onError: () => {
                setError(
                    'No se pudo vincular el NFC. Revisa los datos e intenta de nuevo.',
                );
            },
        });
    };

    const handleReset = () => {
        setStep(1);
        setSelectedAnimal(null);
        setError('');
        setSuccess('');
        clearNfcError();
        stopScan();
        reset();
    };
    console.log('ANimals:', animals);
    const displayError = nfcError || error;

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title="Administración NFC" />
            <div className="flex h-full flex-1 flex-col gap-4 overflow-x-auto rounded-xl p-2 md:p-4 pb-8 md:pb-4">
                <RegisterBannerCard
                    img="https://cdn-icons-png.flaticon.com/512/2331/2331966.png"
                    title="¡Gestiona chips NFC!"
                    description="Procedimiento para vincular chips NFC con animales registrados."
                    items={[
                        'Paso 1: Obtén el código NFC (escaneando o manualmente).',
                        'Paso 2: Selecciona el animal a vincular.',
                        'Paso 3: Confirma la vinculación.',
                    ]}
                />

                {/* Indicador de pasos - Responsive */}
                <div className="mb-4 md:mb-6 flex items-center justify-center gap-2 md:gap-4 px-2">
                    {/* Paso 1 */}
                    <div className="flex items-center gap-2">
                        <div
                            className={`flex flex-col md:flex-row items-center gap-1 md:gap-2 ${step >= 1 ? 'text-primary' : 'text-muted-foreground'}`}
                        >
                            <div
                                className={`flex h-8 w-8 md:h-9 md:w-9 items-center justify-center rounded-full border-2 text-sm ${step >= 1 ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground'}`}
                            >
                                {step > 1 ? (
                                    <CheckCircle2 className="h-4 w-4 md:h-5 md:w-5" />
                                ) : (
                                    <ScanLine className="h-4 w-4 md:h-5 md:w-5" />
                                )}
                            </div>
                            <span className="hidden md:inline font-semibold text-sm md:text-base whitespace-nowrap">Código NFC</span>
                        </div>
                    </div>

                    <ArrowRight className="text-muted-foreground h-4 w-4 md:h-5 md:w-5 flex-shrink-0" />

                    {/* Paso 2 */}
                    <div className="flex items-center gap-2">
                        <div
                            className={`flex flex-col md:flex-row items-center gap-1 md:gap-2 ${step >= 2 ? 'text-primary' : 'text-muted-foreground'}`}
                        >
                            <div
                                className={`flex h-8 w-8 md:h-9 md:w-9 items-center justify-center rounded-full border-2 text-sm ${step >= 2 ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground'}`}
                            >
                                {step > 2 ? (
                                    <CheckCircle2 className="h-4 w-4 md:h-5 md:w-5" />
                                ) : (
                                    '2'
                                )}
                            </div>
                            <span className="hidden md:inline font-semibold text-sm md:text-base whitespace-nowrap">Seleccionar Animal</span>
                        </div>
                    </div>

                    <ArrowRight className="text-muted-foreground h-4 w-4 md:h-5 md:w-5 flex-shrink-0" />

                    {/* Paso 3 */}
                    <div className="flex items-center gap-2">
                        <div
                            className={`flex flex-col md:flex-row items-center gap-1 md:gap-2 ${step >= 3 ? 'text-primary' : 'text-muted-foreground'}`}
                        >
                            <div
                                className={`flex h-8 w-8 md:h-9 md:w-9 items-center justify-center rounded-full border-2 text-sm ${step >= 3 ? 'border-primary bg-primary text-primary-foreground' : 'border-muted-foreground'}`}
                            >
                                <BadgeCheck className="h-4 w-4 md:h-5 md:w-5" />
                            </div>
                            <span className="hidden md:inline font-semibold text-sm md:text-base whitespace-nowrap">Confirmar</span>
                        </div>
                    </div>
                </div>

                {/* Paso 1: Obtener código NFC */}
                {step === 1 && (
                    <Card>
                        <CardHeader className="px-4 md:px-6">
                            <CardTitle className="flex items-center gap-2 text-lg md:text-xl">
                                <ScanLine className="h-4 w-4 md:h-5 md:w-5" />
                                Paso 1: Obtener Código NFC
                            </CardTitle>
                            <CardDescription className="text-sm md:text-base">
                                Escanea el chip NFC o ingresa el código
                                manualmente
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="space-y-4 md:space-y-6 px-4 md:px-6 pb-6">
                            {/* Botón de escaneo usando el hook */}
                            <div className="space-y-3 md:space-y-4">
                                <Button
                                    onClick={isScanning ? stopScan : startScan}
                                    disabled={isScanning}
                                    className="w-full text-sm md:text-base"
                                    size="lg"
                                    variant="default"
                                >
                                    <Smartphone className="mr-2 h-4 w-4 md:h-5 md:w-5" />
                                    {isScanning
                                        ? `Escaneando... ${timeLeft}s`
                                        : 'Escanear NFC'}
                                </Button>

                                {isScanning && (
                                    <div className="flex flex-col items-center gap-2 py-3 md:py-4">
                                        <div className="h-10 w-10 md:h-12 md:w-12 animate-spin rounded-full border-4 border-primary border-t-transparent"></div>
                                        <p className="text-xs md:text-sm text-muted-foreground">
                                            🔍 Acerca el chip NFC...
                                        </p>
                                        {/* Barra de progreso */}
                                        <div className="w-full max-w-xs px-2">
                                            <div className="h-2 bg-muted rounded-full overflow-hidden">
                                                <div
                                                    className="h-full bg-gradient-to-r from-yellow-400 to-green-500 transition-all duration-1000"
                                                    style={{
                                                        width: `${(timeLeft / 10) * 100}%`,
                                                    }}
                                                />
                                            </div>
                                        </div>
                                    </div>
                                )}

                                {scannedCode && !isScanning && (
                                    <div className="rounded-lg border border-green-200 bg-green-50 p-3 md:p-4 dark:border-green-800 dark:bg-green-900/20">
                                        <p className="flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-2 text-xs md:text-sm text-green-800 dark:text-green-200">
                                            <span className="flex items-center gap-2">
                                                <BadgeCheck className="h-4 w-4" />
                                                Código escaneado:
                                            </span>
                                            <span className="font-mono font-bold break-all">
                                                {scannedCode}
                                            </span>
                                        </p>
                                    </div>
                                )}
                            </div>

                            {/* Separador */}
                            <div className="flex items-center gap-3 md:gap-4">
                                <div className="h-px flex-1 bg-border"></div>
                                <span className="text-xs md:text-sm text-muted-foreground">
                                    O ingresa manualmente
                                </span>
                                <div className="h-px flex-1 bg-border"></div>
                            </div>

                            {/* Input manual */}
                            <TextInputField
                                id="nfc-code"
                                label="Código NFC"
                                required
                                value={data.uuid}
                                onChange={(v) => setNfcCodeAndForm(v)}
                                error={errors.uuid}
                                placeholder="Ejemplo: 04:A1:B2:C3:D4:E5:F6"
                                className="font-mono text-sm md:text-base"
                                disabled={isScanning}
                            />

                            {data.uuid && !isScanning && (
                                <div className="rounded-lg border border-green-200 bg-green-50 p-3 md:p-4 dark:border-green-800 dark:bg-green-900/20">
                                    <p className="flex flex-col sm:flex-row sm:items-center gap-1 sm:gap-2 text-xs md:text-sm text-green-800 dark:text-green-200">
                                        <span className="flex items-center gap-2">
                                            <BadgeCheck className="h-4 w-4" />
                                            Código detectado:
                                        </span>
                                        <span className="font-mono font-bold break-all">
                                            {data.uuid}
                                        </span>
                                    </p>
                                </div>
                            )}

                            <Button
                                onClick={handleNextStep}
                                disabled={!data.uuid.trim() || isScanning}
                                className="w-full text-sm md:text-base"
                                size="lg"
                            >
                                Siguiente: Seleccionar Animal
                                <ArrowRight className="ml-2 h-4 w-4 md:h-5 md:w-5" />
                            </Button>
                        </CardContent>
                    </Card>
                )}

                {/* Paso 2: Seleccionar animal */}
                {step === 2 && (
                    <Card>
                        <CardHeader className="px-4 md:px-6">
                            <CardTitle className="text-lg md:text-xl">Paso 2: Seleccionar Animal</CardTitle>
                            <CardDescription className="text-sm md:text-base break-words">
                                Elige el animal que deseas vincular con el
                                código NFC:{' '}
                                <span className="font-mono font-bold break-all">
                                    {data.uuid}
                                </span>
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="space-y-4 md:space-y-6 px-4 md:px-6 pb-6">
                            {/* ComboBoxField para animal */}
                            <ComboBoxField
                                id="animal-combo"
                                label="Animal"
                                value={data.animal_id}
                                onChange={(v) => {
                                    const animal = animals.find(
                                        (a) => a.id === Number(v),
                                    );
                                    setSelectedAnimalAndForm(animal || null);
                                }}
                                options={animals.map((animal) => ({
                                    value: animal.id,
                                    label: `${animal.name} - ${animal.breed?.name || 'Raza desconocida'}`,
                                }))}
                                error={errors.animal_id}
                                placeholder="Selecciona un animal"
                            />

                            {selectedAnimal && (
                                <div className="rounded-lg border border-blue-200 bg-blue-50 p-3 md:p-4 dark:border-blue-800 dark:bg-blue-900/20">
                                    <p className="text-sm text-blue-800 dark:text-blue-200">
                                        <BadgeCheck className="mr-1 inline h-4 w-4" />
                                        Animal seleccionado:{' '}
                                        <span className="font-bold">
                                            {selectedAnimal.name}
                                        </span>
                                    </p>
                                </div>
                            )}

                            <div className="flex flex-col sm:flex-row gap-3">
                                <Button
                                    onClick={() => setStep(1)}
                                    variant="outline"
                                    className="flex-1 text-sm md:text-base"
                                >
                                    Atrás
                                </Button>
                                <Button
                                    onClick={handleNextStep}
                                    disabled={!selectedAnimal}
                                    className="flex-1 text-sm md:text-base"
                                    
                                >
                                    Siguiente: Confirmar
                                    <ArrowRight className="ml-2 h-4 w-4 md:h-5 md:w-5" />
                                </Button>
                            </div>
                        </CardContent>
                    </Card>
                )}

                {/* Paso 3: Confirmar */}
                {step === 3 && (
                    <Card>
                        <CardHeader className="px-4 md:px-6">
                            <CardTitle className="text-lg md:text-xl">Paso 3: Confirmar Vinculación</CardTitle>
                            <CardDescription className="text-sm md:text-base">
                                Revisa y confirma la vinculación del chip NFC
                                con el animal seleccionado.
                            </CardDescription>
                        </CardHeader>
                        <CardContent className="space-y-4 md:space-y-6 px-4 md:px-6 pb-6">
                            <form onSubmit={handleConfirm}>
                                <div className="rounded-lg bg-muted/50 p-3 md:p-4">
                                    <div className="grid grid-cols-1 sm:grid-cols-10 gap-4 md:gap-6 items-center">
                                        {/* Columna 1: Carrusel de imágenes (30%) */}
                                        <div className="flex flex-col items-center sm:col-span-3">
                                            <ImageCarousel
                                                images={
                                                    selectedAnimal?.gallery &&
                                                    selectedAnimal.gallery
                                                        .length > 0
                                                        ? selectedAnimal.gallery
                                                        : selectedAnimal?.main_photo
                                                          ? [
                                                                selectedAnimal.main_photo,
                                                            ]
                                                          : ['/placeholder.svg']
                                                }
                                                name={
                                                    selectedAnimal?.name || ''
                                                }
                                            />
                                        </div>
                                        {/* Columna 2: Info (70%) */}
                                        <div className="flex flex-col gap-3 sm:col-span-7">
                                            <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Nombre:
                                                </span>
                                                <span className="font-bold">
                                                    {selectedAnimal?.name}
                                                </span>
                                            </div>
                                            <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Código NFC:
                                                </span>
                                                <span className="font-mono font-bold">
                                                    {data.uuid}
                                                </span>
                                            </div>
                                            <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Sexo:
                                                </span>
                                                <span>
                                                    {selectedAnimal?.sex === 'F'
                                                        ? 'Hembra'
                                                        : selectedAnimal?.sex ===
                                                            'M'
                                                          ? 'Macho'
                                                          : '-'}
                                                </span>
                                            </div>
                                            <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Edad:
                                                </span>
                                                <span>
                                                    {selectedAnimal?.birth_date
                                                        ? `${Math.floor((new Date().getTime() - new Date(selectedAnimal.birth_date).getTime()) / (365.25 * 24 * 60 * 60 * 1000))} años`
                                                        : '-'}
                                                </span>
                                            </div>
                                            {/* <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Registrado por:
                                                </span>
                                                <span className="font-bold">
                                                    {user.name}
                                                </span>
                                            </div> */}
                                            <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Raza:
                                                </span>
                                                <span>
                                                    {selectedAnimal?.breed
                                                        ? selectedAnimal.breed
                                                              .name
                                                        : 'Desconocida'}
                                                </span>
                                            </div>
                                            <div className="flex items-center justify-between">
                                                <span className="text-sm font-medium">
                                                    Propietario:
                                                </span>
                                                <span className="font-bold">
                                                    {
                                                        selectedAnimal?.owner
                                                            ?.name
                                                    }
                                                </span>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div className="mt-4 flex flex-col sm:flex-row gap-3">
                                    <Button
                                        onClick={() => setStep(2)}
                                        variant="outline"
                                        className="flex-1 text-sm md:text-base"
                                        type="button"
                                    >
                                        Atrás
                                    </Button>
                                    <Button
                                        type="submit"
                                        className="flex-1 text-sm md:text-base"
                                        // size="lg"
                                        disabled={processing}
                                    >
                                        <BadgeCheck className="mr-2 h-4 w-4 md:h-5 md:w-5" />
                                        {processing
                                            ? 'Guardando...'
                                            : 'Confirmar Vinculación'}
                                    </Button>
                                </div>
                            </form>
                        </CardContent>
                    </Card>
                )}

                {/* Mensajes de error y éxito */}
                {displayError && (
                    <div className="flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3 md:p-4 dark:border-red-800 dark:bg-red-900/20 mx-2 md:mx-0">
                        <AlertCircle className="mt-0.5 h-4 w-4 md:h-5 md:w-5 flex-shrink-0 text-red-600 dark:text-red-400" />
                        <p className="text-xs md:text-sm text-red-800 dark:text-red-200">
                            {displayError}
                        </p>
                    </div>
                )}

                {success && (
                    <div className="flex items-start gap-3 rounded-lg border border-green-200 bg-green-50 p-3 md:p-4 dark:border-green-800 dark:bg-green-900/20 mx-2 md:mx-0">
                        <BadgeCheck className="mt-0.5 h-4 w-4 md:h-5 md:w-5 flex-shrink-0 text-green-600 dark:text-green-400" />
                        <div className="flex-1">
                            <p className="mb-2 text-xs md:text-sm text-green-800 dark:text-green-200">
                                {success}
                            </p>
                            <Button
                                onClick={handleReset}
                                variant="outline"
                                size="sm"
                                className="text-xs md:text-sm"
                            >
                                Vincular otro NFC
                            </Button>
                        </div>
                    </div>
                )}

                {/* Información sobre NFC */}
                {!nfcSupported && (
                    <Card className="mx-2 md:mx-0">
                        <CardHeader className="px-4 md:px-6">
                            <CardTitle className="flex items-center gap-2 text-yellow-600 text-base md:text-lg">
                                <AlertCircle className="h-4 w-4 md:h-5 md:w-5" />
                                Información sobre NFC Web
                            </CardTitle>
                        </CardHeader>
                        <CardContent className="px-4 md:px-6">
                            <ul className="space-y-2 text-xs md:text-sm text-muted-foreground">
                                <li>
                                    • Web NFC API solo funciona en dispositivos
                                    Android con Chrome/Edge
                                </li>
                                <li>• Requiere HTTPS (conexión segura)</li>
                                <li>• El usuario debe dar permisos de NFC</li>
                                <li>
                                    • iOS no soporta Web NFC API actualmente
                                </li>
                            </ul>
                        </CardContent>
                    </Card>
                )}
            </div>
        </AppLayout>
    );
}
