import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import AppLayout from '@/layouts/app-layout';
import { type BreadcrumbItem } from '@/types';
import { Head, Link, useForm } from '@inertiajs/react';
import { ArrowLeft, Save, MapPin } from 'lucide-react';
import { showLoading, updateToast } from '@/lib/toast';
import LocationPicker from '@/components/google-maps/location-picker';

interface Institution {
    id: number;
    name: string;
}

interface InstitutionSede {
    id: number;
    name: string;
    address: string;
    phone?: string;
    email?: string;
    latitude?: number;
    longitude?: number;
    institution_id: number;
    institution: Institution;
    created_at: string;
    updated_at: string;
}

interface Props {
    sede: InstitutionSede;
    institutions: Institution[];
}

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Dashboard', href: '/dashboard' },
    { title: 'Sedes', href: '/institution-sedes' },
];

export default function EditInstitutionSede({ sede, institutions }: Props) {
    const { data, setData, put, processing, errors } = useForm({
        name: sede.name,
        address: sede.address,
        phone: sede.phone || '',
        email: sede.email || '',
        latitude: sede.latitude?.toString() || '',
        longitude: sede.longitude?.toString() || '',
        institution_id: sede.institution_id,
    });

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();

        const toastId = showLoading('Actualizando sede...');

        put(`/institution-sedes/${sede.id}`, {
            onSuccess: () => {
                updateToast(toastId, 'success', 'Sede actualizada exitosamente');
            },
            onError: () => {
                updateToast(toastId, 'error', 'Error al actualizar la sede');
            }
        });
    };

    const currentBreadcrumbs: BreadcrumbItem[] = [
        ...breadcrumbs,
        { title: `Editar ${sede.name}`, href: `/institution-sedes/${sede.id}/edit` },
    ];

    return (
        <AppLayout breadcrumbs={currentBreadcrumbs}>
            <Head title={`Editar ${sede.name}`} />

            <div className="flex h-full flex-1 flex-col gap-4 p-4 lg:gap-6 lg:p-6">
                {/* Header móvil optimizado */}
                <div className="flex flex-col gap-4">
                    <div className="flex items-center justify-between">
                        <div className="flex items-start gap-3 flex-1">
                            <div className="p-2 bg-emerald-100 dark:bg-emerald-900/20 rounded-lg flex-shrink-0">
                                <MapPin className="w-6 h-6 text-emerald-600 dark:text-emerald-400" />
                            </div>
                            <div className="min-w-0 flex-1">
                                <h1 className="text-xl font-bold text-slate-900 dark:text-white sm:text-2xl">
                                    Editar Sede
                                </h1>
                                <p className="text-slate-600 dark:text-slate-400 mt-1 text-sm">
                                    Modifica la información de la sede institucional
                                </p>
                            </div>
                        </div>
                        <Button variant="outline" asChild className="ml-4 flex-shrink-0">
                            <Link href="/institution-sedes">
                                <ArrowLeft className="w-4 h-4 mr-2" />
                                Volver
                            </Link>
                        </Button>
                    </div>
                </div>

                {/* Form */}
                <Card>
                    <CardHeader className="pb-4">
                        <CardTitle className="text-lg text-emerald-700 dark:text-emerald-400">
                            Información de la Sede
                        </CardTitle>
                        <CardDescription className="text-sm">
                            Actualiza los datos de la sede institucional
                        </CardDescription>
                    </CardHeader>
                    <CardContent>
                    <form onSubmit={handleSubmit} className="space-y-6">
                        <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
                            <div className="space-y-2">
                                <label htmlFor="name" className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
                                    Nombre de la Sede *
                                </label>
                                <Input
                                    id="name"
                                    type="text"
                                    value={data.name}
                                    onChange={(e) => setData('name', e.target.value)}
                                    placeholder="Ej: Sede Principal"
                                    className={errors.name ? 'border-red-500' : ''}
                                    required
                                />
                                {errors.name && (
                                    <p className="text-sm text-red-600">{errors.name}</p>
                                )}
                            </div>

                            <div className="space-y-2">
                                <label htmlFor="institution_id" className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
                                    Institución *
                                </label>
                                <select
                                    id="institution_id"
                                    value={data.institution_id}
                                    onChange={(e) => setData('institution_id', parseInt(e.target.value))}
                                    className={`flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ${errors.institution_id ? 'border-red-500' : ''}`}
                                    required
                                >
                                    <option value="">Selecciona una institución</option>
                                    {institutions.map((institution) => (
                                        <option key={institution.id} value={institution.id}>
                                            {institution.name}
                                        </option>
                                    ))}
                                </select>
                                {errors.institution_id && (
                                    <p className="text-sm text-red-600">{errors.institution_id}</p>
                                )}
                            </div>
                        </div>

                        <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
                            <div className="space-y-2">
                                <label htmlFor="phone" className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
                                    Teléfono
                                </label>
                                <Input
                                    id="phone"
                                    type="tel"
                                    value={data.phone}
                                    onChange={(e) => setData('phone', e.target.value)}
                                    placeholder="Ej: +57 300 123 4567"
                                    className={errors.phone ? 'border-red-500' : ''}
                                />
                                {errors.phone && (
                                    <p className="text-sm text-red-600">{errors.phone}</p>
                                )}
                            </div>

                            <div className="space-y-2">
                                <label htmlFor="email" className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
                                    Email
                                </label>
                                <Input
                                    id="email"
                                    type="email"
                                    value={data.email}
                                    onChange={(e) => setData('email', e.target.value)}
                                    placeholder="Ej: sede@institucion.edu.co"
                                    className={errors.email ? 'border-red-500' : ''}
                                />
                                {errors.email && (
                                    <p className="text-sm text-red-600">{errors.email}</p>
                                )}
                            </div>
                        </div>

                        <div className="space-y-2">
                            <label className="text-sm font-medium leading-none">
                                Ubicación en el Mapa *
                            </label>
                            <LocationPicker
                                address={data.address}
                                latitude={data.latitude}
                                longitude={data.longitude}
                                onAddressChange={(address) => setData('address', address)}
                                onLocationChange={(lat, lng) => {
                                    setData('latitude', lat.toString());
                                    setData('longitude', lng.toString());
                                }}
                                addressError={errors.address}
                                latitudeError={errors.latitude}
                                longitudeError={errors.longitude}
                            />
                        </div>

                        <div className="flex justify-end gap-4">
                            <Button variant="outline" type="button" asChild>
                                <Link href="/institution-sedes">
                                    Cancelar
                                </Link>
                            </Button>
                            <Button type="submit" disabled={processing}>
                                <Save className="w-4 h-4 mr-2" />
                                {processing ? 'Actualizando...' : 'Actualizar Sede'}
                            </Button>
                        </div>
                    </form>
                </CardContent>
            </Card>
            </div>
        </AppLayout>
    );
}
