// @ts-check

// Extra JS capability for selected tabs to be synced
// The selection is stored in local storage so that it persists across page loads.

/**
 * @type {Record<string, HTMLElement[]>}
 */
let sd_id_to_elements = {};
const storageKeyPrefix = "sphinx-design-tab-id-";

/**
 * Create a key for a tab element.
 * @param {HTMLElement} el - The tab element.
 * @returns {[string, string, string] | null} - The key.
 *
 */
function create_key(el) {
  let syncId = el.getAttribute("data-sync-id");
  let syncGroup = el.getAttribute("data-sync-group");
  if (!syncId || !syncGroup) return null;
  return [syncGroup, syncId, syncGroup + "--" + syncId];
}

/**
 * Initialize the tab selection.
 *
 */
function ready() {
  // Find all tabs with sync data

  /** @type {string[]} */
  let groups = [];

  document.querySelectorAll(".sd-tab-label").forEach((label) => {
    if (label instanceof HTMLElement) {
      let data = create_key(label);
      if (data) {
        let [group, id, key] = data;

        // add click event listener
        // @ts-ignore
        label.onclick = onSDLabelClick;

        // store map of key to elements
        if (!sd_id_to_elements[key]) {
          sd_id_to_elements[key] = [];
        }
        sd_id_to_elements[key].push(label);

        if (groups.indexOf(group) === -1) {
          groups.push(group);
          // Check if a specific tab has been selected via URL parameter
          const tabParam = new URLSearchParams(window.location.search).get(
            group
          );
          if (tabParam) {
            console.log(
              "sphinx-design: Selecting tab id for group '" +
                group +
                "' from URL parameter: " +
                tabParam
            );
            window.sessionStorage.setItem(storageKeyPrefix + group, tabParam);
          }
        }

        // Check is a specific tab has been selected previously
        let previousId = window.sessionStorage.getItem(
          storageKeyPrefix + group
        );
        if (previousId === id) {
          // console.log(
          //   "sphinx-design: Selecting tab from session storage: " + id
          // );
          // @ts-ignore
          label.previousElementSibling.checked = true;
        }
      }
    }
  });
}

/**
 *  Activate other tabs with the same sync id.
 *
 * @this {HTMLElement} - The element that was clicked.
 */
function onSDLabelClick() {
  let data = create_key(this);
  if (!data) return;
  let [group, id, key] = data;
  for (const label of sd_id_to_elements[key]) {
    if (label === this) continue;
    // @ts-ignore
    label.previousElementSibling.checked = true;
  }
  window.sessionStorage.setItem(storageKeyPrefix + group, id);
}

document.addEventListener("DOMContentLoaded", ready, false);