import AdminLayout from '@/Layouts/AdminLayout';
import { ImageUploader } from '@/components/ImageUploader';
import { Checkbox } from '@/components/ui/checkbox';
import { Input } from '@/components/ui/input';
import { PhoneInput } from '@/components/ui/phone-input';
import { SearchableSelect } from '@/components/ui/searchable-select';
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from '@/components/ui/select';
import { api } from '@/lib/api';
import { cn } from '@/lib/utils';
import { Head, router, useForm } from '@inertiajs/react';
import { ArrowLeft, User } from 'lucide-react';

// ── Types ─────────────────────────────────────────────────────────────────────

interface AdminUserDetail {
    id: string;
    name: string;
    email: string;
    phone: string | null;
    status: 'active' | 'inactive' | 'suspended';
    job_title: string | null;
    department: string | null;
    timezone: string;
    force_password_reset: boolean;
    avatar_url: string | null;
    role: string | null;
}

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

interface TimezoneGroup {
    group: string;
    options: { value: string; label: string }[];
}

interface Props {
    user?: AdminUserDetail;
    roles: RoleOption[];
    timezones: TimezoneGroup[];
}

// ── Status options ────────────────────────────────────────────────────────────

const STATUS_OPTIONS = [
    { value: 'active', label: 'Active' },
    { value: 'inactive', label: 'Inactive' },
    { value: 'suspended', label: 'Suspended' },
] as const;

// ── FormField wrapper ─────────────────────────────────────────────────────────

function FormField({
    label,
    required,
    error,
    span,
    children,
}: {
    label: string;
    required?: boolean;
    error?: string;
    span?: string;
    children: React.ReactNode;
}) {
    return (
        <div className={cn('space-y-1.5', span)}>
            <label className="text-muted-foreground block text-xs font-semibold tracking-wide uppercase">
                {label}
                {required && <span className="text-destructive ml-0.5">*</span>}
            </label>
            {children}
            {error && <p className="text-destructive text-xs">{error}</p>}
        </div>
    );
}

// ── Page ──────────────────────────────────────────────────────────────────────

