import { FormEvent, useEffect, useState } from "react";
import { Head, router, useForm } from "@inertiajs/react";
import AppLayout from "@/layouts/app-layout";
import {
    Card,
    CardContent,
    CardHeader,
    CardTitle,
    CardDescription,
} from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import {
    Select,
    SelectContent,
    SelectItem,
    SelectTrigger,
    SelectValue,
} from "@/components/ui/select";
import { Badge } from "@/components/ui/badge";
import {
    Search,
    Users,
    UserCheck,
    UserX,
    ShieldCheck,
    UserPlus,
    Pencil,
    Mail,
    Phone,
    Briefcase,
    Sparkles,
    X,
} from "lucide-react";
import { ConfirmDeleteButton } from "@/components/crm-confirm-dialog";
import { EmptyState, Pagination } from "@/components/crm-data-table";
import { StatChip } from "@/components/crm/global-card";

type Item = { id: number; name: string };
type User = {
    id: number;
    name: string;
    email: string;
    phone?: string;
    employee_code?: string;
    status: string;
    role?: Item;
    team?: Item;
};
type Props = {
    users: { data: User[]; links: any[] };
    roles: Item[];
    teams: Item[];
    filters?: any;
};

const empty = {
    name: "",
    email: "",
    phone: "",
    employee_code: "",
    password: "",
    role_id: "",
    team_id: "",
    status: "active",
};

