"use client";

import { useState, useEffect, useTransition } from "react";
import { useRouter } from "next/navigation";
import { createEmployeeAction, updateEmployeePermissionsAction } from "@/app/actions/admin.actions";
import { ALL_PERMISSIONS, PermissionKey } from "@/types/auth";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { Card, CardContent } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Button, buttonVariants } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog";
import {
  Tooltip,
  TooltipContent,
  TooltipProvider,
  TooltipTrigger,
} from "@/components/ui/tooltip";
import {
  ShieldCheck,
  UserPlus,
  Search,
  CheckCircle2,
  AlertCircle,
  Loader2,
  Key,
  Users,
  Crown,
} from "lucide-react";

interface EmployeeItem {
  id: string;
  userId: string;
  jobTitle: string;
  department: string;
  isActive: boolean;
  createdAt: string;
  user: {
    id: string;
    first_name: string | null;
    last_name: string | null;
    email: string;
    phone_number: string | null;
  };
  permissions: PermissionKey[];
}

interface EmployeeManagerProps {
  employees: EmployeeItem[];
}

export function EmployeeManager({ employees }: EmployeeManagerProps) {
  const router = useRouter();
  const [employeesList, setEmployeesList] = useState<EmployeeItem[]>(employees);
  const [isPending, startTransition] = useTransition();
  const [searchTerm, setSearchTerm] = useState("");
  const [isAddOpen, setIsAddOpen] = useState(false);
  const [message, setMessage] = useState<{ type: "success" | "error"; text: string } | null>(null);

  useEffect(() => {
    setEmployeesList(employees);
  }, [employees]);

  // New Employee Form State
  const [userEmail, setUserEmail] = useState("");
  const [jobTitle, setJobTitle] = useState("Property Moderator");
  const [department, setDepartment] = useState("Operations");
  const [selectedPermissions, setSelectedPermissions] = useState<PermissionKey[]>([
    "property:approve_reject",
  ]);

  const filtered = employeesList.filter((emp) => {
    const searchLower = searchTerm.toLowerCase().trim();
    return (
      (emp.user?.email || "").toLowerCase().includes(searchLower) ||
      (emp.user?.first_name || "").toLowerCase().includes(searchLower) ||
      (emp.user?.last_name || "").toLowerCase().includes(searchLower) ||
      (emp.jobTitle || "").toLowerCase().includes(searchLower) ||
      (emp.department || "").toLowerCase().includes(searchLower)
    );
  });

  const togglePermission = (perm: PermissionKey) => {
    setSelectedPermissions((prev) =>
      prev.includes(perm) ? prev.filter((p) => p !== perm) : [...prev, perm]
    );
  };

  const handleCreateEmployee = (e: React.FormEvent) => {
    e.preventDefault();
    setMessage(null);

    startTransition(async () => {
      const res = await createEmployeeAction({
        userEmail,
        jobTitle,
        department,
        permissions: selectedPermissions,
      });

      if (res.success) {
        setMessage({ type: "success", text: "Employee provisioned successfully!" });
        if (res.employee) {
          setEmployeesList((prev) => [
            res.employee,
            ...prev.filter(
              (item) => item.id !== res.employee.id && item.user?.email !== res.employee.user?.email
            ),
          ]);
        }
        setUserEmail("");
        setIsAddOpen(false);
        router.refresh();
      } else {
        setMessage({ type: "error", text: res.error || "Failed to add employee" });
      }
    });
  };

  const handleToggleActive = (employeeId: string, currentActive: boolean) => {
    setMessage(null);
    startTransition(async () => {
      const res = await updateEmployeePermissionsAction({
        employeeId,
        isActive: !currentActive,
      });

      if (res.success) {
        setMessage({ type: "success", text: `Employee status updated to ${!currentActive ? "Active" : "Inactive"}` });
        setEmployeesList((prev) =>
          prev.map((emp) => (emp.id === employeeId ? { ...emp, isActive: !currentActive } : emp))
        );
        router.refresh();
      } else {
        setMessage({ type: "error", text: res.error || "Failed to update employee" });
      }
    });
  };

  return (
    <div className="space-y-6">
      {/* KPI Metrics Row */}
      <div className="grid grid-cols-2 lg:grid-cols-4 gap-3">
        <Card className="border-border bg-card rounded-md shadow-2xs p-3.5">
          <div className="flex items-center justify-between pb-1">
            <span className="text-xs font-medium text-muted-foreground">Total Staff</span>
            <Users className="w-4 h-4 text-muted-foreground" />
          </div>
          <div className="text-2xl font-bold tracking-tight text-foreground">{employeesList.length}</div>
          <p className="text-[11px] text-muted-foreground mt-0.5">Platform operators</p>
        </Card>

        <Card className="border-border bg-card rounded-md shadow-2xs p-3.5">
          <div className="flex items-center justify-between pb-1">
            <span className="text-xs font-medium text-muted-foreground">Super Admins</span>
            <Crown className="w-4 h-4 text-amber-500" />
          </div>
          <div className="text-2xl font-bold tracking-tight text-foreground">
            {employeesList.filter((e) => e.jobTitle.toLowerCase().includes("admin") || e.department.toLowerCase().includes("executive") || e.department.toLowerCase().includes("admin")).length}
          </div>
          <p className="text-[11px] text-muted-foreground mt-0.5">Executive control</p>
        </Card>

        <Card className="border-border bg-card rounded-md shadow-2xs p-3.5">
          <div className="flex items-center justify-between pb-1">
            <span className="text-xs font-medium text-muted-foreground">Moderators</span>
            <ShieldCheck className="w-4 h-4 text-amber-500" />
          </div>
          <div className="text-2xl font-bold tracking-tight text-foreground">
            {employeesList.filter((e) => e.jobTitle.toLowerCase().includes("moderator") || e.department.toLowerCase().includes("compliance") || e.department.toLowerCase().includes("trust") || e.department.toLowerCase().includes("safety")).length}
          </div>
          <p className="text-[11px] text-muted-foreground mt-0.5">Trust & verification</p>
        </Card>

        <Card className="border-border bg-card rounded-md shadow-2xs p-3.5">
          <div className="flex items-center justify-between pb-1">
            <span className="text-xs font-medium text-muted-foreground">Active Access</span>
            <CheckCircle2 className="w-4 h-4 text-emerald-500" />
          </div>
          <div className="text-2xl font-bold tracking-tight text-foreground">
            {employeesList.filter((e) => e.isActive).length}
          </div>
          <p className="text-[11px] text-muted-foreground mt-0.5">Enabled accounts</p>
        </Card>
      </div>

      {message && (
        <div
          className={`p-4 rounded-md flex items-center gap-3 text-xs border ${
            message.type === "success"
              ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 border-emerald-500/20"
              : "bg-destructive/10 text-destructive border-destructive/20"
          }`}
        >
          {message.type === "success" ? (
            <CheckCircle2 className="w-4 h-4 shrink-0" />
          ) : (
            <AlertCircle className="w-4 h-4 shrink-0" />
          )}
          <span>{message.text}</span>
        </div>
      )}

      {/* Control Bar: Search & Add Employee Button */}
      <div className="flex flex-col sm:flex-row items-stretch sm:items-center justify-between gap-3">
        <div className="relative flex-1 max-w-sm">
          <Search className="w-3.5 h-3.5 absolute left-3 top-2.5 text-muted-foreground" />
          <Input
            value={searchTerm}
            onChange={(e) => setSearchTerm(e.target.value)}
            placeholder="Search staff by name, email, or department..."
            className="pl-9 h-8 text-xs rounded-md"
          />
        </div>

        <Dialog open={isAddOpen} onOpenChange={setIsAddOpen}>
          <DialogTrigger className={buttonVariants({ className: "bg-primary hover:bg-primary/90 text-primary-foreground gap-1.5 text-xs font-semibold shadow-2xs rounded-md h-8 px-3 cursor-pointer" })}>
            <UserPlus className="w-3.5 h-3.5" />
            <span>Onboard Staff</span>
          </DialogTrigger>
          <DialogContent className="max-w-md max-h-[85vh] overflow-y-auto rounded-md">
            <DialogHeader>
              <DialogTitle className="flex items-center gap-2 text-sm">
                <ShieldCheck className="w-4 h-4 text-foreground" />
                Onboard Platform Staff Member
              </DialogTitle>
              <DialogDescription className="text-xs">
                Assign employee status and granular permissions to a registered user.
              </DialogDescription>
            </DialogHeader>

            <form onSubmit={handleCreateEmployee} className="space-y-3.5 pt-2 text-xs">
              <div className="space-y-1.5">
                <Label htmlFor="userEmail">User Email Address</Label>
                <Input
                  id="userEmail"
                  type="email"
                  value={userEmail}
                  onChange={(e) => setUserEmail(e.target.value)}
                  placeholder="staff@nigerialisting.com"
                  className="h-8 text-xs rounded-md"
                  required
                />
              </div>

              <div className="grid grid-cols-2 gap-3">
                <div className="space-y-1.5">
                  <Label htmlFor="jobTitle">Job Title</Label>
                  <Input
                    id="jobTitle"
                    value={jobTitle}
                    onChange={(e) => setJobTitle(e.target.value)}
                    placeholder="e.g. Property Moderator"
                    className="h-8 text-xs rounded-md"
                    required
                  />
                </div>

                <div className="space-y-1.5">
                  <Label htmlFor="department">Department</Label>
                  <Input
                    id="department"
                    value={department}
                    onChange={(e) => setDepartment(e.target.value)}
                    placeholder="e.g. Operations"
                    className="h-8 text-xs rounded-md"
                    required
                  />
                </div>
              </div>

              {/* Granular Permissions Checklist */}
              <div className="space-y-2 pt-2 border-t border-border">
                <Label className="font-semibold flex items-center gap-1.5 text-xs">
                  <Key className="w-3.5 h-3.5 text-muted-foreground" />
                  Assign Granular Staff Permissions
                </Label>
                <div className="space-y-1 max-h-44 overflow-y-auto p-2 border border-border rounded-md bg-muted/20">
                  {ALL_PERMISSIONS.map((perm: PermissionKey) => {
                    const isChecked = selectedPermissions.includes(perm);
                    return (
                      <label
                        key={perm}
                        className="flex items-center gap-2 p-1.5 rounded hover:bg-muted cursor-pointer text-xs"
                      >
                        <input
                          type="checkbox"
                          checked={isChecked}
                          onChange={() => togglePermission(perm)}
                          className="rounded border-input text-primary focus:ring-primary size-3.5"
                        />
                        <span className="font-mono text-[11px] text-foreground">{perm}</span>
                      </label>
                    );
                  })}
                </div>
              </div>

              <Button
                type="submit"
                disabled={isPending || selectedPermissions.length === 0}
                className="w-full bg-primary hover:bg-primary/90 text-primary-foreground font-semibold h-8 text-xs rounded-md cursor-pointer"
              >
                {isPending ? (
                  <>
                    <Loader2 className="w-3.5 h-3.5 mr-2 animate-spin" /> Provisioning...
                  </>
                ) : (
                  "Complete Staff Onboarding"
                )}
              </Button>
            </form>
          </DialogContent>
        </Dialog>
      </div>

      {/* Staff Table */}
      <Card className="border-border rounded-md shadow-2xs overflow-hidden">
        <CardContent className="p-0">
          <Table>
            <TableHeader>
              <TableRow className="bg-muted/40">
                <TableHead className="text-xs font-semibold">Staff Member</TableHead>
                <TableHead className="text-xs font-semibold">Job Title & Department</TableHead>
                <TableHead className="text-xs font-semibold">Granular Permissions</TableHead>
                <TableHead className="text-xs font-semibold">Status</TableHead>
                <TableHead className="text-right text-xs font-semibold">Actions</TableHead>
              </TableRow>
            </TableHeader>
            <TableBody>
              {filtered.length === 0 ? (
                <TableRow>
                  <TableCell colSpan={5} className="py-6 text-center text-muted-foreground text-xs">
                    <ShieldCheck className="w-4 h-4 mx-auto mb-1 text-muted-foreground/60" />
                    <p className="font-medium text-foreground">No staff members found matching criteria.</p>
                  </TableCell>
                </TableRow>
              ) : (
                filtered.map((emp) => {
                  const fullName = emp.user?.first_name
                    ? `${emp.user.first_name} ${emp.user.last_name || ""}`
                    : "Staff Member";

                  return (
                    <TableRow key={emp.id} className="hover:bg-muted/30">
                      <TableCell>
                        <div className="space-y-0.5">
                          <p className="font-bold text-xs text-foreground">{fullName}</p>
                          <p className="text-[11px] text-muted-foreground">{emp.user?.email}</p>
                        </div>
                      </TableCell>

                      <TableCell>
                        <div className="space-y-0.5 text-xs">
                          <p className="font-semibold text-foreground">{emp.jobTitle}</p>
                          <p className="text-[11px] text-muted-foreground">{emp.department}</p>
                        </div>
                      </TableCell>

                      <TableCell>
                        <div className="flex flex-wrap items-center gap-1 max-w-sm">
                          {emp.permissions.slice(0, 2).map((p) => (
                            <span
                              key={p}
                              className="inline-flex items-center text-[10px] font-mono px-1.5 py-0.5 rounded border border-neutral-200 dark:border-neutral-700 bg-neutral-100 dark:bg-neutral-800 text-neutral-800 dark:text-neutral-200"
                            >
                              {p}
                            </span>
                          ))}
                          {emp.permissions.length > 2 && (
                            <TooltipProvider>
                              <Tooltip>
                                <TooltipTrigger className="cursor-pointer inline-flex items-center text-[10px] font-mono font-medium px-1.5 py-0.5 rounded border border-border bg-muted/80 text-foreground hover:bg-muted transition-colors">
                                  +{emp.permissions.length - 2} more
                                </TooltipTrigger>
                                <TooltipContent className="max-w-xs space-y-1 p-2">
                                  <p className="text-[10px] font-bold text-muted-foreground uppercase tracking-wider mb-1">
                                    Additional Permissions ({emp.permissions.length - 2})
                                  </p>
                                  <div className="flex flex-wrap gap-1">
                                    {emp.permissions.slice(2).map((p) => (
                                      <span
                                        key={p}
                                        className="inline-block text-[10px] font-mono px-1 py-0.5 rounded border border-neutral-700 bg-neutral-800 text-neutral-200"
                                      >
                                        {p}
                                      </span>
                                    ))}
                                  </div>
                                </TooltipContent>
                              </Tooltip>
                            </TooltipProvider>
                          )}
                          {emp.permissions.length === 0 && (
                            <span className="text-[11px] text-muted-foreground italic">No direct permissions</span>
                          )}
                        </div>
                      </TableCell>

                      <TableCell>
                        <span
                          className={`inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium ${
                            emp.isActive
                              ? "bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 border border-emerald-500/20"
                              : "bg-muted text-muted-foreground border border-border"
                          }`}
                        >
                          {emp.isActive ? "Active" : "Disabled"}
                        </span>
                      </TableCell>

                      <TableCell className="text-right">
                        <Button
                          size="sm"
                          variant="ghost"
                          disabled={isPending}
                          onClick={() => handleToggleActive(emp.id, emp.isActive)}
                          className="h-7 text-xs text-muted-foreground hover:text-foreground rounded"
                        >
                          {emp.isActive ? "Disable Access" : "Enable Access"}
                        </Button>
                      </TableCell>
                    </TableRow>
                  );
                })
              )}
            </TableBody>
          </Table>
        </CardContent>
      </Card>
    </div>
  );
}
