"use client";

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

import { saveCryptoColumnPrefsClient } from "../../_lib/crypto-api";
import { useCryptoList } from "../../_lib/use-crypto-list";
import {
  buildCryptoPageSearchParams,
  DEFAULT_CRYPTO_PAGE_SIZE,
  DEFAULT_CRYPTO_SORTING,
  EMPTY_CRYPTO_FILTERS,
  getCryptoFilterColumnValue,
  parseCryptoPageStateFromSearchParams,
  placementDateRangeToCryptoFilters,
  setCryptoFilterColumnValue,
} from "../../_lib/crypto-filters";
import {
  createCryptoColumns,
  CRYPTO_OPTIONS_COLUMN_ID,
  FALLBACK_CRYPTO_GRID_COLUMNS,
} from "./columns";
import { CryptoDetailSheet } from "./crypto-detail-sheet";

export function ListCryptoTable() {
  return (
    <CustomerStandardAssetListTable
      title="List Crypto"
      emptyMessage="No crypto assets found."
      rowsPerPageId="crypto-rows-per-page"
      moduleId="crypto"
      singularName="Crypto"
      formConfig={cryptoFormConfig}
      optionsColumnId={CRYPTO_OPTIONS_COLUMN_ID}
      fallbackColumns={FALLBACK_CRYPTO_GRID_COLUMNS}
      defaultPageSize={DEFAULT_CRYPTO_PAGE_SIZE}
      defaultSorting={DEFAULT_CRYPTO_SORTING}
      emptyFilters={EMPTY_CRYPTO_FILTERS}
      useList={useCryptoList}
      saveColumnPrefs={saveCryptoColumnPrefsClient}
      parsePageState={parseCryptoPageStateFromSearchParams}
      buildPageSearchParams={buildCryptoPageSearchParams}
      getFilterColumnValue={getCryptoFilterColumnValue}
      setFilterColumnValue={setCryptoFilterColumnValue}
      placementDateRangeToFilters={placementDateRangeToCryptoFilters}
      createColumns={(catalog, onView, onEdit, options) =>
        createCryptoColumns(catalog, onView, onEdit, {
          listPath: options.listPath,
          pagePermissions: options.pagePermissions,
        })
      }
      DetailSheet={CryptoDetailSheet}
    />
  );
}
