import { Head, router, setLayoutProps } from '@inertiajs/react';
import {
    Boxes,
    MoreHorizontal,
    Pencil,
    Plus,
    Search,
    Trash2,
    Users,
} from 'lucide-react';
import { useEffect, useRef, useState } from 'react';

import {
    destroy as divisionDestroy,
    index as adminDivisionsIndex,
} from '@/actions/App/Domains/Shared/Http/Controllers/Admin/DivisionController';

import { DivisionFormDialog } from '@/components/admin/DivisionFormDialog';
import { DivisionMembersDialog } from '@/components/admin/DivisionMembersDialog';
import { ConfirmActionDialog } from '@/components/ConfirmActionDialog';
import { DataPagination } from '@/components/DataPagination';
import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import {
    DropdownMenu,
    DropdownMenuContent,
    DropdownMenuItem,
    DropdownMenuSeparator,
    DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { Input } from '@/components/ui/input';
import {
    Table,
    TableBody,
    TableCell,
    TableHead,
    TableHeader,
    TableRow,
} from '@/components/ui/table';
import type { AdminDivision, UserOption } from '@/types/admin';
import type { PaginationData } from '@/types/pagination';

const FILTER_DEBOUNCE_MS = 300;

interface AdminDivisionsPageProps {
    divisions: AdminDivision[];
    pagination: PaginationData;
    filters: {
        search: string;
    };
    users: UserOption[];
    divisionRoleOptions: string[];
}

export default function AdminDivisionsIndex({
    divisions,
    pagination,
    filters,
    users,
    divisionRoleOptions,
}: AdminDivisionsPageProps) {
    const [searchQuery, setSearchQuery] = useState(filters.search);

    const [formOpen, setFormOpen] = useState(false);
    const [editingDivision, setEditingDivision] =
        useState<AdminDivision | null>(null);
    const [membersDivision, setMembersDivision] =
        useState<AdminDivision | null>(null);
    const [deletingDivision, setDeletingDivision] =
        useState<AdminDivision | null>(null);
    const [processingAction, setProcessingAction] = useState(false);

    const isInitialFilterSync = useRef(true);

    useEffect(() => {
        if (isInitialFilterSync.current) {
            isInitialFilterSync.current = false;

            return;
        }

        const request = window.setTimeout(() => {
            router.get(
                adminDivisionsIndex().url,
                { search: searchQuery || undefined },
                { preserveScroll: true, preserveState: true, replace: true },
            );
        }, FILTER_DEBOUNCE_MS);

        return () => window.clearTimeout(request);
    }, [searchQuery]);

    setLayoutProps({
        breadcrumbs: [{ title: 'Division Management' }],
    });

    const openCreateForm = () => {
        setEditingDivision(null);
        setFormOpen(true);
    };

    const openEditForm = (division: AdminDivision) => {
        setEditingDivision(division);
        setFormOpen(true);
    };

    const confirmDelete = () => {
        if (!deletingDivision) {
            return;
        }

        setProcessingAction(true);

        router.delete(
            divisionDestroy({ division: deletingDivision.slug }).url,
            {
                preserveScroll: true,
                onFinish: () => {
                    setProcessingAction(false);
                    setDeletingDivision(null);
                },
            },
        );
    };

    return (
        <>
            <Head title="Division Management" />

            <div className="flex min-h-full flex-col gap-4 p-4 md:p-6">
                <div className="flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
                    <div>
                        <h1 className="text-xl font-bold tracking-tight text-foreground">
                            Division Management
                        </h1>
                        <p className="text-sm text-muted-foreground">
                            {pagination.total} division
                            {pagination.total === 1 ? '' : 's'} registered
                        </p>
                    </div>

                    <div className="flex flex-col gap-2 sm:flex-row">
                        <div className="relative w-full sm:w-72">
                            <Search
                                className="absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-muted-foreground"
                                size={16}
                            />
                            <Input
                                placeholder="Search name or prefix..."
                                className="h-9 rounded-lg bg-background pl-9"
                                value={searchQuery}
                                onChange={(e) => setSearchQuery(e.target.value)}
                            />
                        </div>

                        <Button className="h-9" onClick={openCreateForm}>
                            <Plus className="mr-1 h-4 w-4" />
                            New Division
                        </Button>
                    </div>
                </div>

                <div className="overflow-x-auto rounded-lg border bg-background">
                    <Table>
                        <TableHeader>
                            <TableRow className="hover:bg-transparent">
                                <TableHead className="w-12 text-center">
                                    NO.
                                </TableHead>
                                <TableHead>Division</TableHead>
                                <TableHead>Prefix</TableHead>
                                <TableHead>Members</TableHead>
                                <TableHead>Workload</TableHead>
                                <TableHead className="w-12" />
                            </TableRow>
                        </TableHeader>
                        <TableBody>
                            {divisions.length === 0 && (
                                <TableRow>
                                    <TableCell
                                        colSpan={6}
                                        className="py-10 text-center text-sm text-muted-foreground"
                                    >
                                        No division matches the current filter.
                                    </TableCell>
                                </TableRow>
                            )}

                            {divisions.map((division, index) => (
                                <TableRow key={division.id}>
                                    <TableCell className="text-center text-muted-foreground">
                                        {(pagination.from ?? 0) + index}
                                    </TableCell>

                                    <TableCell>
                                        <div className="font-medium text-foreground">
                                            {division.name}
                                        </div>
                                        <div className="line-clamp-1 text-xs text-muted-foreground">
                                            {division.description ||
                                                'No description'}
                                        </div>
                                    </TableCell>

                                    <TableCell>
                                        <Badge
                                            variant="secondary"
                                            className="font-mono"
                                        >
                                            {division.prefix}
                                        </Badge>
                                    </TableCell>

                                    <TableCell>
                                        {division.members.length === 0 ? (
                                            <span className="text-xs text-muted-foreground">
                                                —
                                            </span>
                                        ) : (
                                            <span className="text-sm text-foreground">
                                                {division.members.length}
                                                <span className="ml-1 text-xs text-muted-foreground">
                                                    member
                                                    {division.members.length ===
                                                    1
                                                        ? ''
                                                        : 's'}
                                                </span>
                                            </span>
                                        )}
                                    </TableCell>

                                    <TableCell>
                                        <div className="flex flex-wrap gap-1">
                                            <Badge
                                                variant="outline"
                                                className="font-normal"
                                            >
                                                {division.task_count} task
                                                {division.task_count === 1
                                                    ? ''
                                                    : 's'}
                                            </Badge>
                                            <Badge
                                                variant="outline"
                                                className="font-normal"
                                            >
                                                {division.project_count} project
                                                {division.project_count === 1
                                                    ? ''
                                                    : 's'}
                                            </Badge>
                                        </div>
                                    </TableCell>

                                    <TableCell>
                                        <DropdownMenu>
                                            <DropdownMenuTrigger asChild>
                                                <Button
                                                    variant="ghost"
                                                    size="icon"
                                                    aria-label={`Actions for ${division.name}`}
                                                >
                                                    <MoreHorizontal className="h-4 w-4" />
                                                </Button>
                                            </DropdownMenuTrigger>
                                            <DropdownMenuContent align="end">
                                                <DropdownMenuItem
                                                    onSelect={() =>
                                                        openEditForm(division)
                                                    }
                                                >
                                                    <Pencil className="mr-2 h-4 w-4" />
                                                    Edit division
                                                </DropdownMenuItem>
                                                <DropdownMenuItem
                                                    onSelect={() =>
                                                        setMembersDivision(
                                                            division,
                                                        )
                                                    }
                                                >
                                                    <Users className="mr-2 h-4 w-4" />
                                                    Manage members
                                                </DropdownMenuItem>
                                                <DropdownMenuSeparator />
                                                <DropdownMenuItem
                                                    disabled={
                                                        division.task_count >
                                                            0 ||
                                                        division.project_count >
                                                            0
                                                    }
                                                    onSelect={() =>
                                                        setDeletingDivision(
                                                            division,
                                                        )
                                                    }
                                                >
                                                    <Trash2 className="mr-2 h-4 w-4" />
                                                    Delete division
                                                </DropdownMenuItem>
                                            </DropdownMenuContent>
                                        </DropdownMenu>
                                    </TableCell>
                                </TableRow>
                            ))}
                        </TableBody>
                    </Table>
                </div>

                <DataPagination
                    pagination={pagination}
                    only={['divisions', 'pagination']}
                />
            </div>

            <DivisionFormDialog
                division={editingDivision}
                open={formOpen}
                onOpenChange={(open) => {
                    setFormOpen(open);

                    if (!open) {
                        setEditingDivision(null);
                    }
                }}
            />

            <DivisionMembersDialog
                division={membersDivision}
                users={users}
                divisionRoleOptions={divisionRoleOptions}
                open={membersDivision !== null}
                onOpenChange={(open) => !open && setMembersDivision(null)}
            />

            <ConfirmActionDialog
                open={deletingDivision !== null}
                onOpenChange={(open) => !open && setDeletingDivision(null)}
                onConfirm={confirmDelete}
                processing={processingAction}
                title="Delete this division?"
                description={
                    <>
                        <span className="font-medium text-foreground">
                            {deletingDivision?.name}
                        </span>{' '}
                        will be removed from the division list, and its{' '}
                        {deletingDivision?.members.length ?? 0} member
                        {deletingDivision?.members.length === 1 ? '' : 's'} will
                        lose access to it.
                    </>
                }
                confirmLabel="Delete"
                cancelLabel="Cancel"
                tone="danger"
                icon={Boxes}
            />
        </>
    );
}
