/* rsvp.jsx — RSVP form, two variants (one-page + stepper).
 * Receives the guest object from app.jsx; on submit calls weddingAPI.submitRSVP
 * and reports the updated guest back up.
 */

const { useState: useStateR } = React;

const MEALS = [
  { v: "meat",       label: "Meat",       sub: "Roast & trimmings",     glyph: "M" },
  { v: "vegetarian", label: "Vegetarian", sub: "Garden plate",          glyph: "V" },
  { v: "vegan",      label: "Vegan",      sub: "Plant-based menu",      glyph: "G" }
];
const DRINKS = [
  { v: "alcoholic",     label: "Alcoholic",     sub: "Wine, beer, cocktails", glyph: "A" },
  { v: "non-alcoholic", label: "Non-alcoholic", sub: "Soft & mocktails",      glyph: "N" }
];

function Choice({ option, selected, onClick }) {
  return (
    <button
      type="button"
      className={"choice" + (selected ? " selected" : "")}
      onClick={onClick}
    >
      <span className="ico">{option.glyph}</span>
      {option.label}
      <span className="sub">{option.sub}</span>
    </button>
  );
}

function RsvpConfirmed({ guest, onEdit }) {
  const isParty = !!(guest.members && guest.members.length);
  return (
    <div className="rsvp-confirmed">
      <div className="badge">RSVP Received</div>
      <h2 className="serif">
        {isParty
          ? `You're all set, ${guest.name}.`
          : `You're all set, ${guest.name.split(" ")[0]}.`}
      </h2>
      <p style={{ color: "var(--ink-soft)", marginTop: 12, marginBottom: 8 }}>
        We've got your details — see you on the day.
      </p>
      {isParty ? (
        <div className="confirmed-members">
          {guest.members.map((m) => (
            <div key={m.id} className={"confirmed-member" + (m.status === "declined" ? " declined" : "")}>
              <div className="cm-name">
                {m.name}
                {m.isChild ? <span className="md-child">Child</span> : null}
              </div>
              {m.status === "declined" ? (
                <div className="cm-decline" style={{ gridColumn: "span 2" }}>Can't make it</div>
              ) : (
                <React.Fragment>
                  <div className="cm-meal" style={{ textTransform: "capitalize" }}>{m.meal || "—"}</div>
                  <div className="cm-drinks" style={{ textTransform: "capitalize" }}>{m.drinks || "—"}</div>
                  {m.allergies ? (
                    <div className="cm-allergies" style={{ gridColumn: "1 / -1" }}>
                      <span className="cm-allergies-label">Allergies</span>{m.allergies}
                    </div>
                  ) : null}
                </React.Fragment>
              )}
            </div>
          ))}
        </div>
      ) : (
        <div className="summary">
          <div>
            <div className="summary-k">Meal</div>
            <div className="summary-v" style={{ textTransform: "capitalize" }}>{guest.meal || "—"}</div>
          </div>
          <div>
            <div className="summary-k">Drinks</div>
            <div className="summary-v" style={{ textTransform: "capitalize" }}>{guest.drinks || "—"}</div>
          </div>
        </div>
      )}
      {guest.allergies || guest.song || guest.message ? (
        <div className="summary" style={{ marginTop: 14 }}>
          {guest.allergies ? (
            <div style={{ gridColumn: "1 / -1" }}>
              <div className="summary-k">Allergies / dietary notes</div>
              <div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--sans)" }}>{guest.allergies}</div>
            </div>
          ) : null}
          {guest.song ? (
            <div style={{ gridColumn: "1 / -1" }}>
              <div className="summary-k">Song request</div>
              <div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--sans)" }}>{guest.song}</div>
            </div>
          ) : null}
          {guest.message ? (
            <div style={{ gridColumn: "1 / -1" }}>
              <div className="summary-k">Your message</div>
              <div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--serif)", fontStyle: "italic" }}>"{guest.message}"</div>
            </div>
          ) : null}
        </div>
      ) : null}
      <div className="rsvp-actions" style={{ justifyContent: "center" }}>
        <button className="btn-link" onClick={onEdit}>Edit my response</button>
      </div>
    </div>
  );
}

