"use client";

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

import { saveCurrencyConversionColumnPrefsClient } from "../../_lib/currency-conversion-api";
import { useCurrencyConversionList } from "../../_lib/use-currency-conversion-list";
import {
  buildCurrencyConversionPageSearchParams,
  DEFAULT_CURRENCY_CONVERSION_PAGE_SIZE,
  DEFAULT_CURRENCY_CONVERSION_SORTING,
  EMPTY_CURRENCY_CONVERSION_FILTERS,
  getCurrencyConversionFilterColumnValue,
  parseCurrencyConversionPageStateFromSearchParams,
  placementDateRangeToCurrencyConversionFilters,
  setCurrencyConversionFilterColumnValue,
} from "../../_lib/currency-conversion-filters";
import {
  createCurrencyConversionColumns,
  FALLBACK_CURRENCY_CONVERSION_GRID_COLUMNS,
  CURRENCY_CONVERSION_OPTIONS_COLUMN_ID,
} from "./columns";
import { CurrencyConversionDetailSheet } from "./currency-conversion-detail-sheet";

export function ListCurrencyConversionTable() {
  return (
    <CustomerStandardAssetListTable
      title="List Currency Conversion"
      emptyMessage="No currency conversion records found."
      rowsPerPageId="currency-conversion-rows-per-page"
      moduleId="currency-conversion"
      singularName="Currency Conversion"
      formConfig={currencyConversionFormConfig}
      optionsColumnId={CURRENCY_CONVERSION_OPTIONS_COLUMN_ID}
      fallbackColumns={FALLBACK_CURRENCY_CONVERSION_GRID_COLUMNS}
      defaultPageSize={DEFAULT_CURRENCY_CONVERSION_PAGE_SIZE}
      defaultSorting={DEFAULT_CURRENCY_CONVERSION_SORTING}
      emptyFilters={EMPTY_CURRENCY_CONVERSION_FILTERS}
      resetColumnPrefsOnRefresh
      useList={useCurrencyConversionList}
      saveColumnPrefs={saveCurrencyConversionColumnPrefsClient}
      parsePageState={parseCurrencyConversionPageStateFromSearchParams}
      buildPageSearchParams={buildCurrencyConversionPageSearchParams}
      getFilterColumnValue={getCurrencyConversionFilterColumnValue}
      setFilterColumnValue={setCurrencyConversionFilterColumnValue}
      placementDateRangeToFilters={placementDateRangeToCurrencyConversionFilters}
      getRangeFilters={(filters) => ({
        price: filters.currencyBought,
        quantity: filters.currencySold,
      })}
      applyRangeFilter={(filters, field, value) => {
        if (field === "amount" || field === "total") return filters;
        if (field === "price") return { ...filters, currencyBought: value };
        return { ...filters, currencySold: value };
      }}
      createColumns={(catalog, onView, onEdit) =>
        createCurrencyConversionColumns(catalog, onView, onEdit)
      }
      DetailSheet={CurrencyConversionDetailSheet}
    />
  );
}
