"use client";

import type { ColumnDef } from "@tanstack/react-table";

import type {
  CustomerPagePermissions,
  CustomerRowPermissions,
} from "@/app/customer/_lib/customer-api-permissions";
import {
  canCreateSaleFromPage,
  resolveRowActionPermissions,
} from "@/app/customer/_lib/customer-api-permissions";
import { type CustomerGridColumn } from "@/app/customer/_lib/customer-grid-columns";
import {
  assetNumericColumn,
  assetSignedAmountColumn,
  assetTextColumn,
  assetTickerColumn,
  canShowChildAction,
  childFormHref,
  standardAssetLeadColumns,
} from "@/app/customer/_lib/asset-column-builders";
import {
  TransactionRowStockActions,
  type StockChildMenuItem,
} from "@/components/form/transaction-workspace/list-table-form-actions";
import { formatQuantityFixed } from "@/lib/format/numbers";

import type { BondRow } from "./schema";

export {
  FALLBACK_STOCK_GRID_COLUMNS as FALLBACK_BOND_GRID_COLUMNS,
  STOCK_OPTIONS_COLUMN_ID as BOND_OPTIONS_COLUMN_ID,
} from "@/app/customer/[tenant]/stock/_components/list-stocks-table/columns";

export type BondColumnFormatOptions = {
  priceDecimals?: number;
  quantityDecimals?: number;
  listPath?: string;
  pagePermissions?: CustomerPagePermissions;
};

function buildBondChildMenuItems(
  row: BondRow,
  listPath?: string,
  pagePermissions?: CustomerPagePermissions,
): StockChildMenuItem[] {
  if (!listPath || !row.id || row.isBondPurchase === false) {
    return [];
  }

  if (
    !canShowChildAction({
      rowFlag: row.permissions?.create_sale,
      rowUrl: row.saleUrl,
      pageGrant: canCreateSaleFromPage(pagePermissions),
      isPurchase: row.isBondPurchase,
    })
  ) {
    return [];
  }

  return [
    {
      key: "sale",
      label: "Sale",
      href: childFormHref(listPath, row.id),
    },
  ];
}

export function createBondColumns(
  gridColumns: CustomerGridColumn[] | undefined,
  onView: (row: BondRow) => void,
  onEdit: ((row: BondRow) => void) | undefined,
  options: BondColumnFormatOptions = {},
): ColumnDef<BondRow>[] {
  const priceDecimals = options.priceDecimals ?? 2;
  const quantityDecimals = options.quantityDecimals ?? 2;

  const ctx = { gridColumns };

  return [
    ...standardAssetLeadColumns<BondRow>(ctx),
    assetTickerColumn<BondRow>(ctx, {
      id: "security_ticker",
      accessorKey: "ticker",
      label: "Ticker",
      read: (row) => row.ticker,
    }),
    assetTextColumn<BondRow>(ctx, {
      id: "name",
      accessorKey: "name",
      label: "Name",
      read: (row) => row.name,
      className: "min-w-48 text-sm leading-snug",
    }),
    assetTextColumn<BondRow>(ctx, {
      id: "category",
      accessorKey: "type",
      label: "Type",
      read: (row) => row.type,
    }),
    assetTextColumn<BondRow>(ctx, {
      id: "execution_type",
      accessorKey: "executionType",
      label: "Execution Type",
      read: (row) => row.executionType,
    }),
    assetTextColumn<BondRow>(ctx, {
      id: "transaction_type",
      accessorKey: "transaction",
      label: "Transaction",
      read: (row) => row.transaction,
    }),
    assetNumericColumn<BondRow>(ctx, {
      id: "price_formatted",
      accessorKey: "price",
      label: "Price",
      read: (row) => row.price,
      format: (value) => value.toFixed(priceDecimals),
      readDisplay: (row) => row.priceDisplay,
    }),
    assetNumericColumn<BondRow>(ctx, {
      id: "quantity_formatted",
      accessorKey: "quantity",
      label: "Quantity",
      read: (row) => row.quantity,
      format: (value) => formatQuantityFixed(value, quantityDecimals),
      readDisplay: (row) => row.quantityDisplay,
    }),
    assetTextColumn<BondRow>(ctx, {
      id: "currency",
      accessorKey: "currency",
      label: "Currency",
      read: (row) => row.currency,
    }),
    assetSignedAmountColumn<BondRow>(ctx, {
      id: "amount_formatted",
      accessorKey: "amount",
      label: "Amount",
      read: (row) => row.amount,
    }),
    {
      id: "options",
      header: () => <span className="font-medium text-sm">Options</span>,
      cell: ({ row }) => {
        const { canView, canEdit } = resolveRowActionPermissions(
          row.original.permissions as CustomerRowPermissions,
          { allowViewFallback: false, allowEditFallback: false },
        );
        const childMenuItems = buildBondChildMenuItems(
          row.original,
          options.listPath,
          options.pagePermissions,
        );

        if (!canView && !canEdit && childMenuItems.length === 0) {
          return <span className="block text-center text-muted-foreground text-sm">—</span>;
        }

        return (
          <TransactionRowStockActions
            rowName={row.original.name}
            canView={canView}
            canEdit={canEdit && Boolean(onEdit)}
            childMenuItems={childMenuItems}
            onView={() => onView(row.original)}
            onEdit={onEdit ? () => onEdit(row.original) : undefined}
          />
        );
      },
      enableSorting: false,
    },
  ];
}