export default function UsersForm({ user, roles, timezones }: Props) {
    const isEdit = !!user;

    const form = useForm({
        name: user?.name ?? '',
        email: user?.email ?? '',
        phone: user?.phone ?? '',
        password: '',
        job_title: user?.job_title ?? '',
        department: user?.department ?? '',
        timezone: user?.timezone ?? 'UTC',
        role: user?.role ?? roles[0]?.name ?? '',
        status: (user?.status ?? 'active') as string,
        force_password_reset: user?.force_password_reset ?? true,
    });

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

        const options = { preserveScroll: true };

        if (isEdit) {
            form.put(`/admin/users/${user!.id}`, options);
        } else {
            form.post('/admin/users', options);
        }
    };

    const title = isEdit ? `Edit: ${user!.name}` : 'New Admin';

    return (
        <AdminLayout
            title={title}
            breadcrumbs={[
                { label: 'System' },
                { label: 'Admins', href: '/admin/users' },
                { label: isEdit ? user!.name : 'New Admin' },
            ]}
        >
            <Head title={title} />

            <div className="space-y-6 p-6 lg:p-8">
                {/* ── Page title row ──────────────────────────────────────── */}
                <div className="flex items-center gap-3">
                    <button
                        type="button"
                        onClick={() => router.visit('/admin/users')}
                        className="border-border text-muted-foreground hover:bg-muted/40 hover:text-foreground flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border transition-colors"
                    >
                        <ArrowLeft className="h-4 w-4" />
                    </button>
                    <User className="text-primary h-5 w-5" />
                    <h1 className="text-foreground text-lg font-bold">
                        {isEdit ? 'Edit Admin' : 'New Admin'}
                    </h1>
                </div>

                <form
                    onSubmit={handleSubmit}
                    className="pf-glass space-y-10 rounded-xl p-6 lg:p-8"
                >
                    {/* ── Avatar (edit only) ──────────────────────────────── */}
                    {isEdit && (
                        <fieldset className="border-border/60 space-y-4 border-b pb-10">
                            <legend className="text-muted-foreground dark:text-muted-foreground/65 mb-4 text-[10px] font-bold tracking-widest uppercase">
                                Avatar
                            </legend>
                            <ImageUploader
                                url={user!.avatar_url}
                                name={user!.name}
                                size="md"
                                onUpload={(file) => {
                                    const fd = new FormData();
                                    fd.append('avatar', file);
                                    return api.upload<{ avatar_url: string }>(
                                        `/admin/users/${user!.id}/avatar`,
                                        fd,
                                    );
                                }}
                                onRemove={() =>
                                    api.delete(
                                        `/admin/users/${user!.id}/avatar`,
                                    )
                                }
                            />
                        </fieldset>
                    )}

                    {/* ── Identity ──────────────────────────────────────────── */}
                    <fieldset className="border-border/60 space-y-6 border-b pb-10">
                        <legend className="text-muted-foreground dark:text-muted-foreground/65 mb-4 text-[10px] font-bold tracking-widest uppercase">
                            Identity
                        </legend>

                        <div className="grid grid-cols-1 gap-x-6 gap-y-5 sm:grid-cols-2 lg:grid-cols-4">
                            <FormField
                                label="Full name"
                                required
                                error={form.errors.name}
                                span="lg:col-span-2"
                            >
                                <Input
                                    value={form.data.name}
                                    onChange={(e) =>
                                        form.setData('name', e.target.value)
                                    }
                                    placeholder="Jane Doe"
                                    autoComplete="off"
                                    className={cn(
                                        form.errors.name &&
                                            'border-destructive',
                                    )}
                                />
                            </FormField>

                            <FormField
                                label="Email"
                                required
                                error={form.errors.email}
                                span="lg:col-span-2"
                            >
                                <Input
                                    type="email"
                                    value={form.data.email}
                                    onChange={(e) =>
                                        form.setData('email', e.target.value)
                                    }
                                    placeholder="jane@example.com"
                                    autoComplete="off"
                                    className={cn(
                                        form.errors.email &&
                                            'border-destructive',
                                    )}
                                />
                            </FormField>

                            <FormField
                                label="Phone"
                                error={form.errors.phone}
                                span="lg:col-span-2"
                            >
                                <PhoneInput
                                    value={form.data.phone}
                                    onChange={(v) => form.setData('phone', v)}
                                    error={!!form.errors.phone}
                                />
                            </FormField>

                            <FormField
                                label={isEdit ? 'New password' : 'Password'}
                                required={!isEdit}
                                error={form.errors.password}
                                span="lg:col-span-2"
                            >
                                <Input
                                    type="password"
                                    value={form.data.password}
                                    onChange={(e) =>
                                        form.setData('password', e.target.value)
                                    }
                                    placeholder={
                                        isEdit
                                            ? 'Leave blank to keep current'
                                            : 'Min. 8 characters'
                                    }
                                    autoComplete="new-password"
                                    className={cn(
                                        form.errors.password &&
                                            'border-destructive',
                                    )}
                                />
                            </FormField>
                        </div>
                    </fieldset>

                    {/* ── Organisation ──────────────────────────────────────── */}
                    <fieldset className="border-border/60 space-y-6 border-b pb-10">
                        <legend className="text-muted-foreground dark:text-muted-foreground/65 mb-4 text-[10px] font-bold tracking-widest uppercase">
                            Organisation
                        </legend>

                        <div className="grid grid-cols-1 gap-x-6 gap-y-5 sm:grid-cols-2 lg:grid-cols-4">
                            <FormField
                                label="Job title"
                                error={form.errors.job_title}
                                span="lg:col-span-2"
                            >
                                <Input
                                    value={form.data.job_title}
                                    onChange={(e) =>
                                        form.setData(
                                            'job_title',
                                            e.target.value,
                                        )
                                    }
                                    placeholder="e.g. Customer Success Manager"
                                    className={cn(
                                        form.errors.job_title &&
                                            'border-destructive',
                                    )}
                                />
                            </FormField>

                            <FormField
                                label="Department"
                                error={form.errors.department}
                                span="lg:col-span-2"
                            >
                                <Input
                                    value={form.data.department}
                                    onChange={(e) =>
                                        form.setData(
                                            'department',
                                            e.target.value,
                                        )
                                    }
                                    placeholder="e.g. Operations"
                                    className={cn(
                                        form.errors.department &&
                                            'border-destructive',
                                    )}
                                />
                            </FormField>

                            <FormField
                                label="Timezone"
                                required
                                error={form.errors.timezone}
                                span="lg:col-span-2"
                            >
                                <SearchableSelect
                                    value={form.data.timezone}
                                    onChange={(v) =>
                                        form.setData('timezone', v)
                                    }
                                    groups={timezones}
                                    placeholder="Select timezone…"
                                    searchPlaceholder="Search timezones…"
                                    error={!!form.errors.timezone}
                                />
                            </FormField>
                        </div>
                    </fieldset>

                    {/* ── Access ────────────────────────────────────────────── */}
                    <fieldset className="border-border/60 space-y-6 border-b pb-10">
                        <legend className="text-muted-foreground dark:text-muted-foreground/65 mb-4 text-[10px] font-bold tracking-widest uppercase">
                            Access
                        </legend>

                        <div className="grid grid-cols-1 gap-x-6 gap-y-5 sm:grid-cols-2 lg:grid-cols-4">
                            <FormField
                                label="Role"
                                required
                                error={form.errors.role}
                                span="lg:col-span-2"
                            >
                                <Select
                                    value={form.data.role}
                                    onValueChange={(v) =>
                                        form.setData('role', v)
                                    }
                                >
                                    <SelectTrigger
                                        className={cn(
                                            form.errors.role &&
                                                'border-destructive',
                                        )}
                                    >
                                        <SelectValue placeholder="Select a role…" />
                                    </SelectTrigger>
                                    <SelectContent>
                                        {roles.map((r) => (
                                            <SelectItem
                                                key={r.id}
                                                value={r.name}
                                            >
                                                {r.name}
                                            </SelectItem>
                                        ))}
                                    </SelectContent>
                                </Select>
                            </FormField>

                            <FormField
                                label="Status"
                                required
                                error={form.errors.status}
                                span="lg:col-span-2"
                            >
                                <Select
                                    value={form.data.status}
                                    onValueChange={(v) =>
                                        form.setData('status', v)
                                    }
                                >
                                    <SelectTrigger
                                        className={cn(
                                            form.errors.status &&
                                                'border-destructive',
                                        )}
                                    >
                                        <SelectValue placeholder="Select status…" />
                                    </SelectTrigger>
                                    <SelectContent>
                                        {STATUS_OPTIONS.map((o) => (
                                            <SelectItem
                                                key={o.value}
                                                value={o.value}
                                            >
                                                {o.label}
                                            </SelectItem>
                                        ))}
                                    </SelectContent>
                                </Select>
                            </FormField>

                            <div className="col-span-full">
                                <label className="border-border bg-muted/20 hover:bg-muted/30 flex cursor-pointer items-start gap-3 rounded-lg border px-4 py-3 transition-colors">
                                    <Checkbox
                                        checked={form.data.force_password_reset}
                                        onCheckedChange={(v) =>
                                            form.setData(
                                                'force_password_reset',
                                                !!v,
                                            )
                                        }
                                        className="mt-0.5"
                                    />
                                    <div className="space-y-0.5">
                                        <p className="text-foreground text-sm font-medium">
                                            Force password reset
                                        </p>
                                        <p className="text-muted-foreground text-[11px]">
                                            User must set a new password on next
                                            login.
                                        </p>
                                    </div>
                                </label>
                            </div>
                        </div>
                    </fieldset>

                    {/* ── Actions ───────────────────────────────────────────── */}
                    <div className="flex items-center justify-end gap-3">
                        <button
                            type="button"
                            onClick={() => router.visit('/admin/users')}
                            className="border-border text-muted-foreground hover:bg-muted/40 rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors"
                        >
                            Cancel
                        </button>
                        <button
                            type="submit"
                            disabled={form.processing}
                            className="bg-primary text-primary-foreground hover:bg-primary/90 rounded-lg px-5 py-2.5 text-sm font-semibold transition-colors disabled:opacity-60"
                        >
                            {form.processing
                                ? 'Saving…'
                                : isEdit
                                  ? 'Save changes'
                                  : 'Create admin'}
                        </button>
                    </div>
                </form>
            </div>
        </AdminLayout>
    );
}
