// Social / Open Graph — static defaults live in Dakota 15 Wing.html; this keeps previews in sync with route + language.

const DK_SITE_ORIGIN = "https://dakota15wing.be";
const DK_OG_LOCALES = { nl: "nl_BE", fr: "fr_BE", de: "de_DE", en: "en_GB" };
const DK_HTML_LANG = { nl: "nl-BE", fr: "fr-BE", de: "de-BE", en: "en-GB" };

function dkTruncateMeta(text, max) {
  if (!text) return "";
  const s = String(text).replace(/\s+/g, " ").trim();
  if (s.length <= max) return s;
  return s.slice(0, Math.max(0, max - 1)).trimEnd() + "\u2026";
}

function dkResolveOrigin() {
  try {
    const h = String(window.location.hostname || "");
    if (!h || h === "localhost" || h === "127.0.0.1") return DK_SITE_ORIGIN;
    return String(window.location.origin || DK_SITE_ORIGIN).replace(/\/$/, "");
  } catch (_) {
    return DK_SITE_ORIGIN;
  }
}

function dkApplyHreflangs(page) {
  const origin = dkResolveOrigin();
  let pathname = "/";
  let search = "";
  try {
    pathname = window.location.pathname || "/";
    search = window.location.search || "";
  } catch (_) {}
  document.head.querySelectorAll('link[data-dk-hreflang="1"]').forEach((n) => n.remove());
  [
    ["nl-BE", "nl"],
    ["fr-BE", "fr"],
    ["de-BE", "de"],
    ["en-GB", "en"],
  ].forEach(([hreflang, l]) => {
    const q = new URLSearchParams();
    q.set("p", page);
    q.set("l", l);
    const link = document.createElement("link");
    link.setAttribute("rel", "alternate");
    link.setAttribute("hreflang", hreflang);
    link.setAttribute("href", `${origin}${pathname}${search}#${q.toString()}`);
    link.setAttribute("data-dk-hreflang", "1");
    document.head.appendChild(link);
  });
  const def = document.createElement("link");
  def.setAttribute("rel", "alternate");
  def.setAttribute("hreflang", "x-default");
  def.setAttribute("href", `${origin}/`);
  def.setAttribute("data-dk-hreflang", "1");
  document.head.appendChild(def);
}

function dkNormalizeTel(display) {
  const digits = String(display || "").replace(/\D/g, "");
  if (!digits) return "+3224498711";
  return `+${digits}`;
}

function dkMuseumOrgExtras(lang) {
  const k = DK_OG_LOCALES[lang] ? lang : "nl";
  const nlCs =
    typeof I18N !== "undefined" && I18N.nl && I18N.nl.contactStandalone ? I18N.nl.contactStandalone : {};
  const t = typeof I18N !== "undefined" ? I18N[k] || I18N.nl : {};
  const cs = { ...nlCs, ...(t.contactStandalone || {}) };
  const openingHours = cs.openingValue || undefined;
  const telephone = dkNormalizeTel(cs.phoneDisplay);
  return {
    openingHours,
    telephone,
    geo: {
      "@type": "GeoCoordinates",
      latitude: 50.9019,
      longitude: 4.4846,
    },
  };
}

function dkSyncJsonLd(pack, lang) {
  const base = DK_SITE_ORIGIN.replace(/\/$/, "");
  const k = DK_OG_LOCALES[lang] ? lang : "nl";
  const inLang = DK_HTML_LANG[k] || "nl-BE";
  const desc = dkTruncateMeta(pack.description, 520);
  const extras = dkMuseumOrgExtras(lang);
  const org = {
    "@type": ["Organization", "Museum"],
    "@id": `${base}/#organization`,
    name: "DAKOTA — 15 Wing Heritage Museum",
    alternateName: ["DAKOTA vzw", "Dakota15wing", "DAKOTA 15 Wing"],
    url: `${base}/`,
    logo: `${base}/assets/dakota-logo.png`,
    image: `${base}/assets/og-image.jpg`,
    description: desc,
    email: "secretariaat@dakota15wing.be",
    telephone: extras.telephone,
    geo: extras.geo,
    address: {
      "@type": "PostalAddress",
      streetAddress: "Haachtsesteenweg 138",
      addressLocality: "Melsbroek",
      postalCode: "1820",
      addressCountry: "BE",
    },
  };
  if (extras.openingHours) org.openingHours = extras.openingHours;

  const graph = {
    "@context": "https://schema.org",
    "@graph": [
      org,
      {
        "@type": "WebSite",
        "@id": `${base}/#website`,
        url: `${base}/`,
        name: "DAKOTA — 15 Wing Heritage Museum",
        description: desc,
        publisher: { "@id": `${base}/#organization` },
        inLanguage: ["nl-BE", "fr-BE", "de-BE", "en-GB"],
      },
      {
        "@type": "WebPage",
        "@id": pack.url,
        url: pack.url,
        name: pack.title,
        description: desc,
        isPartOf: { "@id": `${base}/#website` },
        about: { "@id": `${base}/#organization` },
        inLanguage: inLang,
      },
    ],
  };
  let el = document.getElementById("dk-jsonld");
  if (!el) {
    el = document.createElement("script");
    el.type = "application/ld+json";
    el.id = "dk-jsonld";
    document.head.appendChild(el);
  }
  el.textContent = JSON.stringify(graph);
}

