// Suppliers & Partners — live data loader (READ-ONLY) via the same-origin proxy.
// The browser fetches /api/sheet?src=suppliers; the real source is resolved
// server-side (functions/api/sheet.js), so no source ID ships in this bundle.
//
// Data layout (row 1 = title, row 2 = headers, row 3+ = data):
//   A Service Category · B Company Name · C Commission Details · D Website · E Notes
// All columns come across as-is, starting at row 2. The list is small now but
// will grow — the loader takes whatever rows are present.

const SUPPLIER_CSV_URL = "/api/sheet?src=suppliers";

// Real rows from the live sheet — offline fallback seed (keeps the bundle honest).
const SUPPLIER_SEED = [
  { category: "Travel Insurance", company: "Allianz", commission: "Commission Varies by Type", website: "https://agentmaxonline.com/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
  { category: "Trains", company: "Brightline", commission: "", website: "https://www.gobrightline.com/", notes: "Must create account & add travel agency code 109 871 751 to “Profile Settings” to earn commission" },
  { category: "Airline", company: "Delta Airlines", commission: "Non-booking site", website: "https://pro.delta.com/content/agency/us/en/home.html", notes: "Click \"Request New Account\" on home page, then E-Mail Lizzie@rdbvip.com to request approval. Site is exclusively for Air Agents to get assistance with tickets, this is not a booking site." },
  { category: "Hotels, Car Rentals", company: "Expedia TAAP", commission: "Commission Varies, Listed on Site When Searching", website: "https://www.expediataap.com/taap/signin?rurl=/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
  { category: "Tours, Activities", company: "Get Your Guide", commission: "Commission Varies, Listed on Site When Searching", website: "https://partner.getyourguide.com/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
  { category: "Hotels", company: "Hilton Entertainment", commission: "10% on Rooms Marked Commissionable", website: "https://www.hilton.com/en/preferred-rates/hiltonentertainment/", notes: "Must include IATA at check-out" },
  { category: "Hotels", company: "Hyatt Entertainment", commission: "10% on Rooms Marked Commissionable", website: "https://www.hyatt.com/home?corp_id=1018142", notes: "Must include IATA & Corp Code 1018142 at check-out" },
  { category: "Cruises", company: "Norwegian Cruise Line", commission: "", website: "https://norwegiancentral.ncl.com/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
  { category: "Trains", company: "Rail Europe", commission: "Commission Varies, Listed on Site When Searching", website: "https://agent.raileurope.com/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
  { category: "Cruises", company: "Royal Caribbean", commission: "", website: "https://www.cruisingpower.com/", notes: "Sign up at https://www.cruisingpower.com using phone number 9149067188" },
  { category: "Hotels", company: "Tour Connection", commission: "Varies by Hotel", website: "https://www.tourconnection.com/agentadmin/default.aspx", notes: "**Use only to get email addresses. Shared account for all Agents & Keyholders — Login: rob   Password: OSS" },
  { category: "Tours", company: "Tours By Locals", commission: "", website: "https://www.toursbylocals.com/", notes: "" },
  { category: "Theme Parks, Hotels, Activities, Tours", company: "VAX Vacation Access", commission: "Commission Varies, Listed on Site When Searching", website: "https://login.www.vaxvacationaccess.com/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
  { category: "Tours, Hotels, Cruises, Activities", company: "Viator", commission: "Commission Varies, Listed on Site When Searching", website: "https://partners.viator.com/", notes: "E-mail Lizzie@rdbvip.com to request account invite" },
];

// --- CSV parser (quoted fields, embedded commas, doubled quotes, newlines) ---
function parseSupplierCSV(text) {
  const rows = [];
  let row = [], field = "", i = 0, inQ = false;
  while (i < text.length) {
    const c = text[i];
    if (inQ) {
      if (c === '"') {
        if (text[i + 1] === '"') { field += '"'; i += 2; continue; }
        inQ = false; i++; continue;
      }
      field += c; i++; continue;
    }
    if (c === '"') { inQ = true; i++; continue; }
    if (c === ",") { row.push(field); field = ""; i++; continue; }
    if (c === "\r") { i++; continue; }
    if (c === "\n") { row.push(field); rows.push(row); row = []; field = ""; i++; continue; }
    field += c; i++;
  }
  if (field.length || row.length) { row.push(field); rows.push(row); }
  return rows;
}

function buildSupplierRows(cells) {
  const out = [];
  for (const r of cells) {
    const A = (r[0] || "").trim();
    const B = (r[1] || "").trim();
    const C = (r[2] || "").trim();
    const D = (r[3] || "").trim();
    const E = (r[4] || "").trim();
    if (!B) continue;                                  // need a company name
    if (B === "Company Name") continue;                // header row
    if (A === "Suppliers & Partners") continue;        // title row
    out.push({ category: A, company: B, commission: C, website: D, notes: E });
  }
  return out;
}

// Unique category chips, split on commas (a supplier may serve several).
function supplierCategories(rows) {
  const set = new Set();
  rows.forEach(s => (s.category || "").split(",").forEach(c => { const t = c.trim(); if (t) set.add(t); }));
  return ["All", ...Array.from(set).sort()];
}

let _suppliersPromise = null;
function loadSuppliers() {
  if (_suppliersPromise) return _suppliersPromise;
  _suppliersPromise = (async () => {
    const ctrl = typeof AbortController !== "undefined" ? new AbortController() : null;
    const t = ctrl ? setTimeout(() => ctrl.abort(), 9000) : null;
    try {
      const res = await fetch(SUPPLIER_CSV_URL, ctrl ? { signal: ctrl.signal } : undefined);
      if (!res.ok) throw new Error("HTTP " + res.status);
      const text = await res.text();
      const rows = buildSupplierRows(parseSupplierCSV(text));
      if (!rows.length) throw new Error("empty sheet");
      return rows;
    } finally { if (t) clearTimeout(t); }
  })();
  return _suppliersPromise;
}

function useSuppliers() {
  const [s, setS] = React.useState(() => ({ rows: SUPPLIER_SEED, status: "loading" }));
  React.useEffect(() => {
    let alive = true;
    loadSuppliers()
      .then(rows => { if (alive) { window.SUPPLIER_ROWS = rows; setS({ rows, status: "live" }); } })
      .catch(() => { if (alive) setS({ rows: SUPPLIER_SEED, status: "sample" }); });
    return () => { alive = false; };
  }, []);
  return s;
}

window.SUPPLIER_SEED = SUPPLIER_SEED;
window.SUPPLIER_ROWS = SUPPLIER_SEED;
Object.assign(window, { loadSuppliers, useSuppliers, supplierCategories });
