"use client";

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

import { useFixedDepositList } from "../../_lib/use-fixed-deposit-list";
import { saveFixedDepositColumnPrefsClient } from "../../_lib/fixed-deposit-api";
import {
  buildFixedDepositPageSearchParams,
  DEFAULT_FIXED_DEPOSIT_PAGE_SIZE,
  DEFAULT_FIXED_DEPOSIT_SORTING,
  EMPTY_FIXED_DEPOSIT_FILTERS,
  getFixedDepositFilterColumnValue,
  parseFixedDepositPageStateFromSearchParams,
  placementDateRangeToFixedDepositFilters,
  setFixedDepositFilterColumnValue,
} from "../../_lib/fixed-deposit-filters";
import {
  createFixedDepositColumns,
  FALLBACK_FIXED_DEPOSIT_GRID_COLUMNS,
  FIXED_DEPOSIT_OPTIONS_COLUMN_ID,
} from "./columns";
import { FixedDepositDetailSheet } from "./fixed-deposit-detail-sheet";
import { FixedDepositListFilterRow } from "./fixed-deposit-list-filter-row";

export function ListFixedDepositsTable() {
  return (
    <CustomerStandardAssetListTable
      title="List Fixed Deposit"
      emptyMessage="No fixed deposits found."
      rowsPerPageId="fixed-deposit-rows-per-page"
      moduleId="fixed-deposit"
      singularName="Fixed deposit"
      formConfig={fixedDepositFormConfig}
      optionsColumnId={FIXED_DEPOSIT_OPTIONS_COLUMN_ID}
      fallbackColumns={FALLBACK_FIXED_DEPOSIT_GRID_COLUMNS}
      defaultPageSize={DEFAULT_FIXED_DEPOSIT_PAGE_SIZE}
      defaultSorting={DEFAULT_FIXED_DEPOSIT_SORTING}
      emptyFilters={EMPTY_FIXED_DEPOSIT_FILTERS}
      useList={useFixedDepositList}
      saveColumnPrefs={saveFixedDepositColumnPrefsClient}
      parsePageState={parseFixedDepositPageStateFromSearchParams}
      buildPageSearchParams={buildFixedDepositPageSearchParams}
      getFilterColumnValue={getFixedDepositFilterColumnValue}
      setFilterColumnValue={setFixedDepositFilterColumnValue}
      placementDateRangeToFilters={placementDateRangeToFixedDepositFilters}
      // Deposits carry no price/quantity columns — amount is the only range filter.
      getRangeFilters={(filters) => ({ amount: filters.amount })}
      applyRangeFilter={(filters, field, value) =>
        field === "amount" ? { ...filters, amount: value } : filters
      }
      createColumns={(catalog, onView, onEdit, options) =>
        createFixedDepositColumns(catalog, onView, onEdit, {
          resolveFormListPath: () => options.listPath,
          pagePermissions: options.pagePermissions,
        })
      }
      DetailSheet={FixedDepositDetailSheet}
      showFilterRow={false}
      filterRow={(ctx) => (
        <FixedDepositListFilterRow
          filterOptions={ctx.filterOptions}
          placementDateRange={ctx.placementDateRange}
          onPlacementDateRangeChange={ctx.onPlacementDateRangeChange}
          getFilterValue={ctx.getFilterValue}
          onColumnFilterChange={ctx.onColumnFilterChange}
          amountRange={ctx.filters.amount ?? {}}
          onAmountRangeChange={(value) => ctx.onRangeFilterChange("amount", value)}
        />
      )}
    />
  );
}
