"use client";

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

import { saveCallDepositColumnPrefsClient } from "../../_lib/call-deposit-api";
import { useCallDepositList } from "../../_lib/use-call-deposit-list";
import {
  buildCallDepositPageSearchParams,
  DEFAULT_CALL_DEPOSIT_PAGE_SIZE,
  DEFAULT_CALL_DEPOSIT_SORTING,
  EMPTY_CALL_DEPOSIT_FILTERS,
  getCallDepositFilterColumnValue,
  parseCallDepositPageStateFromSearchParams,
  placementDateRangeToCallDepositFilters,
  setCallDepositFilterColumnValue,
} from "../../_lib/call-deposit-filters";
import {
  CALL_DEPOSIT_OPTIONS_COLUMN_ID,
  createCallDepositColumns,
  FALLBACK_CALL_DEPOSIT_GRID_COLUMNS,
} from "./columns";
import { CallDepositDetailSheet } from "./call-deposit-detail-sheet";

export function ListCallDepositsTable() {
  return (
    <CustomerStandardAssetListTable
      title="List Call Deposit"
      emptyMessage="No call deposits found."
      rowsPerPageId="call-deposit-rows-per-page"
      moduleId="call-deposit"
      singularName="Call deposit"
      formConfig={callDepositFormConfig}
      optionsColumnId={CALL_DEPOSIT_OPTIONS_COLUMN_ID}
      fallbackColumns={FALLBACK_CALL_DEPOSIT_GRID_COLUMNS}
      defaultPageSize={DEFAULT_CALL_DEPOSIT_PAGE_SIZE}
      defaultSorting={DEFAULT_CALL_DEPOSIT_SORTING}
      emptyFilters={EMPTY_CALL_DEPOSIT_FILTERS}
      resetColumnPrefsOnRefresh
      useList={useCallDepositList}
      saveColumnPrefs={saveCallDepositColumnPrefsClient}
      parsePageState={parseCallDepositPageStateFromSearchParams}
      buildPageSearchParams={buildCallDepositPageSearchParams}
      getFilterColumnValue={getCallDepositFilterColumnValue}
      setFilterColumnValue={setCallDepositFilterColumnValue}
      placementDateRangeToFilters={placementDateRangeToCallDepositFilters}
      getRangeFilters={(filters) => ({ amount: filters.amount })}
      applyRangeFilter={(filters, field, value) => {
        if (field !== "amount") return filters;
        return { ...filters, amount: value };
      }}
      createColumns={(catalog, onView, onEdit, options) =>
        createCallDepositColumns(catalog, onView, onEdit, {
          listPath: options.listPath,
          pagePermissions: options.pagePermissions,
        })
      }
      DetailSheet={CallDepositDetailSheet}
    />
  );
}
