const { useState, useMemo, useEffect, useRef, Fragment } = React;

// ───────────────────── helpers ─────────────────────
window.formatRange = function(product) {
  const r = product.targetReturn;
  if (r.irr) return { lo: r.irr[0], hi: r.irr[1], unit: "%", kind: "irr" };
  if (r.yield) return { lo: r.yield[0], hi: r.yield[1], unit: "%", kind: "yield" };
  if (r.multiple) return { lo: r.multiple[0], hi: r.multiple[1], unit: "x", kind: "multiple" };
  return null;
};

window.formatRangeStr = function(product) {
  const r = window.formatRange(product);
  if (!r) return "—";
  if (r.kind === "multiple") return `${r.lo.toFixed(2)}–${r.hi.toFixed(2)}${r.unit}`;
  return `${r.lo}–${r.hi}${r.unit}`;
};

window.returnKindLabel = function(product, t) {
  const r = product.targetReturn;
  if (r.irr) return t.targetIrr;
  if (r.yield) return t.targetYield;
  if (r.multiple) return t.targetMultiple;
  return "";
};

window.formatCurrency = function(amount) {
  return new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0 }).format(amount);
};

// Prefer full number ($50,000); abbreviate ($50K / $2M) only when caller requests
window.formatCurrencyShort = function(amount) {
  if (amount >= 1_000_000) {
    const m = amount / 1_000_000;
    return `$${m % 1 === 0 ? m.toFixed(0) : m.toFixed(1)}M`;
  }
  if (amount >= 1_000) return `$${Math.round(amount/1000)}K`;
  return `$${amount}`;
};

const tierByStackPosition = { 0: "senior-debt", 1: "mezzanine", 2: "preferred-equity", 3: "common-equity", 4: "lp-syndicate" };
// Map stack positions more reasonably: mezz-equity (pos 2) → mezzanine actually, preferred doesn't exist in data
// Actually the data uses stackPosition 0,2,3,4 — we'll remap for clearer presentation:
window.productTier = function(product) {
  // force by type to get a cleaner 5-row visual
  switch (product.type) {
    case "construction-debt": return "senior-debt";
    case "mezz-equity": return "mezzanine";
    case "long-term-hold": return "preferred-equity";
    case "portfolio-equity": return "common-equity";
    case "pre-sale": return "lp-syndicate";
    default: return tierByStackPosition[product.stackPosition] || "common-equity";
  }
};

window.buildColumns = function(products, profile) {
  const projectOrder = [];
  const map = new Map();
  for (const p of products) {
    if (!map.has(p.project)) {
      projectOrder.push(p.project);
      map.set(p.project, { name: p.project, city: p.projectCity, kind: p.projectKind, status: p.projectStatus, image: p.projectImage, cells: new Map(), products: [] });
    }
    const col = map.get(p.project);
    const tier = window.productTier(p);
    const el = window.checkEligibility(p, profile);
    col.cells.set(tier, { product: p, eligible: el.eligible, reasons: el.reasons, unanswered: el.unanswered });
    col.products.push(p);
  }
  return projectOrder.map(n => map.get(n));
};

window.countProfile = function(profile) {
  return Object.values(profile || {}).filter(v => v != null).length;
};
