// MemberSpace — front-end integration for RDB Backstage.
//
// HOW MEMBERSPACE WORKS (custom HTML site):
//   • One install snippet in the global <head> (see the portal HTML head).
//   • You mark "Protected Member Pages" by URL in the MemberSpace dashboard.
//     Gating is URL-based — so each section ships at its OWN path (/suppliers,
//     /air, …), letting you protect the whole portal now and tier individual
//     sections later without restructuring.
//   • MemberSpace owns auth. Members log in via a MemberSpace Member Link
//     (popup) and manage/leave their session via "My Account" or the floating
//     Member Button. MemberSpace does NOT document a logout function, so we
//     never hardcode one — we link to account/login, MemberSpace does the rest.
//   • Personalization uses data attributes MemberSpace fills in automatically,
//     e.g. data-ms-member-info="firstName".
//
// In the design preview the widget is inert (guarded to the live domain), so
// the prototype falls back to a demo session and stays walkable.
//
// ⚠ ACCOUNT-SPECIFIC: paste the Member Link snippets from your MemberSpace
// dashboard (Customize → Integrations) into the two constants below. They are
// the hrefs the login button and the "My Account" nav item point at.

const MEMBERSPACE_SUBDOMAIN = "rdbbackstage";
const MEMBERSPACE_LIVE_HOSTS = ["rdbbackstage.com"];

// MemberSpace "msopen" Member Links. Login opens the invite-only SIGN-IN popup
// (no signup — membership is invite-only by design). Account opens the member's
// account modal, where MemberSpace's native logout lives — we never hardcode a
// logout URL (logout is also on the floating Member Button).
// MS_LOGIN_HREF is relative so it follows whatever host serves the site
//   (rdb-backstage.pages.dev today, rdbbackstage.com once the custom domain is attached).
const MS_LOGIN_HREF = "?msopen=/member/sign_in"; // sign-in popup
const MS_ACCOUNT_HREF = "?msopen=/member/account";                              // "My Account" (logout lives here / on the floating Member Button)

// Production paths — each section is its own URL so MemberSpace can gate them
// individually. The prototype mirrors these as hash routes (#/suppliers …);
// the live build serves them as real paths (/suppliers …).
const MS_SECTION_PATHS = {
  dashboard: "/", suppliers: "/suppliers", hotels: "/hotel-contacts",
  air: "/air", events: "/events", resources: "/resources",
  information: "/information", forms: "/commission-request",
  vendor: "/new-vendor", feedback: "/feedback", deals: "/partner-deals",
  contact: "/contact",
};

function msIsLiveHost() {
  try {
    return MEMBERSPACE_LIVE_HOSTS.some(h => location.hostname === h || location.hostname.endsWith("." + h));
  } catch (e) { return false; }
}

// True once the MemberSpace widget has actually loaded (production only).
function msIsActive() {
  return !!(window.MemberSpace && typeof window.MemberSpace.getMemberInfo === "function");
}

// Documented MemberSpace "ready" gate for SPAs: the widget sets MemberSpace.ready
// and fires a "MemberSpace.ready" event once it has booted and knows the member's
// login state. Call `cb` as soon as that happens (immediately if already ready).
// Returns an unsubscribe fn. This is the hook a single-page app must wait on
// before deciding whether to show protected content — hash routes are invisible
// to MemberSpace's path-based gating, so login state is the only real gate.
function msOnReady(cb) {
  if (window.MemberSpace && window.MemberSpace.ready) { cb(); return function () {}; }
  const onReady = function () { cb(); };
  window.addEventListener("MemberSpace.ready", onReady);
  return function () { window.removeEventListener("MemberSpace.ready", onReady); };
}

// Authoritative auth snapshot via the documented MemberSpace.getMemberInfo()
// promise, which resolves { isLoggedIn: true, memberInfo: {...} } or
// { isLoggedIn: false }. `ready` is false when the widget isn't active yet (so
// callers know the result is "unknown", not "logged out").
async function msGetAuth() {
  if (!msIsActive()) return { ready: false, isLoggedIn: false, member: null };
  try {
    const info = await window.MemberSpace.getMemberInfo();
    if (!info || !info.isLoggedIn) return { ready: true, isLoggedIn: false, member: null };
    const m = info.memberInfo || {};
    const name = [m.firstName, m.lastName].filter(Boolean).join(" ") || m.name || (m.email || "").split("@")[0] || "Member";
    return {
      ready: true,
      isLoggedIn: true,
      member: {
        name,
        firstName: m.firstName || name.split(" ")[0] || "Member",
        email: m.email || "",
        plan: (m.plans && m.plans[0] && (m.plans[0].name || m.plans[0])) || "Member",
      },
    };
  } catch (e) {
    return { ready: true, isLoggedIn: false, member: null };
  }
}

// Resolve the current member for app-level "is signed in" + greeting fallback.
async function msGetMember() {
  if (!msIsActive()) return null;
  try {
    const info = await window.MemberSpace.getMemberInfo();
    const loggedIn = info && (info.isLoggedIn || info.memberInfo);
    if (!loggedIn) return null;
    const m = info.memberInfo || info;
    const name = [m.firstName, m.lastName].filter(Boolean).join(" ") || m.name || (m.email || "").split("@")[0];
    return { name: name || "Member", firstName: m.firstName || name.split(" ")[0] || "Member", email: m.email || "", plan: (m.plans && m.plans[0] && (m.plans[0].name || m.plans[0])) || "Member" };
  } catch (e) { return null; }
}

// Subscribe to MemberSpace auth events. login/signup → onLogin, logout → onLogout
// (e.g. via the Member Button), and member.info → onInfo (fires when MemberSpace
// reports/updates the current member, keeping app auth state current).
function msOnAuth(handlers) {
  handlers = handlers || {};
  const onIn = e => handlers.onLogin && handlers.onLogin((e && e.detail) || {});
  const onOut = e => handlers.onLogout && handlers.onLogout((e && e.detail) || {});
  const onInfo = e => handlers.onInfo && handlers.onInfo((e && e.detail) || {});
  window.addEventListener("MemberSpace.member.login", onIn);
  window.addEventListener("MemberSpace.member.signup", onIn);
  window.addEventListener("MemberSpace.member.logout", onOut);
  window.addEventListener("MemberSpace.member.info", onInfo);
  return () => {
    window.removeEventListener("MemberSpace.member.login", onIn);
    window.removeEventListener("MemberSpace.member.signup", onIn);
    window.removeEventListener("MemberSpace.member.logout", onOut);
    window.removeEventListener("MemberSpace.member.info", onInfo);
  };
}

Object.assign(window, {
  msIsLiveHost, msIsActive, msOnReady, msGetMember, msGetAuth, msOnAuth,
  MEMBERSPACE_SUBDOMAIN, MS_LOGIN_HREF, MS_ACCOUNT_HREF, MS_SECTION_PATHS,
});