function dkSocialPreview(page, lang) {
  const k = DK_OG_LOCALES[lang] ? lang : "nl";
  const nl = typeof I18N !== "undefined" ? I18N.nl : {};
  const t = typeof I18N !== "undefined" ? I18N[k] || I18N.nl : {};
  const footer = { ...(nl.footer || {}), ...(t.footer || {}) };
  const hero = { ...(nl.hero || {}), ...(t.hero || {}) };
  const landing = { ...(nl.landing || {}), ...(t.landing || {}) };
  const origin = dkResolveOrigin();
  const imageUrl = `${origin}/assets/og-image.jpg`;
  const fallbackDesc =
    hero.body ||
    footer.blurb ||
    "Erfgoedmuseum van het Belgisch Luchtcomponent — 15de Transport Wing, Melsbroek.";
  let title = "DAKOTA — 15 Wing Heritage Museum";
  let description = fallbackDesc;
  let imageAlt =
    hero.photoAlt ||
    "C-130H Hercules — DAKOTA 15 Wing Heritage Museum, Melsbroek";

  if (page === "landing") {
    title = `${landing.heroCaption || "DAKOTA"} · DAKOTA`;
    description = footer.blurb || fallbackDesc;
  } else if (page === "home") {
    const one = (hero.t1 && String(hero.t1).replace(/\.\s*$/, "")) || "Dakota";
    title = `${one} — ${hero.t2 || ""} ${hero.t2_em || ""} · DAKOTA`.replace(/\s+/g, " ").trim();
    description = hero.body || fallbackDesc;
  } else if (page === "shop") {
    const shop =
      typeof window !== "undefined" && window.DK_SHOP_I18N && (window.DK_SHOP_I18N[k] || window.DK_SHOP_I18N.nl);
    if (shop) {
      title = `${shop.title} ${shop.em} · DAKOTA`.replace(/\s+/g, " ").trim();
      description = shop.lead || fallbackDesc;
    }
  } else if (page && ((nl.pages && nl.pages[page]) || (t.pages && t.pages[page]))) {
    const p = { ...((nl.pages && nl.pages[page]) || {}), ...((t.pages && t.pages[page]) || {}) };
    title = `${p.title || ""} ${p.em || ""} · DAKOTA`.replace(/\s+/g, " ").trim();
    description = (p.lead || p.lead1 || p.lead2 || fallbackDesc);
  } else {
    const navBase = nl.nav_full || nl.nav || {};
    const nav = { ...(typeof navBase === "object" ? navBase : {}), ...(t.nav || {}), ...(t.nav_full || {}) };
    const navLabel = page && nav[page];
    if (navLabel) title = `${navLabel} · DAKOTA`;
  }

  let url = `${origin}/`;
  try {
    const q = new URLSearchParams();
    q.set("p", page);
    q.set("l", k);
    url = `${origin}${window.location.pathname}${window.location.search}#${q.toString()}`;
  } catch (_) {}

  const ogLocale = DK_OG_LOCALES[k] || "nl_BE";
  const alternates = Object.values(DK_OG_LOCALES).filter((x) => x !== ogLocale);

  return {
    title: title.replace(/\s+/g, " ").trim(),
    description,
    url,
    imageUrl,
    imageAlt,
    ogLocale,
    ogLocaleAlternates: alternates,
  };
}

function dkApplySocialPreview(page, lang) {
  const ln = DK_OG_LOCALES[lang] ? lang : "nl";
  const pack = dkSocialPreview(page, ln);

  document.title = pack.title;

  let md = document.head.querySelector('meta[name="description"]');
  if (!md) {
    md = document.createElement("meta");
    md.setAttribute("name", "description");
    document.head.appendChild(md);
  }
  md.setAttribute("content", dkTruncateMeta(pack.description, 320));

  const ogPairs = [
    ["og:title", pack.title],
    ["og:description", dkTruncateMeta(pack.description, 300)],
    ["og:url", pack.url],
    ["og:image", pack.imageUrl],
    ["og:image:secure_url", pack.imageUrl],
    ["og:image:type", "image/jpeg"],
    ["og:image:width", "1200"],
    ["og:image:height", "630"],
    ["og:image:alt", dkTruncateMeta(pack.imageAlt, 200)],
    ["og:type", "website"],
    ["og:site_name", "DAKOTA — 15 Wing Heritage Museum"],
    ["og:locale", pack.ogLocale],
  ];

  ogPairs.forEach(([prop, val]) => {
    let el = document.head.querySelector(`meta[property="${prop}"]`);
    if (!el) {
      el = document.createElement("meta");
      el.setAttribute("property", prop);
      document.head.appendChild(el);
    }
    el.setAttribute("content", val);
  });

  document.head.querySelectorAll('meta[property="og:locale:alternate"]').forEach((n) => n.remove());
  pack.ogLocaleAlternates.forEach((loc) => {
    const el = document.createElement("meta");
    el.setAttribute("property", "og:locale:alternate");
    el.setAttribute("content", loc);
    document.head.appendChild(el);
  });

  const tw = [
    ["twitter:card", "summary_large_image"],
    ["twitter:title", pack.title],
    ["twitter:description", dkTruncateMeta(pack.description, 200)],
    ["twitter:image", pack.imageUrl],
    ["twitter:image:alt", dkTruncateMeta(pack.imageAlt, 200)],
  ];
  tw.forEach(([name, val]) => {
    let el = document.head.querySelector(`meta[name="${name}"]`);
    if (!el) {
      el = document.createElement("meta");
      el.setAttribute("name", name);
      document.head.appendChild(el);
    }
    el.setAttribute("content", val);
  });

  let canonical = document.head.querySelector('link[rel="canonical"]');
  if (!canonical) {
    canonical = document.createElement("link");
    canonical.setAttribute("rel", "canonical");
    document.head.appendChild(canonical);
  }
  canonical.setAttribute("href", pack.url);

  dkApplyHreflangs(page);
  dkSyncJsonLd(pack, ln);
}
