"use client";

import type { ColumnDef } from "@tanstack/react-table";
import { displayCell } from "@/app/customer/_lib/asset-column-builders";

import type { CustomerRowPermissions } 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 { CustomerSortableHeader } from "@/components/customer/customer-table-primitives";
import { TransactionRowPermissionActions } from "@/components/form/transaction-workspace/list-table-form-actions";
import { formatApiDate } from "@/lib/format/dates";

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

export const SWAPS_OPTIONS_COLUMN_ID = "options";

export const FALLBACK_SWAPS_GRID_COLUMNS: CustomerGridColumn[] = [
  { key: "uid_title", label: "Ref. ID", defaultVisible: true },
  { key: "placement_date", label: "Placement Date", defaultVisible: true },
  { key: "category", label: "Type", defaultVisible: true },
  { key: "bank", label: "Bank", defaultVisible: true },
  { key: "currency_bought", label: "Currency Bought", defaultVisible: true },
  { key: "currency_sold", label: "Currency Sold", defaultVisible: true },
  { key: "rate", label: "RATE", defaultVisible: true },
];


/** Swaps / Derivatives cash columns matching Yii1 list order (see Swaps::gridColumns). */
export function createSwapsColumns(
  gridColumns: CustomerGridColumn[] | undefined,
  onView: (row: SwapRow) => void,
  onEdit?: (row: SwapRow) => void,
): ColumnDef<SwapRow>[] {
  return [
    {
      id: "uid_title",
      accessorKey: "refId",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "uid_title", "Ref. ID")}
          column={column}
        />
      ),
      cell: ({ row }) => <span className="whitespace-nowrap text-sm">{row.original.refId}</span>,
    },
    {
      id: "placement_date",
      accessorKey: "placementDate",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "placement_date", "Placement Date")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="whitespace-nowrap text-sm">
          {formatApiDate(row.original.placementDate, "dd MMM yyyy", row.original.placementDate)}
        </span>
      ),
    },
    {
      id: "category",
      accessorKey: "type",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "category", "Type")}
          column={column}
        />
      ),
      cell: ({ row }) => <span className="text-sm">{displayCell(row.original.type)}</span>,
    },
    {
      id: "bank",
      accessorKey: "bank",
      header: ({ column }) => (
        <CustomerSortableHeader label={labelForGridColumn(gridColumns, "bank", "Bank")} column={column} />
      ),
      cell: ({ row }) => <span className="text-sm">{displayCell(row.original.bank)}</span>,
    },
    {
      id: "currency_bought",
      accessorKey: "currencyBought",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "currency_bought", "Currency Bought")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="block text-right text-sm tabular-nums">{displayCell(row.original.currencyBought)}</span>
      ),
    },
    {
      id: "currency_sold",
      accessorKey: "currencySold",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "currency_sold", "Currency Sold")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="block text-right text-sm tabular-nums">{displayCell(row.original.currencySold)}</span>
      ),
    },
    {
      id: "rate",
      accessorKey: "rate",
      header: ({ column }) => (
        <CustomerSortableHeader label={labelForGridColumn(gridColumns, "rate", "RATE")} column={column} />
      ),
      cell: ({ row }) => (
        <span className="block text-right text-xs leading-snug tabular-nums">
          {row.original.rateLine1 && row.original.rateLine2 ? (
            <>
              {row.original.rateLine1}
              <br />
              {row.original.rateLine2}
            </>
          ) : (
            displayCell(row.original.rate.replace(/<[^>]+>/g, " "))
          )}
        </span>
      ),
    },
    {
      id: SWAPS_OPTIONS_COLUMN_ID,
      header: () => <span className="font-medium text-sm">Options</span>,
      cell: ({ row }) => {
        const { canView, canEdit } = resolveRowActionPermissions(
          row.original.permissions as CustomerRowPermissions,
          { allowViewFallback: false, allowEditFallback: false },
        );

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

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