/**
 * File containing main functions and library re-exports
 * that should be accessible throughout the whole website.
 *
 * The idea is to group all that shared code into a single bundle,
 * for more efficient tree-shaking and gzip compression.
 */

import sort from "@alpinejs/sort";
import Alpine from "alpinejs";
import { polyfillCountryFlagEmojis } from "country-flag-emoji-polyfill";
import htmx from "htmx.org";
import { limitedChoices } from "#core:alpine/limited-choices";
import { expireOldStorage } from "#core:core/localstorage";
import { default as navbar } from "#core:core/navbar";
import {
  type NotificationPlugin,
  notificationsPlugin as notifications,
} from "#core:utils/notifications";

/**
 * Alpine
 */
declare module "alpinejs" {
  interface Magics<T> {
    $notifications: NotificationPlugin;
  }
}

Alpine.plugin([sort, limitedChoices, notifications]);
// biome-ignore lint/style/useNamingConvention: it's how it's named
Object.assign(window, { Alpine });

window.addEventListener("DOMContentLoaded", () => {
  Alpine.start();
});

/**
 * Polyfill for country flags (used for language choice)
 */
polyfillCountryFlagEmojis();

/**
 * HTMX
 */
document.body.addEventListener(
  "htmx:beforeRequest" as keyof HTMLElementEventMap,
  (event) => {
    (event as CustomEvent).detail.target.ariaBusy = true;
  },
);

document.body.addEventListener(
  "htmx:beforeSwap" as keyof HTMLElementEventMap,
  (event) => {
    (event as CustomEvent).detail.target.ariaBusy = null;
  },
);

Object.assign(window, { htmx });

/**
 * navbar
 */
navbar();

/**
 * Script that clears the cache when the cache version changes
 */
expireOldStorage();
