import {
  Badge,
  Box,
  Button,
  HStack,
  Input,
  Switch,
  Text,
  Tooltip,
  useDisclosure,
  useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import { HiDotsVertical } from "react-icons/hi";
import { Link, Link as RouterLink, useNavigate } from "react-router-dom";
import {
  AddIcon,
  CheckIcon,
  CloseIcon,
  DeleteIcon,
  EditIcon,
  ViewIcon,
} from "@chakra-ui/icons";
//   import { debounce } from "./AddInvestmentType";
import { debounce } from "../../Master/Sponser/AddSponser";
import { OPACITY_ON_LOAD } from "../../../Layout/animations";
import Pagination from "../../../Components/Pagination";
import GlobalStateContext from "../../../Contexts/GlobalStateContext";
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
import ToastBox from "../../../Components/ToastBox";
import DataTable from "../../../Components/DataTable/DataTable";
import DepositRequestApprove from "./DepositRequestApprove";
import DepositRequestReject from "./DepositRequestReject";
import NormalTable from "../../../Components/DataTable/NormalTable";
import { useGetDepositRequestQuery } from "../../../Services/deposit.request.service";
import { current } from "@reduxjs/toolkit";
import { TABLE_PAGINATION } from "../../../Constants/Paginations";
import {
  generateSerialNumber,
  removeTrailingZeros,
} from "../../../Constants/Constants";

export const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter

const DepositRequest = () => {
  const navigate = useNavigate();
  const toast = useToast();
  const { depositRequest, setDepositRequest, slideFromRight } =
    useContext(GlobalStateContext);
  const [isLoading, setIsLoading] = useState(true);
  const [deleteAlert, setDeleteAlert] = useState(false);
  const [actionId, setActionId] = useState("");
  const [mouseEntered, setMouseEntered] = useState(false);
  const [mouseEnteredId, setMouseEnteredId] = useState("");
  const {
    isOpen: isConfirmOpen,
    onOpen: onConfirmOpen,
    onClose: onConfirmClose,
  } = useDisclosure();
  const {
    isOpen: isRejectOpen,
    onOpen: onRejectOpen,
    onClose: onRejectClose,
  } = useDisclosure();
  


  // =========================== [Use State] ============================= 
  const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size);
  const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page);
  const [searchTerm, setSearchTerm] = useState("");
  const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");

  // Debounce the search term to avoid making a request on every keystroke
  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedSearchTerm(searchTerm);
    }, 500); // Adjust delay as needed
    return () => {
      clearTimeout(handler);
    };
  }, [searchTerm]);


  const formatDate = (date) => {
    return new Date(date).toLocaleDateString("en-GB", {
      day: "2-digit",
      month: "2-digit",
      year: "numeric",
    });
  };

  const {
    data,
    isLoading: depositRequestLoading,
    error,
    refetch,
  } = useGetDepositRequestQuery({
    page: debouncedSearchTerm ? undefined : currentPage,  // Omit pagination for search
    size: debouncedSearchTerm ? undefined : pageSize,     // Omit pagination for search
    search: debouncedSearchTerm,
  },
  {
    skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request
  });

  // Use useEffect to refetch data when the component mounts
  useEffect(() => {
    refetch();
  }, [refetch]);

  // ====================================================[Table Setup]================================================================
  const tableHeadRow = [
    "Sr.no",
    "Client ID",
    "First Name",
    "Last Name",
    "Country",
    "Phone Number",
    "Deposit Amount",
    "Deposit Date",
    "Action",
  ];

  const handleUpdateStatus = debounce((id) => {
    setDepositRequest((prevDepositRequest) =>
      prevDepositRequest.map((depositRequest) =>
        depositRequest.id === id
          ? { ...depositRequest, status: !depositRequest.status }
          : depositRequest
      )
    );
    toast({
      render: () => <ToastBox message={"Status changed succesfully.!"} />,
    });
  }, 300);

  const filteredData = data?.data?.rows
    .filter((item) => {
      // Filter by name (case insensitive)
      const name = [item.firstName, item.lastName, item.countryName]
        .filter(Boolean)
        .join(" ");
      const searchLower = searchTerm.toLowerCase();
      const nameMatches = name.toLowerCase().includes(searchLower);

      // Filter by status (Uncomment and use if needed)
      // const status = item.status;
      // const statusLower = status ? "active" : "inactive";

      // const statusMatches =
      //   statusFilter === "all" ||
      //   (statusFilter === "active" && status === true) ||
      //   (statusFilter === "inactive" && status === false);

      return nameMatches;
    })
    .sort((b, a) => new Date(a.createdAt) - new Date(b.createdAt));

  const extractedArray = data?.data?.rows?.map((item, idx) => ({
    // id: item?.id,
    "Sr.no": (
      <Text
        w={"20px"}
        justifyContent={slideFromRight ? "right" : "left"}
        as={"span"}
        color={"teal.900"}
        fontWeight={"500"}
        className="d-flex align-items-center web-text-small"
      >
        {generateSerialNumber(idx, currentPage, pageSize)}
      </Text>
    ),
    "Client ID": (
      <Text
        w={"60px"}
        justifyContent={slideFromRight ? "right" : "left"}
        as={"span"}
        color={"teal.900"}
        fontWeight={"500"}
        className="d-flex align-items-center web-text-small"
      >
        {item?.clientReference_id}
      </Text>
    ),
    "First Name": (
      <Box isTruncated={true}>
        <Text as={"span"} color={"teal.900"} fontWeight={"500"}>
          {item?.firstName}
        </Text>
      </Box>
    ),
    "Last Name": (
      <Box w={"70px"} isTruncated={true}>
        <Text as={"span"} color={"teal.900"}>
          {item?.lastName}
        </Text>
      </Box>
    ),
    Country: (
      <Box w={"100px"} isTruncated={true}>
        <Text as={"span"} color={"teal.900"}>
          {item?.countryName}
        </Text>
      </Box>
    ),
    "Phone Number": (
      <Box w={"80px"} isTruncated={true}>
        <Text as={"span"} color={"teal.900"}>
          {item?.mobileNumber}
        </Text>
      </Box>
    ),
    "Deposit Amount": (
      <Box
        display={"flex"}
        justifyContent={"end"}
        w={"130px"}
        isTruncated={true}
      >
        <Text as={"span"} color={"teal.900"}>
          {/* {formatCurrency(removeTrailingZeros(item?.investorAmount))}  */}
          {parseFloat(item?.investorAmount || 0).toLocaleString(undefined, {
            minimumFractionDigits: 2,
            maximumFractionDigits: 2,
          })}
          <Badge ms={1} colorScheme="green">
            {item?.currencyCode}
          </Badge>
        </Text>
      </Box>
    ),
    "Deposit Date": (
      <Text
        w={"60px"}
        justifyContent={slideFromRight ? "right" : "left"}
        as={"span"}
        color={"teal.900"}
        fontWeight={"500"}
        className="d-flex align-items-center web-text-small"
      >
        {formatDate(item?.createdAt)}
      </Text>
    ),
    Action: (
      <Box display={"flex"} justifyContent={"center"} gap={2}>
        <Tooltip
          rounded={"sm"}
          fontSize={"xs"}
          label="Approve"
          bg="#fff"
          color={"green.500"}
          placement="left-start"
        >
          <Button
            // colorScheme="forestGreen"
            // color="green.500"
            rounded={"sm"}
            size={"xs"}
            textTransform={"inherit"}
            fontWeight={500}
            px={2}
            py={1}
            onClick={() => {
              setActionId(item.id);
              onConfirmOpen();
            }}
            colorScheme="green"
            variant={"solid"}
            cursor={"pointer"}
          >
            <CheckIcon fontSize={"12px"} />
          </Button>
        </Tooltip>
        <Tooltip
          rounded={"sm"}
          fontSize={"xs"}
          label="Reject"
          bg="#fff"
          color={"red.500"}
          placement="left-start"
        >
          <Button
            colorScheme="red"
            // color="red.500"
            rounded={"sm"}
            size={"xs"}
            textTransform={"inherit"}
            fontWeight={500}
            px={2}
            onClick={() => {
              setActionId(item.id);
              onRejectOpen();
            }}
            py={1}
            // variant={"solid"}
          >
            <CloseIcon fontSize={"10px"} />
          </Button>
        </Tooltip>
      </Box>
    ),
  }));

  const handleDelete = () => {
    const IOtype = investmentType.filter(
      (investmentType) => investmentType.id !== actionId
    );

    setTimeout(() => {
      setInvestmentType(IOtype);
      setDeleteAlert(false);
      setIsLoading(false);
    }, 100);
    setIsLoading(true);
  };

  return (
    <Box {...OPACITY_ON_LOAD} overflowY={"scroll"} height={"100vh"} pb={38}>
      <Box bg="white.500">
        <HStack
          display={"flex"}
          justifyContent={"space-between"}
          ps={1}
          pe={1}
          pb={4}
          pt={4}
          spacing="24px"
        >
          <Input
            type="search"
            width={300}
            placeholder="Search..."
            size="sm"
            rounded="sm"
            focusBorderColor="green.500"
            value={searchTerm}
            onChange={(e) => setSearchTerm(e.target.value)}
          />

          <HStack display={"flex"} alignItems={"center"}>
            <Pagination
              isLoading={depositRequestLoading}
              pageSize={pageSize}
              setPageSize={setPageSize}
              currentPage={currentPage}
              setCurrentPage={setCurrentPage}
              totalItems={data?.data?.totalItems}
            />
          </HStack>
        </HStack>
      </Box>

      <NormalTable
        emptyMessage={`We don't have any Investment type `}
        tableHeadRow={tableHeadRow}
        data={extractedArray}
        isLoading={depositRequestLoading}
        viewActionId={actionId}
        setViewActionId={setActionId}
        // totalPages={10}

        setMouseEnteredId={setMouseEnteredId}
        setMouseEntered={setMouseEntered}
      />

      <CustomAlertDialog
        onClose={() => setDeleteAlert(false)}
        isOpen={deleteAlert}
        message={"Are you sure you want to delete sponers?"}
        alertHandler={handleDelete}
        isLoading={isLoading}
      />
      <DepositRequestApprove
        data={data?.data?.rows}
        isOpen={isConfirmOpen}
        onClose={onConfirmClose}
        id={actionId}
        // firstField={firstField}
      />
      <DepositRequestReject
        isOpen={isRejectOpen}
        onClose={onRejectClose}
        id={actionId}
      />
    </Box>
  );
};

export default DepositRequest;
