"use client";

import { cashWithdrawalFormConfig } from "@/components/form/transaction-workspace/module-configs";
import { CustomerStandardAssetListTable } from "@/app/customer/_components/customer-standard-asset-list-table";

import { saveCashWithdrawalColumnPrefsClient } from "../../_lib/cash-withdrawal-api";
import { useCashWithdrawalList } from "../../_lib/use-cash-withdrawal-list";
import {
  buildCashWithdrawalPageSearchParams,
  DEFAULT_CASH_WITHDRAWAL_PAGE_SIZE,
  DEFAULT_CASH_WITHDRAWAL_SORTING,
  EMPTY_CASH_WITHDRAWAL_FILTERS,
  getCashWithdrawalFilterColumnValue,
  parseCashWithdrawalPageStateFromSearchParams,
  placementDateRangeToCashWithdrawalFilters,
  setCashWithdrawalFilterColumnValue,
} from "../../_lib/cash-withdrawal-filters";
import {
  createCashWithdrawalColumns,
  FALLBACK_CASH_WITHDRAWAL_GRID_COLUMNS,
  CASH_WITHDRAWAL_OPTIONS_COLUMN_ID,
} from "./columns";
import { CashWithdrawalDetailSheet } from "./cash-withdrawal-detail-sheet";

export function ListCashWithdrawalTable() {
  return (
    <CustomerStandardAssetListTable
      title="List Cash Withdrawal"
      emptyMessage="No cash withdrawal records found."
      rowsPerPageId="cash-withdrawal-rows-per-page"
      moduleId="cash-withdrawal"
      singularName="Cash Withdrawal"
      formConfig={cashWithdrawalFormConfig}
      optionsColumnId={CASH_WITHDRAWAL_OPTIONS_COLUMN_ID}
      fallbackColumns={FALLBACK_CASH_WITHDRAWAL_GRID_COLUMNS}
      defaultPageSize={DEFAULT_CASH_WITHDRAWAL_PAGE_SIZE}
      defaultSorting={DEFAULT_CASH_WITHDRAWAL_SORTING}
      emptyFilters={EMPTY_CASH_WITHDRAWAL_FILTERS}
      resetColumnPrefsOnRefresh
      useList={useCashWithdrawalList}
      saveColumnPrefs={saveCashWithdrawalColumnPrefsClient}
      parsePageState={parseCashWithdrawalPageStateFromSearchParams}
      buildPageSearchParams={buildCashWithdrawalPageSearchParams}
      getFilterColumnValue={getCashWithdrawalFilterColumnValue}
      setFilterColumnValue={setCashWithdrawalFilterColumnValue}
      placementDateRangeToFilters={placementDateRangeToCashWithdrawalFilters}
      getRangeFilters={(filters) => ({ amount: filters.amount })}
      applyRangeFilter={(filters, field, value) => {
        if (field !== "amount") return filters;
        return { ...filters, amount: value };
      }}
      createColumns={(catalog, onView, onEdit) =>
        createCashWithdrawalColumns(catalog, onView, onEdit)
      }
      DetailSheet={CashWithdrawalDetailSheet}
    />
  );
}
