"use client";
import {
  Checklist,
  CreateIconIon,
  DeleteIcon,
  DotsYIcon,
  EyeIconMdi,
  SearchIcon,
  SuspendIcon,
} from "@/components/icons";
import { error, loading, success } from "@/config/swal";
import { deleteArticle, getListArticle } from "@/services/article";
import {
  changeSuspendStatus,
  deleteMasterUser,
  listMasterUsers,
} from "@/services/master-user";
import { Article, MasterUser } from "@/types/globals";
import { Button } from "@heroui/button";
import { Input } from "@heroui/input";
import {
  Chip,
  ChipProps,
  Dropdown,
  DropdownItem,
  DropdownMenu,
  DropdownTrigger,
  Pagination,
  Select,
  SelectItem,
  Spinner,
  Table,
  TableBody,
  TableCell,
  TableColumn,
  TableHeader,
  TableRow,
} from "@heroui/react";
import Link from "next/link";
import { Key, useCallback, useEffect, useState } from "react";
import Swal from "sweetalert2";
import withReactContent from "sweetalert2-react-content";

const columns = [
  { name: "No", uid: "no" },
  { name: "Username", uid: "username" },
  { name: "Fullname", uid: "fullname" },
  { name: "Email", uid: "email" },
  { name: "Status", uid: "status" },
  // { name: "Identity Type", uid: "identityType" },
  // { name: "Identity Number", uid: "identityNumber" },

  // { name: "Users", uid: "users" },
  // { name: "Status", uid: "status" },
  { name: "Aksi", uid: "actions" },
];