export default function UsersPage({ users, roles, teams, filters }: Props) {
    const [editing, setEditing] = useState<number | null>(null);
    const [search, setSearch] = useState(filters?.search || "");
    const form = useForm<any>(empty);

    // Hitung ringkasan statistik
    const activeCount = users.data.filter((u) => u.status === "active").length;
    const inactiveCount = users.data.length - activeCount;

    // Pencarian otomatis (debounce 300ms)
    useEffect(() => {
        if (search === (filters?.search || "")) return;

        const timer = setTimeout(() => {
            router.get(
                "/crm/users",
                { search },
                { preserveState: true, preserveScroll: true, replace: true },
            );
        }, 300);

        return () => clearTimeout(timer);
    }, [search]);

    const edit = (u: User) => {
        setEditing(u.id);
        form.clearErrors();
        form.setData({
            name: u.name,
            email: u.email,
            phone: u.phone ?? "",
            employee_code: u.employee_code ?? "",
            password: "",
            role_id: String(u.role?.id ?? ""),
            team_id: String(u.team?.id ?? ""),
            status: u.status,
        });
    };

    const cancelEdit = () => {
        setEditing(null);
        form.clearErrors();
        form.reset();
    };

    const save = (e: FormEvent) => {
        e.preventDefault();
        const opts = {
            onSuccess: () => {
                setEditing(null);
                form.reset();
                form.clearErrors();
            },
        };
        editing
            ? form.put(`/crm/users/${editing}`, opts)
            : form.post("/crm/users", opts);
    };

    const resetSearch = () => {
        setSearch("");
        router.get("/crm/users", {}, { preserveState: true, replace: true });
    };

    return (
        <AppLayout breadcrumbs={[{ title: "Pengguna", href: "/crm/users" }]}>
            <Head title="Manajemen Pengguna & Tim" />

            <div className="crm-page space-y-6 pb-10">
                {/* Header Section */}
                <div className="flex flex-col justify-between gap-4 border-b border-border/80 pb-5 md:flex-row md:items-center dark:border-slate-800">
                    <div>
                        <div className="mb-1 flex items-center gap-2 text-xs font-semibold uppercase tracking-wider text-indigo-600 dark:text-indigo-400">
                            <ShieldCheck className="size-4" /> Identity & Access
                            Management
                        </div>
                        <h1 className="text-2xl font-bold tracking-tight text-foreground dark:text-slate-50">
                            Pengguna & Hak Akses
                        </h1>
                        <p className="text-sm text-muted-foreground dark:text-muted-foreground/80">
                            Kelola profil karyawan, atribusi role, alokasi tim,
                            dan status keanggotaan organisasi.
                        </p>
                    </div>
                </div>

                {/* KPI Metrics Summary Cards */}
                <div className="grid gap-4 sm:grid-cols-3">
                    <StatChip
                        icon={Users}
                        label="Total Pengguna"
                        value={users.data.length}
                        tone="violet"
                        variant="compact"
                        description="Terdaftar & aktif di platform"
                        trend={
                            <span className="inline-flex items-center rounded-full bg-muted px-2 py-0.5 text-[10px] font-medium text-muted-foreground dark:bg-slate-800 dark:text-muted-foreground/60">
                                100%
                            </span>
                        }
                    />

                    <StatChip
                        icon={UserCheck}
                        label="Akun Aktif"
                        value={activeCount}
                        tone="emerald"
                        variant="compact"
                        description="Akses operasional berjalan lancar"
                        trend={
                            <span className="inline-flex items-center rounded-full bg-emerald-50 px-2 py-0.5 text-[10px] font-semibold text-emerald-700 dark:bg-emerald-950/60 dark:text-emerald-300">
                                {users.data.length
                                    ? Math.round(
                                          (activeCount / users.data.length) *
                                              100,
                                      )
                                    : 0}
                                %
                            </span>
                        }
                    />

                    <StatChip
                        icon={UserX}
                        label="Non-Aktif / Suspended"
                        value={inactiveCount}
                        tone="rose"
                        variant="compact"
                        description="Akses sistem sedang dibatasi"
                        trend={
                            <span className="inline-flex items-center rounded-full bg-rose-50 px-2 py-0.5 text-[10px] font-semibold text-rose-600 dark:bg-rose-950/60 dark:text-rose-400">
                                {users.data.length
                                    ? Math.round(
                                          (inactiveCount / users.data.length) *
                                              100,
                                      )
                                    : 0}
                                %
                            </span>
                        }
                    />
                </div>

                {/* Main Content Grid */}
                <div className="grid items-start gap-6 xl:grid-cols-[380px_1fr]">
                    {/* Form Card */}
                    <Card className="rounded-2xl border-border/80 bg-card shadow-xs xl:sticky xl:top-6 dark:border-slate-800 dark:bg-slate-900">
                        <CardHeader className="border-b border-slate-100 py-4 dark:border-slate-800/80">
                            <div className="flex items-center gap-2">
                                <div className="rounded-xl bg-indigo-50 p-2 text-indigo-600 dark:bg-indigo-950/50 dark:text-indigo-400">
                                    {editing ? (
                                        <Pencil className="size-4" />
                                    ) : (
                                        <UserPlus className="size-4" />
                                    )}
                                </div>
                                <div>
                                    <CardTitle className="text-base font-bold text-foreground dark:text-slate-100">
                                        {editing
                                            ? "Edit Profil Pengguna"
                                            : "Tambah Pengguna Baru"}
                                    </CardTitle>
                                    <CardDescription className="text-xs">
                                        {editing
                                            ? "Perbarui informasi dan hak akses pengguna."
                                            : "Buat kredensial awal untuk anggota tim."}
                                    </CardDescription>
                                </div>
                            </div>
                        </CardHeader>

                        <CardContent className="pt-4">
                            <form onSubmit={save} className="space-y-4">
                                <div className="space-y-1.5">
                                    <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                        Nama Lengkap{" "}
                                        <span className="text-rose-500">*</span>
                                    </Label>
                                    <Input
                                        className="rounded-xl border-border dark:border-slate-800 focus-visible:ring-indigo-500"
                                        value={form.data.name}
                                        onChange={(e) =>
                                            form.setData("name", e.target.value)
                                        }
                                        placeholder="cth. Alexandra Wright"
                                    />
                                    {form.errors.name && (
                                        <p className="text-[11px] font-medium text-rose-500">
                                            {form.errors.name}
                                        </p>
                                    )}
                                </div>

                                <div className="space-y-1.5">
                                    <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                        Alamat Email{" "}
                                        <span className="text-rose-500">*</span>
                                    </Label>
                                    <Input
                                        type="email"
                                        className="rounded-xl border-border dark:border-slate-800 focus-visible:ring-indigo-500"
                                        value={form.data.email}
                                        onChange={(e) =>
                                            form.setData(
                                                "email",
                                                e.target.value,
                                            )
                                        }
                                        placeholder="nama@perusahaan.com"
                                    />
                                    {form.errors.email && (
                                        <p className="text-[11px] font-medium text-rose-500">
                                            {form.errors.email}
                                        </p>
                                    )}
                                </div>

                                <div className="grid grid-cols-2 gap-3">
                                    <div className="space-y-1.5">
                                        <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                            No. Telepon
                                        </Label>
                                        <Input
                                            className="rounded-xl border-border dark:border-slate-800 focus-visible:ring-indigo-500"
                                            value={form.data.phone}
                                            onChange={(e) =>
                                                form.setData(
                                                    "phone",
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="0812xxxx"
                                        />
                                    </div>
                                    <div className="space-y-1.5">
                                        <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                            Kode Karyawan
                                        </Label>
                                        <Input
                                            className="rounded-xl border-border dark:border-slate-800 font-mono text-xs focus-visible:ring-indigo-500"
                                            value={form.data.employee_code}
                                            onChange={(e) =>
                                                form.setData(
                                                    "employee_code",
                                                    e.target.value,
                                                )
                                            }
                                            placeholder="EMP-1001"
                                        />
                                    </div>
                                </div>

                                <div className="space-y-1.5">
                                    <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                        Kata Sandi{" "}
                                        {editing ? (
                                            "(Opsional)"
                                        ) : (
                                            <span className="text-rose-500">
                                                *
                                            </span>
                                        )}
                                    </Label>
                                    <Input
                                        type="password"
                                        className="rounded-xl border-border dark:border-slate-800 focus-visible:ring-indigo-500"
                                        value={form.data.password}
                                        onChange={(e) =>
                                            form.setData(
                                                "password",
                                                e.target.value,
                                            )
                                        }
                                        placeholder={
                                            editing
                                                ? "Kosongkan jika tak diubah"
                                                : "••••••••"
                                        }
                                    />
                                    {form.errors.password && (
                                        <p className="text-[11px] font-medium text-rose-500">
                                            {form.errors.password}
                                        </p>
                                    )}
                                </div>

                                <div className="grid grid-cols-2 gap-3">
                                    <div className="space-y-1.5">
                                        <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                            Role Management{" "}
                                            <span className="text-rose-500">
                                                *
                                            </span>
                                        </Label>
                                        <Select
                                            value={form.data.role_id}
                                            onValueChange={(v) =>
                                                form.setData("role_id", v)
                                            }
                                        >
                                            <SelectTrigger className="rounded-xl border-border dark:border-slate-800">
                                                <SelectValue placeholder="Pilih Role" />
                                            </SelectTrigger>
                                            <SelectContent className="rounded-xl">
                                                {roles.map((r) => (
                                                    <SelectItem
                                                        key={r.id}
                                                        value={String(r.id)}
                                                    >
                                                        {r.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectContent>
                                        </Select>
                                        {form.errors.role_id && (
                                            <p className="text-[11px] font-medium text-rose-500">
                                                {form.errors.role_id}
                                            </p>
                                        )}
                                    </div>

                                    <div className="space-y-1.5">
                                        <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                            Divisi / Tim
                                        </Label>
                                        <Select
                                            value={form.data.team_id || "none"}
                                            onValueChange={(v) =>
                                                form.setData(
                                                    "team_id",
                                                    v === "none" ? "" : v,
                                                )
                                            }
                                        >
                                            <SelectTrigger className="rounded-xl border-border dark:border-slate-800">
                                                <SelectValue placeholder="Pilih Tim" />
                                            </SelectTrigger>
                                            <SelectContent className="rounded-xl">
                                                <SelectItem value="none">
                                                    Tanpa Tim
                                                </SelectItem>
                                                {teams.map((t) => (
                                                    <SelectItem
                                                        key={t.id}
                                                        value={String(t.id)}
                                                    >
                                                        {t.name}
                                                    </SelectItem>
                                                ))}
                                            </SelectContent>
                                        </Select>
                                    </div>
                                </div>

                                <div className="space-y-1.5">
                                    <Label className="text-xs font-medium text-foreground/80 dark:text-muted-foreground/60">
                                        Status Keanggotaan
                                    </Label>
                                    <Select
                                        value={form.data.status}
                                        onValueChange={(v) =>
                                            form.setData("status", v)
                                        }
                                    >
                                        <SelectTrigger className="rounded-xl border-border dark:border-slate-800">
                                            <SelectValue />
                                        </SelectTrigger>
                                        <SelectContent className="rounded-xl">
                                            <SelectItem value="active">
                                                <div className="flex items-center gap-2">
                                                    <span className="size-2 rounded-full bg-emerald-500" />
                                                    <span>Aktif</span>
                                                </div>
                                            </SelectItem>
                                            <SelectItem value="inactive">
                                                <div className="flex items-center gap-2">
                                                    <span className="size-2 rounded-full bg-slate-400" />
                                                    <span>Tidak Aktif</span>
                                                </div>
                                            </SelectItem>
                                        </SelectContent>
                                    </Select>
                                </div>

                                <div className="flex gap-2 pt-3">
                                    <Button
                                        disabled={form.processing}
                                        className="flex-1 cursor-pointer rounded-xl bg-indigo-600 font-medium text-white shadow-md transition-all hover:bg-indigo-700 hover:shadow-indigo-500/20"
                                    >
                                        {form.processing ? (
                                            "Memproses..."
                                        ) : editing ? (
                                            "Simpan Perubahan"
                                        ) : (
                                            <>
                                                <UserPlus className="mr-2 size-4" />{" "}
                                                Tambahkan User
                                            </>
                                        )}
                                    </Button>

                                    {editing && (
                                        <Button
                                            type="button"
                                            variant="outline"
                                            onClick={cancelEdit}
                                            className="cursor-pointer rounded-xl border-border dark:border-slate-800 text-muted-foreground dark:text-muted-foreground/60"
                                        >
                                            Batal
                                        </Button>
                                    )}
                                </div>
                            </form>
                        </CardContent>
                    </Card>

                    {/* Data List Section */}
                    <Card className="rounded-2xl border-border/80 bg-card shadow-xs dark:border-slate-800 dark:bg-slate-900">
                        <CardHeader className="border-b border-slate-100 py-4 dark:border-slate-800/80">
                            <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                                <div>
                                    <CardTitle className="text-base font-bold text-foreground dark:text-slate-100">
                                        Daftar Pengguna Sistem
                                    </CardTitle>
                                    <CardDescription className="text-xs">
                                        Menampilkan direktori seluruh anggota
                                        tim dan hak akses mereka.
                                    </CardDescription>
                                </div>

                                {/* Real-time Search Input */}
                                <div className="relative w-full sm:w-72">
                                    <Search className="absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground/80" />
                                    <Input
                                        className="rounded-xl border-border dark:border-slate-800 pl-9 pr-8 text-xs focus-visible:ring-indigo-500"
                                        placeholder="Cari nama atau role..."
                                        value={search}
                                        onChange={(e) =>
                                            setSearch(e.target.value)
                                        }
                                    />
                                    {search && (
                                        <Button
                                            type="button"
                                            variant="ghost"
                                            size="icon"
                                            onClick={resetSearch}
                                            className="absolute right-2.5 top-1/2 -translate-y-1/2 cursor-pointer text-muted-foreground/80 hover:text-muted-foreground dark:hover:text-slate-200"
                                        >
                                            <X className="size-3.5" />
                                        </Button>
                                    )}
                                </div>
                            </div>
                        </CardHeader>

                        <CardContent className="space-y-4 px-4 pt-4">
                            {users.data.length ? (
                                <div className="grid gap-3 sm:grid-cols-1">
                                    {users.data.map((u) => {
                                        const initials = u.name
                                            .split(" ")
                                            .map((n) => n[0])
                                            .join("")
                                            .substring(0, 2)
                                            .toUpperCase();

                                        const isActive = u.status === "active";

                                        return (
                                            <div
                                                key={u.id}
                                                className={`group relative flex flex-col justify-between gap-4 rounded-2xl border p-4 transition-all duration-200 hover:shadow-md sm:flex-row sm:items-center ${
                                                    editing === u.id
                                                        ? "border-indigo-500 bg-indigo-50/40 shadow-xs dark:border-indigo-500/50 dark:bg-indigo-950/20"
                                                        : "border-border/80 bg-card hover:border-indigo-200 dark:border-slate-800 dark:bg-slate-900/60 dark:hover:border-slate-700"
                                                }`}
                                            >
                                                {/* Profile Avatar & Info */}
                                                <div className="flex items-start gap-4">
                                                    <div className="relative shrink-0">
                                                        <div className="flex size-11 items-center justify-center rounded-2xl bg-linear-to-tr from-indigo-600 to-violet-500 text-xs font-bold tracking-wider text-white shadow-xs transition-transform group-hover:scale-105">
                                                            {initials}
                                                        </div>
                                                        <span
                                                            className={`absolute -bottom-0.5 -right-0.5 size-3.5 rounded-full border-2 border-white dark:border-slate-900 ${
                                                                isActive
                                                                    ? "bg-emerald-500"
                                                                    : "bg-slate-400"
                                                            }`}
                                                            title={
                                                                isActive
                                                                    ? "Aktif"
                                                                    : "Non-Aktif"
                                                            }
                                                        />
                                                    </div>

                                                    <div className="space-y-1">
                                                        <div className="flex flex-wrap items-center gap-2">
                                                            <h4 className="text-sm font-bold text-foreground transition-colors group-hover:text-indigo-600 dark:text-slate-100 dark:group-hover:text-indigo-400">
                                                                {u.name}
                                                            </h4>
                                                            {u.employee_code && (
                                                                <span className="rounded-md bg-muted px-1.5 py-0.5 font-mono text-[10px] font-semibold text-muted-foreground dark:bg-slate-800 dark:text-muted-foreground/80">
                                                                    {
                                                                        u.employee_code
                                                                    }
                                                                </span>
                                                            )}
                                                        </div>

                                                        <div className="flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground dark:text-muted-foreground/80">
                                                            <span className="flex items-center gap-1.5">
                                                                <Mail className="size-3.5 text-muted-foreground/80" />
                                                                {u.email}
                                                            </span>
                                                            {u.phone && (
                                                                <span className="flex items-center gap-1.5 border-l border-border pl-3 dark:border-slate-800">
                                                                    <Phone className="size-3.5 text-muted-foreground/80" />
                                                                    {u.phone}
                                                                </span>
                                                            )}
                                                        </div>

                                                        {/* Badges Role & Tim */}
                                                        <div className="flex flex-wrap items-center gap-1.5 pt-1">
                                                            <Badge
                                                                variant="secondary"
                                                                className="rounded-lg border border-indigo-100 bg-indigo-50/80 px-2 py-0.5 text-[11px] font-medium text-indigo-700 hover:bg-indigo-100 dark:border-indigo-900/50 dark:bg-indigo-950/50 dark:text-indigo-300"
                                                            >
                                                                <Sparkles className="mr-1 size-3 text-indigo-500" />
                                                                {u.role?.name ??
                                                                    "Tanpa Role"}
                                                            </Badge>

                                                            {u.team && (
                                                                <Badge
                                                                    variant="outline"
                                                                    className="rounded-lg border-border px-2 py-0.5 text-[11px] font-medium text-muted-foreground dark:border-slate-700 dark:text-muted-foreground/60"
                                                                >
                                                                    <Briefcase className="mr-1 size-3 text-muted-foreground/80" />
                                                                    {
                                                                        u.team
                                                                            .name
                                                                    }
                                                                </Badge>
                                                            )}
                                                        </div>
                                                    </div>
                                                </div>

                                                {/* Action Buttons */}
                                                <div className="flex items-center justify-end gap-2 border-t border-slate-100 pt-3 sm:border-t-0 sm:pt-0 dark:border-slate-800">
                                                    <Button
                                                        size="sm"
                                                        variant="ghost"
                                                        onClick={() => edit(u)}
                                                        className="h-8 cursor-pointer rounded-xl px-3 text-xs font-medium text-muted-foreground hover:bg-indigo-50 hover:text-indigo-600 dark:text-muted-foreground/60 dark:hover:bg-indigo-950/50 dark:hover:text-indigo-400"
                                                    >
                                                        <Pencil className="mr-1.5 size-3.5" />{" "}
                                                        Edit
                                                    </Button>

                                                    <div className="hidden h-4 w-px bg-slate-200 sm:block dark:bg-slate-800" />

                                                    <ConfirmDeleteButton
                                                        url={`/crm/users/${u.id}`}
                                                    />
                                                </div>
                                            </div>
                                        );
                                    })}
                                </div>
                            ) : (
                                <EmptyState
                                    title="Belum Ada Pengguna"
                                    description="Tidak ada pengguna yang cocok dengan kriteria pencarian Anda."
                                />
                            )}

                            {/* Pagination */}
                            <div className="pt-2">
                                <Pagination links={users.links} />
                            </div>
                        </CardContent>
                    </Card>
                </div>
            </div>
        </AppLayout>
    );
}
