"use client";

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

import { saveFxAccumulatorColumnPrefsClient } from "../../_lib/fx-accumulator-api";
import { useFxAccumulatorList } from "../../_lib/use-fx-accumulator-list";
import {
  buildFxAccumulatorPageSearchParams,
  DEFAULT_FX_ACCUMULATOR_PAGE_SIZE,
  DEFAULT_FX_ACCUMULATOR_SORTING,
  EMPTY_FX_ACCUMULATOR_FILTERS,
  getFxAccumulatorFilterColumnValue,
  parseFxAccumulatorPageStateFromSearchParams,
  placementDateRangeToFxAccumulatorFilters,
  setFxAccumulatorFilterColumnValue,
} from "../../_lib/fx-accumulator-filters";
import {
  createFxAccumulatorColumns,
  FALLBACK_FX_ACCUMULATOR_GRID_COLUMNS,
  FX_ACCUMULATOR_OPTIONS_COLUMN_ID,
} from "./columns";
import { FxAccumulatorDetailSheet } from "./fx-accumulator-detail-sheet";

export function ListFxAccumulatorsTable() {
  return (
    <CustomerStandardAssetListTable
      title="List FX Accumulator"
      emptyMessage="No FX accumulators found."
      rowsPerPageId="fx-accumulator-rows-per-page"
      moduleId="fx-accumulator"
      singularName="FX accumulator"
      formConfig={fxAccumulatorFormConfig}
      optionsColumnId={FX_ACCUMULATOR_OPTIONS_COLUMN_ID}
      fallbackColumns={FALLBACK_FX_ACCUMULATOR_GRID_COLUMNS}
      defaultPageSize={DEFAULT_FX_ACCUMULATOR_PAGE_SIZE}
      defaultSorting={DEFAULT_FX_ACCUMULATOR_SORTING}
      emptyFilters={EMPTY_FX_ACCUMULATOR_FILTERS}
      resetColumnPrefsOnRefresh
      useList={useFxAccumulatorList}
      saveColumnPrefs={saveFxAccumulatorColumnPrefsClient}
      parsePageState={parseFxAccumulatorPageStateFromSearchParams}
      buildPageSearchParams={buildFxAccumulatorPageSearchParams}
      getFilterColumnValue={getFxAccumulatorFilterColumnValue}
      setFilterColumnValue={setFxAccumulatorFilterColumnValue}
      placementDateRangeToFilters={placementDateRangeToFxAccumulatorFilters}
      getRangeFilters={(filters) => ({
        quantity: filters.quantity,
        amount: filters.amount,
      })}
      applyRangeFilter={(filters, field, value) => {
        if (field === "price" || field === "total") return filters;
        return { ...filters, [field]: value };
      }}
      createColumns={(catalog, onView) => createFxAccumulatorColumns(catalog, onView)}
      DetailSheet={FxAccumulatorDetailSheet}
    />
  );
}