// ── Per-member meal/drinks card ────────────────────────────────────────────
function MemberCard({ member, index, onChange }) {
  const isChild = !!member.isChild;
  const isDeclined = member.status === "declined";
  return (
    <div className={"member-card" + (isDeclined ? " is-declined" : "")}>
      <div className="member-head">
        <div className="member-info">
          <div className="member-num">{String(index + 1).padStart(2, "0")}</div>
          <div>
            <div className="member-name-display">{member.name}</div>
            {isChild ? <div className="member-badge">Child</div> : null}
          </div>
        </div>
        <div className="member-attend">
          <button
            type="button"
            className={"attend-pill" + (!isDeclined ? " active" : "")}
            onClick={() => onChange({ status: "attending" })}
          >
            <span className="dot"></span>Attending
          </button>
          <button
            type="button"
            className={"attend-pill decline" + (isDeclined ? " active" : "")}
            onClick={() => onChange({ status: "declined" })}
          >
            <span className="dot"></span>Can't make it
          </button>
        </div>
      </div>

      {isDeclined ? (
        <div className="member-declined-note">
          We'll save a place in our hearts. No meal needed.
        </div>
      ) : (
        <React.Fragment>
          {isChild ? (
            <div className="member-aside-inline">Drinks set to non-alcoholic automatically.</div>
          ) : null}
          <div className="member-field">
            <span className="field-lbl">Meal preference</span>
            <div className="choice-grid">
              {MEALS.map((m) => (
                <Choice key={m.v} option={m}
                        selected={member.meal === m.v}
                        onClick={() => onChange({ meal: m.v })} />
              ))}
            </div>
          </div>

          {!isChild ? (
            <div className="member-field">
              <span className="field-lbl">Drinks package</span>
              <div className="choice-grid cols-2">
                {DRINKS.map((d) => (
                  <Choice key={d.v} option={d}
                          selected={member.drinks === d.v}
                          onClick={() => onChange({ drinks: d.v })} />
                ))}
              </div>
            </div>
          ) : null}

          <div className="member-field">
            <span className="field-lbl">Allergies or dietary notes for {member.name.split(" ")[0]}</span>
            <input
              className="text-input"
              value={member.allergies || ""}
              placeholder={member.isChild
                ? "Anything the kitchen should know? (optional)"
                : "Optional — e.g. nuts, dairy, gluten"}
              onChange={(e) => onChange({ allergies: e.target.value })}
            />
          </div>
        </React.Fragment>
      )}
    </div>
  );
}

