/* eslint-disable @typescript-eslint/no-explicit-any */
import UserDashboardLayout from '@/layouts/user_dashboard_layout'
import styles from './deposits-page.module.scss'
import { useState } from 'react'
import { Head, router, usePage } from '@inertiajs/react'
import Transaction from '@/components/dashboard/Transaction'
import NoResults from '@/components/dashboard/NoResults'
import Pagination from '@/components/shared/Pagination'
import ResultsPerPage from '@/components/shared/ResultsPerPage'
import PageIntro from '@/components/dashboard/PageIntro'
import DepositModal from '@/components/dashboard/Modals/DepositModal'
import { FaFilter, FaRegEye, FaPiggyBank, FaEyeSlash } from 'react-icons/fa'
import { usePaginatedData } from '@/hooks/use-paginated-data'
import currencyData from "../../../../data/countries-currencies.json";
import { formatMoneyComplete } from '@/lib/utils/format-money'

// ------------------ Skeleton Loader ------------------
{/* ------------------ Skeleton Loader ------------------ */}
const TableSkeleton: React.FC = () => {
  return (
    <div className={styles.tableScrollWrapper}>
      <div className={styles.table}>
        <div className={styles.deposits__history__table}>
          <span>&nbsp;</span>
          <span>&nbsp;</span>
          <span>&nbsp;</span>
          <span>&nbsp;</span>
          <span>&nbsp;</span>
          <span>&nbsp;</span>
        </div>

        <div className={styles.deposits__history__table__children}>
          {[...Array(5)].map((_, i) => (
            <div
              key={i}
              className={styles['transactions__card--skeleton']}
            >
              <div
                className={styles.skeleton__line}
                style={{ width: "25%" }}
              />
              <div
                className={styles.skeleton__line}
                style={{ width: "50%" }}
              />
              <div
                className={styles.skeleton__line}
                style={{ width: "30%" }}
              />
            </div>
          ))}
        </div>
      </div>
    </div>
  );
};

interface DepositsProps {
  transactions: any
  filters?: { startDate?: string; endDate?: string }
  perPage?: number, 
  paymentMethods: any, 
  totalDeposits: any
}

interface DepositsComponent extends React.FC<DepositsProps> {
  layout?: (page: React.ReactNode) => React.ReactNode
}

const Deposits: DepositsComponent = ({ transactions = [], totalDeposits, filters, perPage: initialPerPage = 10 }) => {
  const { appSettings } = usePage().props as any

  console.log("Deposit transactions", transactions)

  const currency = currencyData.find(
    (item) => item.currency_code === appSettings?.base_currency
  )

  const [startDate, setStartDate] = useState(filters?.startDate || '')
  const [endDate, setEndDate] = useState(filters?.endDate || '')
  const [showFilters, setShowFilters] = useState(!!(filters?.startDate || filters?.endDate))
  const [depositModal, setDepositModal] = useState(false)
  const [hideAmount, setHideAmount] = useState(false)

  const toggleDepositModal = () => {
  setDepositModal((prev) => !prev)
}

  const toggleHideAmount = () => setHideAmount((prev) => !prev)

  const {
    perPage,
    loading: isLoading,
    setLoading,
    handlePageChange,
    handlePerPageChange,
  } = usePaginatedData(initialPerPage)

  const applyFilters = () => {
    setLoading(true)
    router.get(
      '/dashboard/deposits',
      { page: 1, startDate, endDate },
      { preserveState: true, preserveScroll: true, onFinish: () => setLoading(false) }
    )
  }

  const clearFilters = () => {
    setStartDate('')
    setEndDate('')
    setLoading(true)
    router.get(
      '/dashboard/deposits',
      { page: 1 },
      { preserveState: true, preserveScroll: true, onFinish: () => setLoading(false) }
    )
  }

  const hasDeposits = transactions?.data?.length > 0

  return (
    <>
    
      <Head title="Deposit funds to your wallet" />
      {depositModal && <DepositModal onClose={toggleDepositModal} />}

      <div className={styles.deposits}>
        <PageIntro
          title="Deposits History"
          description="View all your deposit transactions in one place"
        />

        {/* ------------------- Summary Card ------------------- */}
        <div className={styles.card}>
          <div className={styles.card__left}>
            <div className={styles.card__title}>
              <h4>Deposits</h4>

              <button
                type="button"
                className={styles.eyeButton}
                onClick={toggleHideAmount}
                title={hideAmount ? "Show balance" : "Hide balance"}
              >
                {hideAmount ? <FaRegEye /> : <FaEyeSlash />}
              </button>
            </div>

            <h2 className={styles.card__amount}>
              {hideAmount ? (
                "********"
              ) : (
                <>
                  <span className={styles.currency}>
                    {currency?.currency_symbol}
                  </span>
                  <span className={styles.amount}>
                    {formatMoneyComplete(totalDeposits ?? 0)}
                  </span>
                </>
              )}
            </h2>
          </div>

          <div className={styles.card__right}>
            <div className={`${styles.actionBtn} ${styles.fund}`} onClick={toggleDepositModal}>
              <FaPiggyBank /> Deposit
            </div>
          </div>
        </div>

        {/* ------------------- Filter & Per Page ------------------- */}
        <div className={styles['deposits__history--helpers']}>
          <button
            className={styles.filterToggleBtn}
            onClick={() => setShowFilters(!showFilters)}
          >
            <FaFilter /> &nbsp; {showFilters ? 'Hide Filters' : 'Apply Date Filter'}
          </button>

          <ResultsPerPage
            current={perPage}
            options={[1, 5, 10, 25, 50]}
            onChange={handlePerPageChange}
          />
        </div>

        {showFilters && (
          <div className={styles.filterSection}>
            <input type="date" value={startDate} onChange={(e) => setStartDate(e.target.value)} />
            <input type="date" value={endDate} onChange={(e) => setEndDate(e.target.value)} />
            <div className={styles.filterButtons}>
              <button onClick={applyFilters}>Apply</button>
              <button style={{ background: '#f44336', marginLeft: "1rem" }} onClick={clearFilters}>Clear</button>
            </div>
          </div>
        )}

       {/* ------------------- Table / Skeleton ------------------- */}
        {isLoading ? (
          <TableSkeleton />
        ) : (
          <div className={styles.tableScrollWrapper}>
            <div className={styles.table}>
              <div className={styles.deposits__history__table}>
                <span>Type</span>
                <span>Amount</span>
                <span>Channel</span>
                <span>Date Created</span>
                <span>Status</span>
                <span>Details</span>
              </div>

              <div className={styles.deposits__history__table__children}>
                {hasDeposits ? (
                  transactions?.data?.map((deposit: any) => (
                    <Transaction
                      key={deposit.transactionId}
                      transaction={deposit}
                    />
                  ))
                ) : (
                  <NoResults
                    title="No Results"
                    description="No results matched your criteria. Please clear and try again"
                  />
                )}
              </div>
            </div>
          </div>
        )}

        {/* ------------------- Pagination ------------------- */}
        {transactions?.data?.length > 0 && transactions?.links?.length > 0 && (
          <div className={styles["attend__pagination"]}>
            <Pagination links={transactions?.links} onChange={handlePageChange} />
          </div>
        )}
      </div>
    </>
  )
}

Deposits.layout = (page: any) => <UserDashboardLayout children={page} title="Transactions - deposits" />

export default Deposits
