"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 {
  labelForGridColumn,
  type CustomerGridColumn,
} from "@/app/customer/_lib/customer-grid-columns";
import {
  canShowChildAction,
  childFormHref,
  displayCell,
} from "@/app/customer/_lib/asset-column-builders";
import { MaturityDateWithNoSaleHint } from "@/app/customer/_lib/maturity-date-with-no-sale-hint";
import { CustomerSortableHeader } from "@/components/customer/customer-table-primitives";
import {
  TransactionRowStockActions,
  type StockChildMenuItem,
} from "@/components/form/transaction-workspace/list-table-form-actions";
import { formatAmount } from "@/lib/format/numbers";
import { formatApiDate } from "@/lib/format/dates";
import { cn } from "@/lib/utils";

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

export const FIXED_DEPOSIT_OPTIONS_COLUMN_ID = "options";

export const FALLBACK_FIXED_DEPOSIT_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: "duration_title", label: "Time Period", defaultVisible: true },
  { key: "maturity_date", label: "Maturity Date", defaultVisible: true },
  { key: "transaction_type", label: "Transaction", defaultVisible: true },
  { key: "currency", label: "Currency", defaultVisible: true },
  { key: "amount_formatted", label: "Deposit Amount", defaultVisible: true },
];

export type FixedDepositColumnFormatOptions = {
  /** Base path for the row's form module (…/fixed-deposit or …/call-deposit). */
  resolveFormListPath?: (row: FixedDepositRow) => string;
  pagePermissions?: CustomerPagePermissions;
};

function isCallDepositRow(row: FixedDepositRow): boolean {
  return row.fType === "Cl" || row.type.toLowerCase().includes("call");
}

/** Yii1 AddButtons: Sale only when t_o_t is Purchase (1453) and create ACL allows. */
function buildDepositChildMenuItems(
  row: FixedDepositRow,
  formListPath: string | undefined,
  pagePermissions?: CustomerPagePermissions,
): StockChildMenuItem[] {
  if (!formListPath || !row.id || row.isDepositPurchase === false) {
    return [];
  }

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

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

/** Fixed/Call deposit columns matching Yii1 Deposit list order (CashDeposit::gridColumns). */
export function createFixedDepositColumns(
  gridColumns: CustomerGridColumn[] | undefined,
  onView: (row: FixedDepositRow) => void,
  onEdit?: (row: FixedDepositRow) => void,
  options: FixedDepositColumnFormatOptions = {},
): ColumnDef<FixedDepositRow>[] {
  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">
          {displayCell(formatApiDate(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: "duration_title",
      accessorKey: "timePeriod",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(
            gridColumns,
            "duration_title",
            "Time Period",
          )}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="whitespace-nowrap text-sm">
          {displayCell(row.original.timePeriod)}
        </span>
      ),
    },
    {
      id: "maturity_date",
      accessorKey: "maturityDate",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(
            gridColumns,
            "maturity_date",
            "Maturity Date",
          )}
          column={column}
        />
      ),
      cell: ({ row }) =>
        isCallDepositRow(row.original) ? (
          <span className="whitespace-nowrap text-sm">—</span>
        ) : (
          <MaturityDateWithNoSaleHint
            date={row.original.maturityDate}
            maturedWithoutSale={row.original.maturityPassedNoSale}
          />
        ),
    },
    {
      id: "transaction_type",
      accessorKey: "transaction",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(
            gridColumns,
            "transaction_type",
            "Transaction",
          )}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="text-sm">{displayCell(row.original.transaction)}</span>
      ),
    },
    {
      id: "currency",
      accessorKey: "currency",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(gridColumns, "currency", "Currency")}
          column={column}
        />
      ),
      cell: ({ row }) => (
        <span className="text-sm">{displayCell(row.original.currency)}</span>
      ),
    },
    {
      id: "amount_formatted",
      accessorKey: "amount",
      header: ({ column }) => (
        <CustomerSortableHeader
          label={labelForGridColumn(
            gridColumns,
            "amount_formatted",
            "Deposit 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"
                : "",
          )}
        >
          {row.original.amountDisplay ?? formatAmount(row.original.amount)}
        </span>
      ),
    },
    {
      id: FIXED_DEPOSIT_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 },
        );
        const formListPath = options.resolveFormListPath?.(row.original);
        const childMenuItems = buildDepositChildMenuItems(
          row.original,
          formListPath,
          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 || row.original.refId}
            canView={canView}
            canEdit={canEdit && Boolean(onEdit)}
            attachmentUrl={row.original.refLink}
            childMenuItems={childMenuItems}
            onView={() => onView(row.original)}
            onEdit={onEdit ? () => onEdit(row.original) : undefined}
          />
        );
      },
      enableSorting: false,
    },
  ];
}