// ── One-page form ──────────────────────────────────────────────────────────
function RsvpOnePage({ guest, onSubmit }) {
  const isParty = !!(guest.members && guest.members.length);
  const [meal, setMeal] = useStateR(guest.meal || "");
  const [drinks, setDrinks] = useStateR(guest.drinks || "");
  const [allergies, setAllergies] = useStateR(guest.allergies || "");
  const [song, setSong] = useStateR(guest.song || "");
  const [message, setMessage] = useStateR(guest.message || "");
  const [status, setStatus] = useStateR(guest.status === "declined" ? "declined" : "attending");
  const [busy, setBusy] = useStateR(false);
  const [members, setMembers] = useStateR(() =>
    isParty
      ? guest.members.map((m) => ({
          ...m,
          status: m.status || "attending",
          meal: m.meal || "",
          drinks: m.isChild ? "non-alcoholic" : (m.drinks || ""),
          allergies: m.allergies || ""
        }))
      : []
  );

  function updateMember(i, patch) {
    setMembers(members.map((m, j) => (j === i ? { ...m, ...patch } : m)));
  }

  const canSubmit = status === "declined" || (isParty
    ? members.filter((m) => m.status !== "declined").every((m) => m.meal && m.drinks)
    : (meal && drinks));

  async function submit() {
    setBusy(true);
    // If everyone in the party individually declined, send the whole party as declined.
    const partyStatus = (isParty && members.length && members.every((m) => m.status === "declined"))
      ? "declined" : status;
    const payload = isParty
      ? { members, allergies, song, message, status: partyStatus }
      : { meal, drinks, allergies, song, message, status };
    const updated = await weddingAPI.submitRSVP(guest.code, payload);
    setBusy(false);
    onSubmit(updated);
  }

  return (
    <div>
      <span className="lbl">RSVP · {guest.code}{isParty ? ` · ${members.length} on this invite` : ""}</span>
      <h2 className="serif">
        {isParty
          ? `Welcome, ${guest.name}.`
          : `Will you join us, ${guest.name.split(" ")[0]}?`}
      </h2>
      <p className="sub">
        {isParty
          ? "We've got everyone on one invite — just pick a meal and drinks for each person."
          : "A couple of quick questions so we can plan the menu."}
      </p>

      <div className="form-row">
        <div>
          <span className="field-lbl">{isParty ? "Will your party be joining us?" : "Attendance"}</span>
          <div className="choice-grid cols-2">
            <button type="button"
              className={"choice" + (status === "attending" ? " selected" : "")}
              onClick={() => setStatus("attending")}>
              <span className="ico">✓</span>
              Joyfully accept
              <span className="sub">{isParty ? "We'll be there" : "I'll be there"}</span>
            </button>
            <button type="button"
              className={"choice" + (status === "declined" ? " selected" : "")}
              onClick={() => setStatus("declined")}>
              <span className="ico">·</span>
              Regretfully decline
              <span className="sub">Can't make it</span>
            </button>
          </div>
        </div>
      </div>

      {status === "attending" ? (
        <React.Fragment>
          {isParty ? (
            <div className="member-cards">
              {members.map((m, i) => (
                <MemberCard
                  key={m.id || i}
                  member={m}
                  index={i}
                  onChange={(patch) => updateMember(i, patch)}
                />
              ))}
            </div>
          ) : (
            <React.Fragment>
              <div className="form-row">
                <div>
                  <span className="field-lbl">Meal preference</span>
                  <div className="choice-grid">
                    {MEALS.map((m) => (
                      <Choice key={m.v} option={m} selected={meal === m.v} onClick={() => setMeal(m.v)} />
                    ))}
                  </div>
                </div>
              </div>
              <div className="form-row">
                <div>
                  <span className="field-lbl">Drinks package</span>
                  <div className="choice-grid cols-2">
                    {DRINKS.map((d) => (
                      <Choice key={d.v} option={d} selected={drinks === d.v} onClick={() => setDrinks(d.v)} />
                    ))}
                  </div>
                </div>
              </div>
            </React.Fragment>
          )}

          {!isParty ? (
            <div className="form-row">
              <div>
                <span className="field-lbl">Allergies or dietary notes</span>
                <input className="text-input" value={allergies}
                       placeholder="Anything we should know? (optional)"
                       onChange={(e) => setAllergies(e.target.value)} />
              </div>
            </div>
          ) : null}
          <div className="form-row cols-2">
            <div>
              <span className="field-lbl">Song request for the DJ</span>
              <input className="text-input" value={song}
                     placeholder="One that'll get you on the dance floor"
                     onChange={(e) => setSong(e.target.value)} />
            </div>
            <div>
              <span className="field-lbl">A short message to us</span>
              <input className="text-input" value={message}
                     placeholder="Optional — but lovely if you do"
                     onChange={(e) => setMessage(e.target.value)} />
            </div>
          </div>
        </React.Fragment>
      ) : (
        <div className="form-row">
          <div>
            <span className="field-lbl">A short note to us</span>
            <textarea className="text-input" value={message}
                      placeholder="We'll miss you — let us know you're thinking of us"
                      onChange={(e) => setMessage(e.target.value)} />
          </div>
        </div>
      )}

      <div className="rsvp-actions">
        <span style={{ fontSize: 11, color: "var(--ink-mute)", letterSpacing: "0.2em", textTransform: "uppercase" }}>
          You can edit this any time
        </span>
        <button className="btn-primary" disabled={!canSubmit || busy} onClick={submit}>
          {busy ? "Sending…" : "Send RSVP"}
        </button>
      </div>
    </div>
  );
}

