import { useState } from "react";
import { Head, router } 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 { Checkbox } from "@/components/ui/checkbox";
import { Badge } from "@/components/ui/badge";
import {
    ShieldCheck,
    ShieldAlert,
    PlusCircle,
    Pencil,
    Users,
    Key,
    CheckCircle2,
    RotateCcw,
    Sparkles,
    Lock,
    Search,
} from "lucide-react";
import { ConfirmDeleteButton } from "@/components/crm-confirm-dialog";
import { EmptyState } from "@/components/crm-data-table";
import { StatChip } from "@/components/crm/global-card";

type Role = {
    id: number;
    name: string;
    slug: string;
    permissions: Record<string, boolean> | null;
    users_count: number;
};

type Props = {
    roles: Role[];
    permissions: Record<string, string>;
};

export default function RolesPage({ roles, permissions }: Props) {
    const keys = Object.keys(permissions);
    const [editing, setEditing] = useState<Role | null>(null);
    const [name, setName] = useState("");
    const [slug, setSlug] = useState("");
    const [selected, setSelected] = useState<string[]>([]);
    const [searchQuery, setSearchQuery] = useState("");

    const open = (role?: Role) => {
        setEditing(role ?? null);
        setName(role?.name ?? "");
        setSlug(role?.slug ?? "");
        setSelected(
            Object.keys(role?.permissions ?? {}).filter(
                (k) => role?.permissions?.[k],
            ),
        );
    };

    const handleNameChange = (val: string) => {
        setName(val);
        if (!editing) {
            setSlug(
                val
                    .toLowerCase()
                    .trim()
                    .replace(/\s+/g, "-")
                    .replace(/[^a-z0-9-]/g, ""),
            );
        }
    };

    const submit = () => {
        if (!name || !slug) return;
        const payload = { name, slug, permissions: selected };
        const done = () => open();

        if (editing) {
            router.put(`/crm/roles/${editing.id}`, payload, {
                onSuccess: done,
            });
        } else {
            router.post("/crm/roles", payload, { onSuccess: done });
        }
    };

    const toggle = (key: string, checked: boolean) =>
        setSelected((v) =>
            checked
                ? v.includes(key)
                    ? v
                    : [...v, key]
                : v.filter((x) => x !== key),
        );

    const toggleAll = () => {
        if (selected.length === keys.length) {
            setSelected([]);
        } else {
            setSelected([...keys]);
        }
    };

    // Metrics calculation
    const totalRoles = roles.length;
    const totalUsersAssigned = roles.reduce(
        (acc, r) => acc + (r.users_count || 0),
        0,
    );
    const totalPermissions = keys.length;

    // Filter roles
    const filteredRoles = roles.filter(
        (r) =>
            r.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
            r.slug.toLowerCase().includes(searchQuery.toLowerCase()),
    );

    return (
        <AppLayout
            breadcrumbs={[{ title: "Roles & Permission", href: "/crm/roles" }]}
        >
            <Head title="Roles & Access Control" />

            <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-bold uppercase tracking-wider text-indigo-600 dark:text-indigo-400">
                            <ShieldCheck className="size-4" /> Granular Access
                            Management
                        </div>
                        <h1 className="text-2xl font-extrabold tracking-tight text-foreground dark:text-slate-50">
                            Roles & Permissions
                        </h1>
                        <p className="text-sm text-muted-foreground dark:text-muted-foreground/80">
                            Definisikan peranan jabatan dan batasi otorisasi
                            modul bagi tiap personel perusahaan.
                        </p>
                    </div>
                </div>

                {/* KPI Overview Cards */}
                <div className="grid gap-4 sm:grid-cols-3">
                    <StatChip
                        icon={Lock}
                        label="Total Role Sistem"
                        value={totalRoles}
                        tone="violet"
                        variant="compact"
                        description="Tersedia dalam direktori"
                    />

                    <StatChip
                        icon={Users}
                        label="Pengguna Terotorisasi"
                        value={totalUsersAssigned}
                        tone="emerald"
                        variant="compact"
                        description="Mempunyai penetapan hak akses"
                    />

                    <StatChip
                        icon={Key}
                        label="Modul Izin Sistem"
                        value={totalPermissions}
                        tone="orange"
                        variant="compact"
                        description="Hak izin unik dikonfigurasi"
                    />
                </div>

                {/* Main Interactive Grid */}
                <div className="grid items-start gap-6 xl:grid-cols-[440px_1fr]">
                    {/* Form Builder Card */}
                    <Card className="rounded-2xl border-border/80 bg-card shadow-2xs 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">
                            <div className="flex items-center gap-2.5">
                                <div className="rounded-xl bg-indigo-50 p-2.5 text-indigo-600 dark:bg-indigo-950/50 dark:text-indigo-400">
                                    {editing ? (
                                        <Pencil className="size-4" />
                                    ) : (
                                        <PlusCircle className="size-4" />
                                    )}
                                </div>
                                <div>
                                    <CardTitle className="text-base font-bold text-foreground dark:text-slate-100">
                                        {editing
                                            ? "Edit Konfigurasi Role"
                                            : "Tambah Role Baru"}
                                    </CardTitle>
                                    <CardDescription className="text-xs">
                                        {editing
                                            ? "Perbarui nama, kualifikasi slug, dan otorisasi."
                                            : "Buat tingkat akses kustom baru bagi tim."}
                                    </CardDescription>
                                </div>
                            </div>
                        </CardHeader>

                        <CardContent className="space-y-4 pt-4">
                            <div className="space-y-1.5">
                                <Label className="text-xs font-semibold text-foreground/80 dark:text-muted-foreground/60">
                                    Nama Role{" "}
                                    <span className="text-rose-500">*</span>
                                </Label>
                                <Input
                                    className="rounded-xl border-border dark:border-slate-800 focus-visible:ring-indigo-500"
                                    placeholder="cth. Finance Manager"
                                    value={name}
                                    onChange={(e) =>
                                        handleNameChange(e.target.value)
                                    }
                                />
                            </div>

                            <div className="space-y-1.5">
                                <Label className="text-xs font-semibold text-foreground/80 dark:text-muted-foreground/60">
                                    Identifier Slug{" "}
                                    <span className="text-rose-500">*</span>
                                </Label>
                                <Input
                                    className="rounded-xl border-border dark:border-slate-800 font-mono text-xs focus-visible:ring-indigo-500"
                                    placeholder="finance-manager"
                                    value={slug}
                                    onChange={(e) =>
                                        setSlug(
                                            e.target.value
                                                .toLowerCase()
                                                .replace(/\s+/g, "-")
                                                .replace(/[^a-z0-9-]/g, ""),
                                        )
                                    }
                                />
                                <span className="block text-[10px] text-muted-foreground/80">
                                    Digunakan oleh backend sebagai kunci
                                    pemeriksaan middleware.
                                </span>
                            </div>

                            {/* Permissions Selector */}
                            <div className="space-y-2 pt-2">
                                <div className="flex items-center justify-between">
                                    <Label className="text-xs font-semibold text-foreground/80 dark:text-muted-foreground/60">
                                        Matriks Hak Akses Modul (
                                        {selected.length}/{keys.length})
                                    </Label>
                                    <Button
                                        type="button"
                                        variant="ghost"
                                        size="sm"
                                        onClick={toggleAll}
                                        className="h-7 px-2 text-[11px] font-medium text-indigo-600 hover:bg-indigo-50 dark:text-indigo-400 dark:hover:bg-indigo-950/50"
                                    >
                                        {selected.length === keys.length
                                            ? "Batal Semua"
                                            : "Pilih Semua"}
                                    </Button>
                                </div>

                                <div className="max-h-80 space-y-1.5 overflow-y-auto rounded-xl border border-border/80 bg-muted/50/50 p-2.5 dark:border-slate-800 dark:bg-slate-950/40">
                                    {keys.map((key) => {
                                        const isChecked =
                                            selected.includes(key);
                                        return (
                                            <label
                                                key={key}
                                                className={`flex cursor-pointer items-center justify-between rounded-lg border p-2.5 transition-all ${
                                                    isChecked
                                                        ? "border-indigo-200 bg-indigo-50/60 shadow-2xs dark:border-indigo-900/60 dark:bg-indigo-950/40"
                                                        : "border-border/60 bg-card hover:border-border dark:border-slate-800/80 dark:bg-slate-900 dark:hover:border-slate-700"
                                                }`}
                                            >
                                                <div className="flex items-center gap-2.5">
                                                    <Checkbox
                                                        id={`perm-${key}`}
                                                        checked={isChecked}
                                                        onCheckedChange={(v) =>
                                                            toggle(key, !!v)
                                                        }
                                                        className="data-[state=checked]:bg-indigo-600 data-[state=checked]:border-indigo-600"
                                                    />
                                                    <span className="text-xs font-medium text-foreground dark:text-slate-200">
                                                        {permissions[key]}
                                                    </span>
                                                </div>
                                                <span className="font-mono text-[10px] text-muted-foreground/80 dark:text-muted-foreground">
                                                    {key}
                                                </span>
                                            </label>
                                        );
                                    })}
                                </div>
                            </div>

                            {/* Actions */}
                            <div className="flex gap-2 pt-2">
                                <Button
                                    onClick={submit}
                                    disabled={!name || !slug}
                                    className="flex-1 rounded-xl bg-indigo-600 font-semibold text-white shadow-md transition-all hover:bg-indigo-700 hover:shadow-indigo-500/20 disabled:opacity-50 cursor-pointer"
                                >
                                    {editing ? (
                                        "Simpan Perubahan"
                                    ) : (
                                        <>
                                            <Sparkles className="mr-2 size-4" />{" "}
                                            Buat Role Baru
                                        </>
                                    )}
                                </Button>
                                {editing && (
                                    <Button
                                        variant="outline"
                                        onClick={() => open()}
                                        className="rounded-xl border-border text-muted-foreground hover:bg-muted dark:border-slate-800 dark:text-muted-foreground/60 cursor-pointer"
                                    >
                                        <RotateCcw className="mr-1.5 size-3.5" />{" "}
                                        Batal
                                    </Button>
                                )}
                            </div>
                        </CardContent>
                    </Card>

                    {/* Roles Listing Card */}
                    <Card className="rounded-2xl border-border/80 bg-card shadow-2xs dark:border-slate-800 dark:bg-slate-900">
                        <CardHeader className="border-b border-slate-100 py-4 dark:border-slate-800">
                            <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 Role & Akses
                                    </CardTitle>
                                    <CardDescription className="text-xs">
                                        Hak otorisasi aktif yang saat ini
                                        dipasang pada akun pengguna.
                                    </CardDescription>
                                </div>

                                <div className="relative w-full sm:w-64">
                                    <Search className="absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground/80" />
                                    <Input
                                        className="rounded-xl border-border dark:border-slate-800 pl-8 text-xs focus-visible:ring-indigo-500"
                                        placeholder="Cari role atau slug..."
                                        value={searchQuery}
                                        onChange={(e) =>
                                            setSearchQuery(e.target.value)
                                        }
                                    />
                                </div>
                            </div>
                        </CardHeader>

                        <CardContent className="space-y-3.5 pt-4">
                            {filteredRoles.length ? (
                                filteredRoles.map((role) => {
                                    const activePermissions = Object.keys(
                                        role.permissions ?? {},
                                    ).filter((k) => role.permissions?.[k]);
                                    const isBeingEdited =
                                        editing?.id === role.id;

                                    return (
                                        <div
                                            key={role.id}
                                            className={`group relative flex flex-col justify-between gap-4 rounded-2xl border p-4.5 transition-all duration-200 hover:shadow-md sm:flex-row sm:items-start ${
                                                isBeingEdited
                                                    ? "border-indigo-500 bg-indigo-50/40 shadow-2xs 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"
                                            }`}
                                        >
                                            <div className="space-y-2">
                                                <div className="flex flex-wrap items-center gap-2">
                                                    <h4 className="text-base font-bold text-foreground transition-colors group-hover:text-indigo-600 dark:text-slate-100 dark:group-hover:text-indigo-400">
                                                        {role.name}
                                                    </h4>
                                                    <span className="rounded-md bg-muted px-2 py-0.5 font-mono text-[11px] font-semibold text-muted-foreground dark:bg-slate-800 dark:text-muted-foreground/80">
                                                        {role.slug}
                                                    </span>
                                                    <Badge
                                                        variant="outline"
                                                        className="rounded-lg border-emerald-200 bg-emerald-50/50 px-2 py-0.5 text-[10px] font-semibold text-emerald-700 dark:border-emerald-900/50 dark:bg-emerald-950/40 dark:text-emerald-400"
                                                    >
                                                        <Users className="mr-1 size-3" />
                                                        {role.users_count} User
                                                    </Badge>
                                                </div>

                                                {/* Permission Badges */}
                                                <div className="flex flex-wrap items-center gap-1.5 pt-1">
                                                    {activePermissions.length ? (
                                                        activePermissions
                                                            .slice(0, 5)
                                                            .map((k) => (
                                                                <Badge
                                                                    key={k}
                                                                    variant="secondary"
                                                                    className="rounded-md border border-indigo-100/80 bg-indigo-50/60 px-2 py-0.5 text-[10px] font-medium text-indigo-700 dark:border-indigo-900/40 dark:bg-indigo-950/40 dark:text-indigo-300"
                                                                >
                                                                    <CheckCircle2 className="mr-1 size-2.5 text-indigo-500" />
                                                                    {permissions[
                                                                        k
                                                                    ] || k}
                                                                </Badge>
                                                            ))
                                                    ) : (
                                                        <span className="flex items-center gap-1 text-[11px] text-amber-600 dark:text-amber-400">
                                                            <ShieldAlert className="size-3" />{" "}
                                                            Tidak ada izin
                                                            khusus aktif
                                                        </span>
                                                    )}

                                                    {activePermissions.length >
                                                        5 && (
                                                        <Badge
                                                            variant="outline"
                                                            className="rounded-md border-border px-1.5 py-0.5 font-mono text-[10px] font-semibold text-muted-foreground dark:border-slate-800 dark:text-muted-foreground/80"
                                                        >
                                                            +
                                                            {activePermissions.length -
                                                                5}{" "}
                                                            Modul
                                                        </Badge>
                                                    )}
                                                </div>
                                            </div>

                                            {/* Action Control */}
                                            <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={() => open(role)}
                                                    className="h-8 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 cursor-pointer"
                                                >
                                                    <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/roles/${role.id}`}
                                                />
                                            </div>
                                        </div>
                                    );
                                })
                            ) : (
                                <EmptyState
                                    title="Role Tidak Ditemukan"
                                    description="Tidak ada role yang cocok dengan query kata kunci pencarian Anda."
                                />
                            )}
                        </CardContent>
                    </Card>
                </div>
            </div>
        </AppLayout>
    );
}
