// Cookie consent banner — Google Consent Mode v2 + gated loading of
// Google Analytics / Google Ads / Yandex Metrica. No third-party script
// is loaded before the user opts in. IDs are read from window.CONSENT_CONFIG
// (set in the HTML <head>); empty IDs are simply skipped.

const CONSENT_KEY = "kranich_cookie_consent_v1";

const readConsent = () => {
  try { return JSON.parse(localStorage.getItem(CONSENT_KEY)); }
  catch (e) { return null; }
};
const writeConsent = (c) => {
  try { localStorage.setItem(CONSENT_KEY, JSON.stringify(c)); } catch (e) {}
};

// --- Third-party loaders (idempotent) ---
const cfg = () => window.CONSENT_CONFIG || {};
let _gtagInjected = false;
let _yandexInjected = false;

const ensureGtag = () => {
  const { gaId, adsId } = cfg();
  const primaryId = gaId || adsId;
  if (!primaryId || _gtagInjected) return;
  _gtagInjected = true;
  const s = document.createElement("script");
  s.async = true;
  s.src = "https://www.googletagmanager.com/gtag/js?id=" + primaryId;
  document.head.appendChild(s);
  window.gtag("js", new Date());
  if (gaId) window.gtag("config", gaId, { anonymize_ip: true });
  if (adsId) window.gtag("config", adsId);
};

const loadYandex = () => {
  const { yandexId } = cfg();
  if (!yandexId || _yandexInjected) return;
  _yandexInjected = true;
  /* eslint-disable */
  (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
    m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0];
    k.async=1;k.src=r;a.parentNode.insertBefore(k,a)})
    (window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");
  window.ym(yandexId, "init", { clickmap: true, trackLinks: true, accurateTrackBounce: true, webvisor: true });
  /* eslint-enable */
};

// Push consent state to Google Consent Mode and load gated scripts.
const applyConsent = (c) => {
  if (typeof window.gtag === "function") {
    window.gtag("consent", "update", {
      analytics_storage: c.analytics ? "granted" : "denied",
      ad_storage:        c.marketing ? "granted" : "denied",
      ad_user_data:      c.marketing ? "granted" : "denied",
      ad_personalization:c.marketing ? "granted" : "denied",
    });
  }
  if (c.analytics || c.marketing) ensureGtag();
  if (c.analytics) loadYandex();
};

const CookieConsent = () => {
  const stored = readConsent();
  const [open, setOpen] = React.useState(!stored);
  const [details, setDetails] = React.useState(false);
  const [analytics, setAnalytics] = React.useState(stored ? !!stored.analytics : false);
  const [marketing, setMarketing] = React.useState(stored ? !!stored.marketing : false);

  // Re-apply a stored decision on load (e.g. returning visitor).
  React.useEffect(() => {
    if (stored) applyConsent(stored);
    window.openCookieSettings = () => { setDetails(true); setOpen(true); };
  }, []);

  const decide = (a, m) => {
    const c = { analytics: a, marketing: m, ts: new Date().toISOString() };
    writeConsent(c);
    applyConsent(c);
    setOpen(false);
  };

  if (!open) return null;

  const Toggle = ({ on, onChange, disabled }) => (
    <button
      role="switch" aria-checked={on} disabled={disabled}
      onClick={() => !disabled && onChange(!on)}
      style={{
        width: 44, height: 26, borderRadius: 999, flexShrink: 0,
        background: on ? "var(--accent)" : "var(--line)",
        opacity: disabled ? .6 : 1, cursor: disabled ? "default" : "pointer",
        position: "relative", transition: "background .15s",
      }}>
      <span style={{
        position: "absolute", top: 3, left: on ? 21 : 3,
        width: 20, height: 20, borderRadius: 999, background: "#fff",
        transition: "left .15s", boxShadow: "0 1px 3px rgba(0,0,0,.25)",
      }}/>
    </button>
  );

  const Row = ({ title, desc, on, onChange, disabled, alwaysLabel }) => (
    <div style={{ display: "flex", gap: 14, alignItems: "flex-start", padding: "14px 0", borderTop: "1px solid var(--line-soft)" }}>
      <div style={{ flex: 1 }}>
        <div style={{ fontWeight: 700, fontSize: "calc(15px * var(--scale))" }}>{title}</div>
        <div style={{ color: "var(--ink-3)", fontSize: "calc(13px * var(--scale))", marginTop: 2 }}>{desc}</div>
      </div>
      {disabled
        ? <span style={{ color: "var(--ink-3)", fontSize: "calc(12px * var(--scale))", fontWeight: 600, whiteSpace: "nowrap" }}>{alwaysLabel}</span>
        : <Toggle on={on} onChange={onChange} disabled={disabled}/>}
    </div>
  );

  return (
    <div role="dialog" aria-modal="true" aria-label={t("consent.title")} style={{
      position: "fixed", left: 0, right: 0, bottom: 0, zIndex: 90,
      display: "flex", justifyContent: "center", padding: 16,
    }}>
      <div style={{
        width: "100%", maxWidth: 560, background: "var(--surface)",
        borderRadius: "var(--radius-lg)", border: "1px solid var(--line)",
        boxShadow: "var(--shadow-lg)", padding: 24,
      }}>
        <div style={{ fontWeight: 800, fontSize: "calc(19px * var(--scale))", marginBottom: 8 }}>
          {t("consent.title")}
        </div>
        <p style={{ color: "var(--ink-2)", fontSize: "calc(14.5px * var(--scale))", lineHeight: 1.55 }}>
          {t("consent.body")}{" "}
          <a href="datenschutz.html" style={{ color: "var(--accent-ink)", textDecoration: "underline" }}>
            {t("consent.moreLink")}
          </a>.
        </p>

        {details && (
          <div style={{ margin: "16px 0 4px" }}>
            <Row title={t("consent.catNecessary")} desc={t("consent.catNecessaryDesc")} disabled alwaysLabel={t("consent.always")} />
            <Row title={t("consent.catAnalytics")} desc={t("consent.catAnalyticsDesc")} on={analytics} onChange={setAnalytics} />
            <Row title={t("consent.catMarketing")} desc={t("consent.catMarketingDesc")} on={marketing} onChange={setMarketing} />
          </div>
        )}

        <div style={{ display: "flex", gap: 10, flexWrap: "wrap", marginTop: 18 }}>
          {details ? (
            <button className="btn btn-mint" style={{ flex: 1 }} onClick={() => decide(analytics, marketing)}>
              {t("consent.save")}
            </button>
          ) : (
            <button className="btn btn-mint" style={{ flex: 1 }} onClick={() => decide(true, true)}>
              {t("consent.acceptAll")}
            </button>
          )}
          <button className="btn btn-secondary" style={{ flex: 1 }} onClick={() => decide(false, false)}>
            {t("consent.rejectAll")}
          </button>
          {!details && (
            <button className="btn btn-ghost" style={{ flexBasis: "100%" }} onClick={() => setDetails(true)}>
              {t("consent.settings")}
            </button>
          )}
        </div>
      </div>
    </div>
  );
};

Object.assign(window, { CookieConsent });