// ── Stepper form ───────────────────────────────────────────────────────────
function RsvpStepper({ guest, onSubmit }) {
  const isParty = !!(guest.members && guest.members.length);
  const [step, setStep] = useStateR(0);
  const [meal, setMeal] = useStateR(guest.meal || "");
  const [drinks, setDrinks] = useStateR(guest.drinks || "");
  const [allergies, setAllergies] = useStateR(guest.allergies || "");
  const [song, setSong] = useStateR(guest.song || "");
  const [message, setMessage] = useStateR(guest.message || "");
  const [status, setStatus] = useStateR(guest.status === "declined" ? "declined" : "attending");
  const [busy, setBusy] = useStateR(false);
  const [members, setMembers] = useStateR(() =>
    isParty
      ? guest.members.map((m) => ({
          ...m,
          status: m.status || "attending",
          meal: m.meal || "",
          drinks: m.isChild ? "non-alcoholic" : (m.drinks || ""),
          allergies: m.allergies || ""
        }))
      : []
  );

  function updateMember(i, patch) {
    setMembers(members.map((m, j) => (j === i ? { ...m, ...patch } : m)));
  }

  const steps = status === "declined"
    ? ["Attendance", "A note", "Confirm"]
    : isParty
      ? ["Attendance", "Menu", "Extras", "Confirm"]
      : ["Attendance", "Meal", "Drinks", "Extras", "Confirm"];
  const canNext = () => {
    if (steps[step] === "Meal") return !!meal;
    if (steps[step] === "Drinks") return !!drinks;
    if (steps[step] === "Menu") {
      return members.filter((m) => m.status !== "declined").every((m) => m.meal && m.drinks);
    }
    return true;
  };

  async function finish() {
    setBusy(true);
    const partyStatus = (isParty && members.length && members.every((m) => m.status === "declined"))
      ? "declined" : status;
    const payload = isParty
      ? { members, allergies, song, message, status: partyStatus }
      : { meal, drinks, allergies, song, message, status };
    const updated = await weddingAPI.submitRSVP(guest.code, payload);
    setBusy(false);
    onSubmit(updated);
  }

  return (
    <div>
      <span className="lbl">RSVP · {guest.code}{isParty ? ` · ${members.length} on this invite` : ""}</span>
      <h2 className="serif">
        {isParty ? `${guest.name}, please take a moment` : `${guest.name.split(" ")[0]}, please take a moment`}
      </h2>
      <p className="sub">{steps[step]} · step {step + 1} of {steps.length}</p>

      <div className="stepper">
        {steps.map((s, i) => (
          <React.Fragment key={s}>
            <div className={"step " + (i === step ? "active " : "") + (i < step ? "done " : "")}>
              <span className="num">{i + 1}</span>
              <span>{s}</span>
            </div>
            {i < steps.length - 1 ? <span className="sep"></span> : null}
          </React.Fragment>
        ))}
      </div>

      {steps[step] === "Attendance" ? (
        <div className="form-row">
          <div>
            <span className="field-lbl">{isParty ? "Will your party be there?" : "Will you be there?"}</span>
            <div className="choice-grid cols-2">
              <button type="button"
                className={"choice" + (status === "attending" ? " selected" : "")}
                onClick={() => setStatus("attending")}>
                <span className="ico">✓</span>
                Joyfully accept
                <span className="sub">{isParty ? "We'll be there" : "I'll be there"}</span>
              </button>
              <button type="button"
                className={"choice" + (status === "declined" ? " selected" : "")}
                onClick={() => setStatus("declined")}>
                <span className="ico">·</span>
                Regretfully decline
                <span className="sub">Can't make it</span>
              </button>
            </div>
          </div>
        </div>
      ) : null}

      {steps[step] === "Menu" ? (
        <div className="member-cards">
          {members.map((m, i) => (
            <MemberCard key={m.id || i} member={m} index={i}
                        onChange={(patch) => updateMember(i, patch)} />
          ))}
        </div>
      ) : null}

      {steps[step] === "Meal" ? (
        <div className="form-row">
          <div>
            <span className="field-lbl">What would you like to eat?</span>
            <div className="choice-grid">
              {MEALS.map((m) => (
                <Choice key={m.v} option={m} selected={meal === m.v} onClick={() => setMeal(m.v)} />
              ))}
            </div>
            <div style={{ marginTop: 16 }}>
              <span className="field-lbl">Allergies / dietary notes</span>
              <input className="text-input" value={allergies}
                     placeholder="Optional — anything we should know?"
                     onChange={(e) => setAllergies(e.target.value)} />
            </div>
          </div>
        </div>
      ) : null}

      {steps[step] === "Drinks" ? (
        <div className="form-row">
          <div>
            <span className="field-lbl">Drinks package</span>
            <div className="choice-grid cols-2">
              {DRINKS.map((d) => (
                <Choice key={d.v} option={d} selected={drinks === d.v} onClick={() => setDrinks(d.v)} />
              ))}
            </div>
          </div>
        </div>
      ) : null}

      {steps[step] === "Extras" ? (
        <div>
          <div className="form-row">
            <div>
              <span className="field-lbl">Song request for the DJ</span>
              <input className="text-input" value={song}
                     placeholder="One that'll get you on the dance floor"
                     onChange={(e) => setSong(e.target.value)} />
            </div>
          </div>
          <div className="form-row">
            <div>
              <span className="field-lbl">A short message to us</span>
              <textarea className="text-input" value={message}
                        placeholder="Optional — but lovely if you do"
                        onChange={(e) => setMessage(e.target.value)} />
            </div>
          </div>
        </div>
      ) : null}

      {steps[step] === "A note" ? (
        <div className="form-row">
          <div>
            <span className="field-lbl">A short note to us</span>
            <textarea className="text-input" value={message}
                      placeholder="We'll miss you — let us know you're thinking of us"
                      onChange={(e) => setMessage(e.target.value)} />
          </div>
        </div>
      ) : null}

      {steps[step] === "Confirm" ? (
        <div className="form-row">
          {isParty && status === "attending" ? (
            <div>
              <div className="confirmed-members" style={{ marginBottom: 14 }}>
                {members.map((m, i) => (
                  <div key={i} className={"confirmed-member" + (m.status === "declined" ? " declined" : "")}>
                    <div className="cm-name">
                      {m.name}
                      {m.isChild ? <span className="md-child">Child</span> : null}
                    </div>
                    {m.status === "declined" ? (
                      <div className="cm-decline" style={{ gridColumn: "span 2" }}>Can't make it</div>
                    ) : (
                      <React.Fragment>
                        <div className="cm-meal" style={{ textTransform: "capitalize" }}>{m.meal || "—"}</div>
                        <div className="cm-drinks" style={{ textTransform: "capitalize" }}>{m.drinks || "—"}</div>
                        {m.allergies ? (
                          <div className="cm-allergies" style={{ gridColumn: "1 / -1" }}>
                            <span className="cm-allergies-label">Allergies</span>{m.allergies}
                          </div>
                        ) : null}
                      </React.Fragment>
                    )}
                  </div>
                ))}
              </div>
              {allergies || song || message ? (
                <div className="summary" style={{ background: "var(--bg)", padding: 18 }}>
                  {allergies ? <div style={{ gridColumn: "1 / -1" }}><div className="summary-k">Allergies</div><div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--sans)" }}>{allergies}</div></div> : null}
                  {song ?      <div style={{ gridColumn: "1 / -1" }}><div className="summary-k">Song</div><div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--sans)" }}>{song}</div></div> : null}
                  {message ?   <div style={{ gridColumn: "1 / -1" }}><div className="summary-k">Message</div><div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--serif)", fontStyle: "italic" }}>"{message}"</div></div> : null}
                </div>
              ) : null}
            </div>
          ) : (
            <div className="summary" style={{ gridTemplateColumns: "1fr 1fr", display: "grid", gap: 24, background: "var(--bg)", padding: 24 }}>
              <div>
                <div className="summary-k">Attendance</div>
                <div className="summary-v" style={{ textTransform: "capitalize" }}>{status}</div>
              </div>
              {status === "attending" && !isParty ? (
                <React.Fragment>
                  <div>
                    <div className="summary-k">Meal</div>
                    <div className="summary-v" style={{ textTransform: "capitalize" }}>{meal || "—"}</div>
                  </div>
                  <div>
                    <div className="summary-k">Drinks</div>
                    <div className="summary-v" style={{ textTransform: "capitalize" }}>{drinks || "—"}</div>
                  </div>
                  {allergies ? <div style={{ gridColumn: "1 / -1" }}>
                    <div className="summary-k">Allergies</div>
                    <div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--sans)" }}>{allergies}</div>
                  </div> : null}
                  {song ? <div style={{ gridColumn: "1 / -1" }}>
                    <div className="summary-k">Song</div>
                    <div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--sans)" }}>{song}</div>
                  </div> : null}
                </React.Fragment>
              ) : null}
              {message ? <div style={{ gridColumn: "1 / -1" }}>
                <div className="summary-k">Message</div>
                <div className="summary-v" style={{ fontSize: 16, fontFamily: "var(--serif)", fontStyle: "italic" }}>"{message}"</div>
              </div> : null}
            </div>
          )}
        </div>
      ) : null}

      <div className="rsvp-actions">
        {step > 0 ? (
          <button className="btn-link" onClick={() => setStep(step - 1)}>← Back</button>
        ) : <span></span>}
        {step < steps.length - 1 ? (
          <button className="btn-primary" disabled={!canNext()} onClick={() => setStep(step + 1)}>
            Continue
          </button>
        ) : (
          <button className="btn-primary" disabled={busy} onClick={finish}>
            {busy ? "Sending…" : "Confirm & Send"}
          </button>
        )}
      </div>
    </div>
  );
}

