"use client";

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

import type {
  CustomerRowPermissions,
  StockPagePermissions,
} from "@/app/customer/_lib/customer-api-permissions";
import { resolveRowActionPermissions } from "@/app/customer/_lib/customer-api-permissions";
import { labelForGridColumn, type CustomerGridColumn } from "@/app/customer/_lib/customer-grid-columns";
import { displayCell, standardAssetLeadColumns } from "@/app/customer/_lib/asset-column-builders";
import { CustomerSortableHeader } from "@/components/customer/customer-table-primitives";
import {
  TransactionRowStockActions,
  type StockChildMenuItem,
} from "@/components/form/transaction-workspace/list-table-form-actions";
import { formatAmount, formatQuantityFixed } from "@/lib/format/numbers";
import { cn } from "@/lib/utils";

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

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

export type CommodityColumnFormatOptions = {
  priceDecimals?: number;
  quantityDecimals?: number;
  listPath?: string;
  pagePermissions?: StockPagePermissions;
};

/** Yii1 commodity_sale/create?pid=, commodity_options/create?pid=, commodity_accumulator/create?pid= */
function buildCommodityChildFormHref(
  listPath: string,
  child: "sale" | "option" | "accumulator",
  parentId: string,
): string {
  const params = new URLSearchParams({ pid: parentId.trim() });
  if (child !== "sale") {
    params.set("child", child);
  }
  return `${listPath}/form?${params.toString()}`;
}

/**
 * Yii1 Commodity::getAddButtons —
 * - Purchase (Cd + Buy): Sale / Option / Accumulator
 * - Sale / Others (still Cd / Commodity Sale): Option only
 * - Accumulator (CA): Mark Expired when not redeemed
 * - Commodity Option / Accumulator derivative rows: no Option create from +
 */
function isCommodityCdRow(row: CommodityRow): boolean {
  const typeText = row.type.toLowerCase().trim();
  if (typeText === "co" || typeText === "ca") {
    return false;
  }
  if (typeText.includes("accumulator")) {
    return false;
  }
  // "Commodity Option" but not "Commodity Sale"
  if (typeText.includes("option") && !typeText.includes("sale")) {
    return false;
  }
  return true;
}

function buildCommodityChildMenuItems(
  row: CommodityRow,
  listPath?: string,
  pagePermissions?: StockPagePermissions,
): StockChildMenuItem[] {
  if (row.isRedeemed || /\(redeemed\)/i.test(row.type)) {
    return [];
  }

  if (!listPath || !row.id) {
    return [];
  }

  const items: StockChildMenuItem[] = [];
  const permissions = row.permissions;
  const isPurchase = row.isCommodityPurchase === true;
  const isCd = isCommodityCdRow(row);

  if (isPurchase) {
    const canSale =
      permissions.create_sale === true ||
      Boolean(row.saleUrl) ||
      pagePermissions?.sale_create === true;
    if (canSale) {
      items.push({
        key: "sale",
        label: "Sale",
        href: buildCommodityChildFormHref(listPath, "sale", row.id),
      });
    }
  }

  // Yii1: Option on any Cd row (Purchase, Sale, Others).
  if (isCd) {
    const canOption =
      permissions.create_option === true ||
      Boolean(row.optionUrl) ||
      pagePermissions?.option_create === true;
    if (canOption) {
      items.push({
        key: "option",
        label: "Option",
        href: buildCommodityChildFormHref(listPath, "option", row.id),
      });
    }
  }

  if (isPurchase) {
    const canAccumulator =
      permissions.create_accumulator === true ||
      Boolean(row.accumulatorUrl) ||
      pagePermissions?.accumulator_create === true;
    if (canAccumulator) {
      items.push({
        key: "accumulator",
        label: "Accumulator",
        href: buildCommodityChildFormHref(listPath, "accumulator", row.id),
      });
    }
  }

  const typeText = row.type.toLowerCase();
  const isAccumulatorRow = typeText === "ca" || typeText.includes("accumulator");
  if (
    isAccumulatorRow &&
    (permissions.mark_expired === true || Boolean(row.markExpiredUrl))
  ) {
    const params = new URLSearchParams({
      child: "mark_expired",
      pid: row.id.trim(),
      markAsExpired: row.id.trim(),
    });
    items.push({
      key: "mark_expired",
      label: "Mark Expired",
      href: `${listPath}/form?${params.toString()}`,
    });
  }

  return items;
}



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

  return [
    ...standardAssetLeadColumns<CommodityRow>({ gridColumns }),
    {
      id: "security_ticker",
      accessorKey: "ticker",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "security_ticker", "Ticker")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="whitespace-nowrap font-mono text-xs">{displayCell(row.original.ticker)}</span>
      ),
    },
    {
      id: "name",
      accessorKey: "name",
      header: ({ column }) => (
        <CustomerSortableHeader label={labelForGridColumn(gridColumns, "name", "Name")} column={column} />
      ),
      cell: ({ row }) => <span className="min-w-48 text-sm leading-snug">{row.original.name}</span>,
    },
    {
      id: "category",
      accessorKey: "type",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "category", "Type")}
          column={column}
        />
      ),
      cell: ({ row }) => {
        const typeLabel = row.original.type.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
        const showRedeemed =
          row.original.isRedeemed === true || /\(redeemed\)/i.test(typeLabel);
        const baseType = typeLabel.replace(/\s*\(redeemed\)\s*/gi, "").trim() || typeLabel;

        if (!showRedeemed) {
          return <span className="text-sm">{displayCell(typeLabel)}</span>;
        }

        return (
          <span className="text-sm">
            {baseType}{" "}
            <span className="text-red-600 dark:text-red-400">(Redeemed)</span>
          </span>
        );
      },
    },
    {
      id: "execution_type",
      accessorKey: "executionType",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "execution_type", "Execution Type")}
          column={column}
        />
      ),
      cell: ({ row }) => <span className="text-sm">{row.original.executionType}</span>,
    },
    {
      id: "transaction_type",
      accessorKey: "transaction",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "transaction_type", "Transaction")}
          column={column}
        />
      ),
      cell: ({ row }) => <span className="text-sm">{row.original.transaction}</span>,
    },
    {
      id: "price_formatted",
      accessorKey: "price",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "price_formatted", "Price")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="block text-right text-sm tabular-nums">
          {row.original.priceDisplay ?? row.original.price.toFixed(priceDecimals)}
        </span>
      ),
    },
    {
      id: "quantity_formatted",
      accessorKey: "quantity",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "quantity_formatted", "Quantity")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="block text-right text-sm tabular-nums">
          {row.original.quantityDisplay ?? formatQuantityFixed(row.original.quantity, quantityDecimals)}
        </span>
      ),
    },
    {
      id: "currency",
      accessorKey: "currency",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "currency", "Currency")}
          column={column}
        />
      ),
      cell: ({ row }) => <span className="text-sm">{row.original.currency}</span>,
    },
    {
      id: "amount_formatted",
      accessorKey: "amount",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "amount_formatted", "Amount")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span
          className={cn(
            "block text-right font-medium text-sm tabular-nums",
            row.original.amount < 0
              ? "text-red-600 dark:text-red-400"
              : row.original.amount > 0
                ? "text-green-600 dark:text-green-400"
                : "",
          )}
        >
          {formatAmount(row.original.amount)}
        </span>
      ),
    },
    {
      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 = buildCommodityChildMenuItems(
          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,
    },
  ];
}
