/*
  Coast Paid Activities - v2 application logic.

  Source of truth lives here, NOT in Cornerstone. Published (base64-encoded)
  to its own unlisted WordPress data page via coast_paid_activities_v2_publish.py,
  and fetched/injected at runtime by the tiny stub
  (coast-paid-activities-v2-stub.html) that's the only thing actually pasted
  into Cornerstone. Edit this file + re-run the publish script to ship
  changes - no Cornerstone save required, so the recurring [cs_content_seo]
  leak bug (see the ops doc) never gets triggered by routine widget updates.

  Builds its own DOM into #cpa-root (provided by the stub) instead of
  expecting static markup to already exist on the page - this is what lets
  the stub stay permanent even as the widget's structure evolves. Logic is
  otherwise a straight port of the v1 widget (coast-paid-activities.html) as
  of 2026-07-14 - this is a lift-and-shift, not a redesign.
*/
(function () {
  // ---- Easy-to-edit config ----------------------------------------------
  // Points at the LIVE schedule-data page - a read-only public fetch, same
  // one the v1 widget already uses safely. No write access, so reusing it
  // here (even while v2 itself is still in a sandbox test page) is safe.
  var DATA_URL = "https://camps.wol.org/wp-json/wp/v2/pages/10032";
  var REFRESH_MS = 10 * 60 * 1000; // 10 minutes
  var DAY_ORDER = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
  var STORAGE_KEY = "cpa_last_good_data";
  var FAVORITES_KEY = "cpa_favorites";
  var SHOW_EXTRA_KEY = "cpa_show_extra";
  // -------------------------------------------------------------------------

  var STAR_FILLED = '<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M12 2l2.9 6.9 7.1.6-5.4 4.7 1.6 7.1L12 17.3 5.8 21.3l1.6-7.1L2 9.5l7.1-.6z"/></svg>';
  var STAR_OUTLINE = '<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M12 2l2.9 6.9 7.1.6-5.4 4.7 1.6 7.1L12 17.3 5.8 21.3l1.6-7.1L2 9.5l7.1-.6z"/></svg>';
  var CHEVRON_ICON = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg>';
  var WEEKDAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

  var state = { data: null, mode: "cabins", search: "", showExtra: getShowExtra(), currentName: null };

  // ---- Build the widget's DOM into #cpa-root (mount point from the stub) --
  function buildSkeleton(root) {
    root.innerHTML =
      '<div id="cpa-app">' +
        '<div id="cpa-card">' +
          '<h1 id="cpa-title">Coast Paid Activities</h1>' +
          '<div id="cpa-updated"></div>' +
          '<div id="cpa-status"></div>' +
          '<div id="cpa-coming-soon" hidden>' +
            '<div class="cpa-coming-soon-title">Coming Soon</div>' +
            '<div class="cpa-coming-soon-body">The paid activity schedule isn&#39;t posted yet. Check back shortly.</div>' +
          '</div>' +
          '<div id="cpa-picker">' +
            '<div class="cpa-tabs">' +
              '<button type="button" data-mode="cabins" class="cpa-tab active">By Cabin</button>' +
              '<button type="button" data-mode="groups" class="cpa-tab">By Group</button>' +
            '</div>' +
            '<label class="cpa-toggle-row">' +
              '<input type="checkbox" class="cpa-extra-toggle">' +
              '<span class="cpa-extra-toggle-label"></span>' +
            '</label>' +
            '<input type="search" id="cpa-search" placeholder="Search...">' +
            '<ul id="cpa-list"></ul>' +
          '</div>' +
          '<div id="cpa-detail" hidden>' +
            '<div class="cpa-detail-header-row">' +
              '<button type="button" id="cpa-back">&larr; Back</button>' +
              '<label class="cpa-toggle-row">' +
                '<input type="checkbox" class="cpa-extra-toggle">' +
                '<span class="cpa-extra-toggle-label"></span>' +
              '</label>' +
            '</div>' +
            '<h2 id="cpa-detail-title"></h2>' +
            '<div id="cpa-detail-content"></div>' +
          '</div>' +
        '</div>' +
      '</div>';
  }

  // ---- "Show church/cabin" toggle (localStorage, one global setting) -----
  function getShowExtra() {
    return localStorage.getItem(SHOW_EXTRA_KEY) === "1";
  }

  function setShowExtra(value) {
    localStorage.setItem(SHOW_EXTRA_KEY, value ? "1" : "0");
    state.showExtra = value;
    syncExtraToggleUI();
    if (!document.getElementById("cpa-detail").hidden && state.currentName) {
      showDetail(state.currentName);
    }
  }

  function extraLabelText() {
    return state.mode === "cabins" ? "Show group name" : "Show cabin";
  }

  function syncExtraToggleUI() {
    Array.prototype.forEach.call(document.querySelectorAll(".cpa-extra-toggle"), function (cb) {
      cb.checked = state.showExtra;
    });
    Array.prototype.forEach.call(document.querySelectorAll(".cpa-extra-toggle-label"), function (label) {
      label.textContent = extraLabelText();
    });
  }

  // ---- Favorites (localStorage, per-browser/per-device, not synced) ------
  function getFavorites() {
    try {
      var parsed = JSON.parse(localStorage.getItem(FAVORITES_KEY) || "{}");
      if (!Array.isArray(parsed.cabins)) parsed.cabins = [];
      if (!Array.isArray(parsed.groups)) parsed.groups = [];
      return parsed;
    } catch (e) {
      return { cabins: [], groups: [] };
    }
  }

  function isFavorited(mode, name) {
    return getFavorites()[mode].indexOf(name) !== -1;
  }

  function toggleFavorite(mode, name) {
    var favs = getFavorites();
    var idx = favs[mode].indexOf(name);
    if (idx === -1) favs[mode].push(name);
    else favs[mode].splice(idx, 1);
    localStorage.setItem(FAVORITES_KEY, JSON.stringify(favs));
  }

  function decodePayload(body) {
    var raw = (body.content && body.content.rendered) || "";
    var stripped = raw.replace(/<[^>]+>/g, "").trim();
    var ta = document.createElement("textarea");
    ta.innerHTML = stripped;
    var b64 = ta.value.trim();
    var binary = atob(b64);
    var bytes = new Uint8Array(binary.length);
    for (var i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
    var jsonText = new TextDecoder("utf-8").decode(bytes);
    return JSON.parse(jsonText);
  }

  function fetchData() {
    var url = DATA_URL + "?_=" + Date.now();
    return fetch(url)
      .then(function (r) {
        if (!r.ok) throw new Error("HTTP " + r.status);
        return r.json();
      })
      .then(decodePayload);
  }

  function setStatus(msg) {
    var el = document.getElementById("cpa-status");
    el.textContent = msg;
    el.style.display = msg ? "block" : "none";
  }

  function formatUpdated(iso) {
    if (!iso) return "";
    var d = new Date(iso);
    return "Last updated " + d.toLocaleString(undefined, {
      month: "short", day: "numeric", hour: "numeric", minute: "2-digit"
    });
  }

  function loadData(isInitial) {
    if (isInitial) {
      var cached = localStorage.getItem(STORAGE_KEY);
      if (cached) {
        try {
          state.data = JSON.parse(cached);
          renderComingSoonOrList();
        } catch (e) { /* ignore corrupt cache */ }
      }
    }

    fetchData()
      .then(function (data) {
        state.data = data;
        localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
        setStatus("");
        renderComingSoonOrList();
      })
      .catch(function (err) {
        console.error("Coast Paid Activities: fetch failed", err);
        if (state.data) {
          setStatus("Couldn't refresh just now - showing the last saved schedule.");
        } else {
          setStatus("Unable to load the schedule right now. Please try again shortly.");
        }
      });
  }

  function appendSectionLabel(listEl, text) {
    var li = document.createElement("li");
    li.className = "cpa-section-label";
    li.textContent = text;
    listEl.appendChild(li);
  }

  function appendListRow(listEl, name) {
    var li = document.createElement("li");
    li.className = "cpa-list-row";

    var favorited = isFavorited(state.mode, name);
    var starBtn = document.createElement("button");
    starBtn.type = "button";
    starBtn.className = "cpa-star" + (favorited ? " is-favorited" : "");
    starBtn.innerHTML = favorited ? STAR_FILLED : STAR_OUTLINE;
    starBtn.setAttribute("aria-label", favorited ? "Remove " + name + " from favorites" : "Add " + name + " to favorites");
    starBtn.addEventListener("click", function (e) {
      e.stopPropagation();
      toggleFavorite(state.mode, name);
      renderList();
    });

    var nameBtn = document.createElement("button");
    nameBtn.type = "button";
    nameBtn.className = "cpa-list-item";
    nameBtn.textContent = name;
    nameBtn.addEventListener("click", function () { showDetail(name); });

    li.appendChild(starBtn);
    li.appendChild(nameBtn);
    listEl.appendChild(li);
  }

  function renderComingSoonOrList() {
    var comingSoonEl = document.getElementById("cpa-coming-soon");
    var pickerEl = document.getElementById("cpa-picker");
    var detailEl = document.getElementById("cpa-detail");
    var isEmpty = !!(state.data && state.data.record_count === 0);

    comingSoonEl.hidden = !isEmpty;
    pickerEl.hidden = isEmpty;
    if (isEmpty) detailEl.hidden = true;

    document.getElementById("cpa-updated").textContent = formatUpdated(state.data && state.data.generated_at);

    if (!isEmpty) renderList();
  }

  function renderList() {
    var listEl = document.getElementById("cpa-list");
    listEl.innerHTML = "";
    if (!state.data) return;

    var source = state.mode === "cabins" ? state.data.cabins : state.data.groups;
    var names = Object.keys(source).sort();
    var q = state.search.trim().toLowerCase();
    if (q) names = names.filter(function (n) { return n.toLowerCase().indexOf(q) !== -1; });

    if (!names.length) {
      var empty = document.createElement("li");
      empty.className = "cpa-empty";
      empty.textContent = "No matches.";
      listEl.appendChild(empty);
    } else {
      var favSet = getFavorites()[state.mode];
      var favoriteNames = names.filter(function (n) { return favSet.indexOf(n) !== -1; });
      var otherNames = names.filter(function (n) { return favSet.indexOf(n) === -1; });

      if (favoriteNames.length) {
        appendSectionLabel(listEl, "Favorites");
        favoriteNames.forEach(function (name) { appendListRow(listEl, name); });
        if (otherNames.length) appendSectionLabel(listEl, "All");
      }
      otherNames.forEach(function (name) { appendListRow(listEl, name); });
    }

    document.getElementById("cpa-updated").textContent = formatUpdated(state.data.generated_at);
  }

  function showDetail(name) {
    state.currentName = name;
    var source = state.mode === "cabins" ? state.data.cabins : state.data.groups;
    var entries = source[name] || [];

    document.getElementById("cpa-detail-title").textContent = name;
    syncExtraToggleUI();
    var contentEl = document.getElementById("cpa-detail-content");
    contentEl.innerHTML = "";

    var byDay = {};
    entries.forEach(function (e) {
      (byDay[e.day] = byDay[e.day] || []).push(e);
    });

    var todayName = WEEKDAY_NAMES[new Date().getDay()];
    var defaultExpandDay = byDay[todayName] ? todayName : null;
    if (!defaultExpandDay) {
      defaultExpandDay = DAY_ORDER.filter(function (d) { return byDay[d]; })[0] || null;
    }

    var anyRendered = false;
    DAY_ORDER.forEach(function (day) {
      if (!byDay[day]) return;
      anyRendered = true;
      var isExpanded = day === defaultExpandDay;

      var card = document.createElement("div");
      card.className = "cpa-day-card";

      var header = document.createElement("button");
      header.type = "button";
      header.className = "cpa-day-header" + (day === todayName ? " is-today" : "");
      header.setAttribute("aria-expanded", isExpanded ? "true" : "false");

      var nameSpan = document.createElement("span");
      nameSpan.className = "cpa-day-name";
      nameSpan.textContent = day;

      var countSpan = document.createElement("span");
      countSpan.className = "cpa-day-count";
      countSpan.textContent = byDay[day].length + (byDay[day].length === 1 ? " activity" : " activities");

      var chevronSpan = document.createElement("span");
      chevronSpan.className = "cpa-day-chevron";
      chevronSpan.innerHTML = CHEVRON_ICON;

      header.appendChild(nameSpan);
      header.appendChild(countSpan);
      header.appendChild(chevronSpan);

      var ul = document.createElement("ul");
      ul.className = "cpa-entry-list cpa-day-body";
      ul.hidden = !isExpanded;

      byDay[day].forEach(function (e) {
        var extra = state.mode === "cabins" ? e.group_name : e.housing;
        var li = document.createElement("li");

        var timeSpan = document.createElement("span");
        timeSpan.className = "cpa-time";
        timeSpan.textContent = e.time_slot || "";

        var activitySpan = document.createElement("span");
        activitySpan.className = "cpa-activity";
        activitySpan.textContent = e.activity || "";

        var nameSpan2 = document.createElement("span");
        nameSpan2.className = "cpa-name";
        var nameLine = document.createElement("span");
        nameLine.textContent = e.name;
        nameSpan2.appendChild(nameLine);
        if (extra && state.showExtra) {
          var extraLine = document.createElement("span");
          extraLine.className = "cpa-name-extra";
          extraLine.textContent = extra;
          nameSpan2.appendChild(extraLine);
        }

        li.appendChild(timeSpan);
        li.appendChild(activitySpan);
        li.appendChild(nameSpan2);
        ul.appendChild(li);
      });

      header.addEventListener("click", function () {
        var expanded = header.getAttribute("aria-expanded") === "true";
        header.setAttribute("aria-expanded", expanded ? "false" : "true");
        ul.hidden = expanded;
      });

      card.appendChild(header);
      card.appendChild(ul);
      contentEl.appendChild(card);
    });

    if (!anyRendered) {
      var none = document.createElement("p");
      none.textContent = "No activities found for this " + (state.mode === "cabins" ? "cabin" : "group") + ".";
      contentEl.appendChild(none);
    }

    document.getElementById("cpa-picker").hidden = true;
    document.getElementById("cpa-detail").hidden = false;
  }

  function wireControls() {
    Array.prototype.forEach.call(document.querySelectorAll(".cpa-tab"), function (tab) {
      tab.addEventListener("click", function () {
        Array.prototype.forEach.call(document.querySelectorAll(".cpa-tab"), function (t) {
          t.classList.remove("active");
        });
        tab.classList.add("active");
        state.mode = tab.getAttribute("data-mode");
        state.search = "";
        document.getElementById("cpa-search").value = "";
        syncExtraToggleUI();
        renderList();
      });
    });

    document.getElementById("cpa-search").addEventListener("input", function (e) {
      state.search = e.target.value;
      renderList();
    });

    document.getElementById("cpa-back").addEventListener("click", function () {
      document.getElementById("cpa-detail").hidden = true;
      document.getElementById("cpa-picker").hidden = false;
    });

    Array.prototype.forEach.call(document.querySelectorAll(".cpa-extra-toggle"), function (cb) {
      cb.addEventListener("change", function (e) { setShowExtra(e.target.checked); });
    });
  }

  // ---- Init ---------------------------------------------------------------
  var root = document.getElementById("cpa-root");
  if (!root) {
    console.error("Coast Paid Activities v2: #cpa-root mount point not found - stub not installed correctly.");
    return;
  }
  buildSkeleton(root);
  wireControls();
  syncExtraToggleUI();
  loadData(true);
  setInterval(function () { loadData(false); }, REFRESH_MS);
})();