// ── Top-level RSVP section ─────────────────────────────────────────────────
function RsvpBlock({ guest, variant, onUpdate }) {
  const [editing, setEditing] = useStateR(guest.status === "pending");
  const isPending = guest.status === "pending";
  const showForm = editing || isPending;

  function handleSubmit(updated) {
    setEditing(false);
    onUpdate(updated);
  }

  return (
    <section className="rsvp-wrap" id="rsvp">
      <div className="container">
        <div className="rsvp-card">
          {showForm ? (
            variant === "stepper"
              ? <RsvpStepper guest={guest} onSubmit={handleSubmit} />
              : <RsvpOnePage guest={guest} onSubmit={handleSubmit} />
          ) : (
            <RsvpConfirmed guest={guest} onEdit={() => setEditing(true)} />
          )}
        </div>
      </div>
    </section>
  );
}

Object.assign(window, { RsvpBlock });

// ── Standalone RSVP intake page (shown to first-time guests before the site) ─
function RsvpGate({ guest, variant, onComplete, onSignOut, site }) {
  function handleSubmit(updated) {
    // small confirmation flash then continue into the main site
    onComplete(updated);
  }
  const dateBits = site.dateLong.split("·").map((s) => s.trim());
  return (
    <div className="rsvp-gate">
      <div className="rsvp-gate-bar">
        <div className="brand">{site.groomFirst} & {site.brideFirst}</div>
        <div className="who">
          <span className="dot"></span>
          <span>{guest.code} · {guest.name.split(" ")[0]}</span>
          <button className="btn-link" onClick={onSignOut} style={{ marginLeft: 8 }}>Sign out</button>
        </div>
      </div>
      <div className="rsvp-gate-body">
        <div className="rsvp-gate-inner">
          <div className="rsvp-gate-head">
            <div className="eyebrow">A warm welcome</div>
            <h1 className="serif">
              {(guest.members && guest.members.length)
                ? <React.Fragment>Hello, {guest.name}<span className="amp"> —</span></React.Fragment>
                : <React.Fragment>Hello {guest.name.split(" ")[0]}<span className="amp"> —</span></React.Fragment>}
            </h1>
            <p className="lede">
              {(guest.members && guest.members.length)
                ? "Before we show you the rest of the invitation, we just need a meal and drinks choice for each person on your invite. It only takes a moment."
                : "Before we show you the rest of the invitation, we just need to know two small things from you. It takes about a minute."}
            </p>
          </div>
          <div className="rsvp-gate-card">
            {variant === "stepper"
              ? <RsvpStepper guest={guest} onSubmit={handleSubmit} />
              : <RsvpOnePage guest={guest} onSubmit={handleSubmit} />}
            <div className="gate-meta">
              <div><div className="k">Date</div><div className="v">{dateBits[0]} {dateBits[1]}</div></div>
              <div><div className="k">Year</div><div className="v">{dateBits[2]}</div></div>
              <div><div className="k">Venue</div><div className="v">Newcastle</div></div>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { RsvpGate });
