"use client";

import type { CustomerGridColumn } from "@/app/customer/_lib/customer-grid-columns";

import type {
  PortfolioAnalyticsRow,
  PortfolioAnalyticsSortKey,
  PortfolioAnalyticsSortOrder,
} from "./schema";
import { formatAmount } from "./utils";

export const PORTFOLIO_ANALYTICS_PAGE_SIZE_OPTIONS = [50, 100, 200, 500, 1000, 2000] as const;

/** Fixed holdings column order (table is not column-prefs driven). */
export const PORTFOLIO_ANALYTICS_HOLDINGS_COLUMN_KEYS = [
  "assetClass",
  "bank",
  "date",
  "assetType",
  "currency",
  "country",
  "industry",
  "sector",
  "purchaseValueRc",
  "value",
] as const;

export type PortfolioAnalyticsHoldingsColumnKey =
  (typeof PORTFOLIO_ANALYTICS_HOLDINGS_COLUMN_KEYS)[number];

/** Column keys that support a Total toggle in the Fields panel. */
export const PORTFOLIO_ANALYTICS_TOTAL_COLUMN_KEYS = [
  "purchaseValueRc",
  "value",
] as const satisfies readonly PortfolioAnalyticsHoldingsColumnKey[];

export const PORTFOLIO_ANALYTICS_TOTAL_COLUMN_KEYS_SET = new Set<string>(
  PORTFOLIO_ANALYTICS_TOTAL_COLUMN_KEYS,
);

/** Minimal Fields catalog — only columns that expose a Total switch. */
export const PORTFOLIO_ANALYTICS_FIELDS_CATALOG: CustomerGridColumn[] = [
  { key: "purchaseValueRc", label: "Purchase Value RC", defaultVisible: true },
  { key: "value", label: "Value", defaultVisible: true },
];

export const PORTFOLIO_ANALYTICS_LOCKED_KEYS: string[] = PORTFOLIO_ANALYTICS_FIELDS_CATALOG.map(
  (column) => column.key,
);

export const PORTFOLIO_ANALYTICS_TOTALS_CATALOG: CustomerGridColumn[] =
  PORTFOLIO_ANALYTICS_TOTAL_COLUMN_KEYS.map((key) => {
    const column = PORTFOLIO_ANALYTICS_FIELDS_CATALOG.find((entry) => entry.key === key);
    return {
      key,
      label: column?.label ?? key,
      defaultVisible: true,
    };
  });

export function computePortfolioAnalyticsHoldingsTotals(rows: PortfolioAnalyticsRow[]) {
  let purchaseValueRc = 0;
  let value = 0;
  for (const row of rows) {
    purchaseValueRc += row.purchaseValueRc;
    value += row.value;
  }
  return { purchaseValueRc, value };
}

export function sortPortfolioAnalyticsRows(
  rows: PortfolioAnalyticsRow[],
  key: PortfolioAnalyticsSortKey | null,
  order: PortfolioAnalyticsSortOrder,
) {
  if (!key) return rows;
  const sorted = [...rows].sort((a, b) => {
    if (key === "value" || key === "purchaseValueRc") return a[key] - b[key];
    if (key === "date") return a.date.localeCompare(b.date);
    return String(a[key]).localeCompare(String(b[key]));
  });
  return order === "asc" ? sorted : sorted.reverse();
}

export function formatPortfolioCurrencyAmount(code: string, value: number) {
  return `${code} ${formatAmount(value)}`;
}