export default function MasterUserTable() {
  const MySwal = withReactContent(Swal);
  const [user, setUser] = useState<MasterUser[]>([]);
  const [page, setPage] = useState(1);
  const [totalPage, setTotalPage] = useState(1);
  const [showData, setShowData] = useState("10");
  const [search, setSearch] = useState("");
  const [searchType, setSearchType] = useState("username");

  useEffect(() => {
    initState();
  }, [page, showData]);

  async function initState() {
    const res = await listMasterUsers({
      page: page,
      limit: Number(showData),
      fullname: searchType === "fullname" ? search : "",
      username: searchType === "username" ? search : "",
      email: searchType === "email" ? search : "",
    });
    getTableNumber(10, res?.data?.data);
    setTotalPage(res?.data?.meta?.totalPage);
  }
  const getTableNumber = (limit: number, data?: any) => {
    if (data) {
      const startIndex = limit * (page - 1);
      let iterate = 0;
      const newData = data.map((value: any) => {
        iterate++;
        value.no = startIndex + iterate;
        return value;
      });
      setUser(newData);
    }
  };

  async function doDelete(id: any) {
    // loading();
    const resDelete = await deleteMasterUser(id);

    if (resDelete?.error) {
      error(resDelete.message);
      return false;
    }
    close();
    successSubmit();
  }

  const handleDelete = (id: any) => {
    MySwal.fire({
      title: "Hapus Data",
      icon: "warning",
      showCancelButton: true,
      cancelButtonColor: "#3085d6",
      confirmButtonColor: "#d33",
      confirmButtonText: "Hapus",
    }).then((result) => {
      if (result.isConfirmed) {
        doDelete(id);
      }
    });
  };

  function successSubmit() {
    MySwal.fire({
      title: "Sukses",
      icon: "success",
      confirmButtonColor: "#3085d6",
      confirmButtonText: "OK",
    }).then((result) => {
      if (result.isConfirmed) {
        initState();
      }
    });
  }

  const handleSuspend = (id: number, status: boolean) => {
    MySwal.fire({
      title: `${!status ? "Lepas " : ""}Suspend User?`,
      icon: "warning",
      showCancelButton: true,
      cancelButtonColor: "#3085d6",
      confirmButtonColor: "#d33",
      confirmButtonText: "Yes",
    }).then((result) => {
      if (result.isConfirmed) {
        doSuspend(id, status);
      }
    });
  };

  async function doSuspend(id: number, status: boolean) {
    loading();

    console.log("do suspend", id, status);
    const res = await changeSuspendStatus({
      user_id: id,
      is_suspended: status,
    });

    if (res?.error) {
      error(res.message);
      return false;
    }
    close();
    successSubmit();
  }

  const renderCell = useCallback((user: MasterUser, columnKey: Key) => {
    const cellValue = user[columnKey as keyof MasterUser];
    const statusColorMap: Record<string, ChipProps["color"]> = {
      active: "primary",
      cancel: "danger",
      pending: "success",
    };

    switch (columnKey) {
      case "id":
        return <div>{user.id}</div>;

      case "status":
        return (
          <Chip
            className="capitalize "
            color={user?.isSuspended ? "danger" : "success"}
            size="lg"
            variant="flat"
          >
            <div className="flex flex-row items-center gap-2 justify-center">
              {user?.isSuspended ? "Suspend" : "Active"}
            </div>
          </Chip>
        );

      case "actions":
        return (
          <div className="relative flex justify-star items-center gap-2">
            <Dropdown className="lg:min-w-[150px] bg-black text-white shadow border ">
              <DropdownTrigger>
                <Button isIconOnly size="lg" variant="light">
                  <DotsYIcon className="text-default-300" />
                </Button>
              </DropdownTrigger>
              <DropdownMenu>
                <DropdownItem key="Edit">
                  <Link href={`/admin/master-user/edit/${user.id}`}>
                    <CreateIconIon className="inline mr-2 mb-1" />
                    Edit
                  </Link>
                </DropdownItem>
                <DropdownItem
                  key="Suspend"
                  onClick={() => handleSuspend(user.id, !user?.isSuspended)}
                >
                  {user?.isSuspended ? (
                    <Checklist
                      color="green"
                      width={20}
                      height={16}
                      className="inline mr-2 mb-1"
                    />
                  ) : (
                    <SuspendIcon
                      color="red"
                      width={20}
                      height={16}
                      className="inline mr-2 mb-1"
                    />
                  )}

                  {user?.isSuspended ? "Unsuspend" : "Suspend"}
                </DropdownItem>
                <DropdownItem
                  key="Delete"
                  onClick={() => handleDelete(user.id)}
                >
                  <DeleteIcon
                    color="red"
                    width={20}
                    height={16}
                    className="inline mr-2 mb-1"
                  />
                  Delete
                </DropdownItem>
              </DropdownMenu>
            </Dropdown>
          </div>
        );

      default:
        return cellValue;
    }
  }, []);

  let typingTimer: NodeJS.Timeout;
  const doneTypingInterval = 1500;

  const handleKeyUp = () => {
    clearTimeout(typingTimer);
    typingTimer = setTimeout(doneTyping, doneTypingInterval);
  };

  const handleKeyDown = () => {
    clearTimeout(typingTimer);
  };

  async function doneTyping() {
    initState();
  }

  return (
    <>
      <div className="mx-3 my-5">
        <div className="flex flex-col items-center rounded-2xl">
          <div className="flex flex-col md:flex-row gap-3 w-full mb-2">
            <div className="flex flex-col gap-1 w-full lg:w-1/3">
              <p className="font-semibold text-sm">Pencarian</p>
              <Input
                aria-label="Search"
                classNames={{
                  inputWrapper: "bg-default-100",
                  input: "text-sm",
                }}
                labelPlacement="outside"
                startContent={
                  <SearchIcon className="text-base text-default-400 pointer-events-none flex-shrink-0" />
                }
                type="text"
                onChange={(e) => setSearch(e.target.value)}
                onKeyUp={handleKeyUp}
                onKeyDown={handleKeyDown}
                endContent={
                  <Select
                    label=""
                    size="sm"
                    variant="flat"
                    labelPlacement="outside"
                    placeholder="Select"
                    selectedKeys={[searchType]}
                    className="w-[160px]"
                    classNames={{ trigger: "border-1" }}
                    onChange={(e) =>
                      e.target.value === "" ? "" : setSearchType(e.target.value)
                    }
                  >
                    <SelectItem key="username">Username</SelectItem>
                    <SelectItem key="fullnamme">Fullname</SelectItem>
                    <SelectItem key="email">Email</SelectItem>
                  </Select>
                }
              />
            </div>
            <div className="flex flex-col gap-1 w-full lg:w-[72px]">
              <p className="font-semibold text-sm">Data</p>
              <Select
                label=""
                variant="bordered"
                labelPlacement="outside"
                placeholder="Select"
                selectedKeys={[showData]}
                className="w-full"
                classNames={{ trigger: "border-1" }}
                onChange={(e) =>
                  e.target.value === "" ? "" : setShowData(e.target.value)
                }
              >
                <SelectItem key="5">5</SelectItem>
                <SelectItem key="10">10</SelectItem>
                <SelectItem key="25">25</SelectItem>
                <SelectItem key="50">50</SelectItem>
              </Select>
            </div>
          </div>
          <Table
            // selectionMode="multiple"
            aria-label="micro issue table"
            className="rounded-2xl"
            classNames={{
              th: "bg-white dark:bg-black text-black dark:text-white border-b-1 text-md",
              base: "bg-white dark:bg-black border",
              wrapper:
                "min-h-[50px] bg-transpararent text-black dark:text-white ",
            }}
          >
            <TableHeader columns={columns}>
              {(column) => (
                <TableColumn key={column.uid}>{column.name}</TableColumn>
              )}
            </TableHeader>
            <TableBody
              items={user}
              emptyContent={"No data to display."}
              loadingContent={<Spinner label="Loading..." />}
            >
              {(item) => (
                <TableRow key={item.id}>
                  {(columnKey) => (
                    <TableCell>{renderCell(item, columnKey)}</TableCell>
                  )}
                </TableRow>
              )}
            </TableBody>
          </Table>
          <div className="my-2 w-full flex justify-center">
            <Pagination
              isCompact
              showControls
              showShadow
              color="primary"
              classNames={{
                base: "bg-transparent",
                wrapper: "bg-transparent",
                item: "w-fit px-3",
                cursor: "w-fit px-3",
              }}
              page={page}
              total={totalPage}
              onChange={(page) => setPage(page)}
            />
          </div>
        </div>
      </div>
    </>
  );
}
