/* Авто-обновление клиента (UI).
   Поллит /api/app/update/status; если есть новая версия — показывает баннер
   «Доступно обновление → Обновить». По клику качает+применяет обновление
   (/api/app/update/apply), ждёт перезапуска и перезагружает страницу.
   В dev (supported:false) — ничего не делает. */
(function () {
  "use strict";

  var BANNER_ID = "app-update-banner";
  var POLL_MS = 30 * 60 * 1000; // повторная проверка раз в 30 мин

  function el(tag, attrs, children) {
    var n = document.createElement(tag);
    if (attrs) Object.keys(attrs).forEach(function (k) {
      if (k === "style") n.setAttribute("style", attrs[k]);
      else if (k === "class") n.className = attrs[k];
      else n[k] = attrs[k];
    });
    (children || []).forEach(function (c) {
      n.appendChild(typeof c === "string" ? document.createTextNode(c) : c);
    });
    return n;
  }

  function styleOnce() {
    if (document.getElementById("app-update-style")) return;
    var css =
      "#" + BANNER_ID + "{position:fixed;left:50%;transform:translateX(-50%);bottom:18px;z-index:99998;" +
      "max-width:min(560px,94vw);display:flex;align-items:center;gap:14px;background:#15181c;" +
      "border:1px solid #2b3138;border-left:4px solid #c8f542;border-radius:12px;padding:12px 16px;" +
      "box-shadow:0 16px 48px rgba(0,0,0,.5);color:#e7ebef;font-family:inherit}" +
      "#" + BANNER_ID + " .upd-txt{flex:1;font-size:13px;line-height:1.45}" +
      "#" + BANNER_ID + " .upd-txt b{color:#fff}" +
      "#" + BANNER_ID + " .upd-notes{display:block;color:#9aa4ad;font-size:12px;margin-top:2px}" +
      "#" + BANNER_ID + " button{cursor:pointer;border:none;border-radius:9px;font-weight:600;font-size:13px;padding:9px 16px}" +
      "#" + BANNER_ID + " .upd-go{background:#c8f542;color:#10130a}" +
      "#" + BANNER_ID + " .upd-go:disabled{opacity:.55;cursor:default}" +
      "#" + BANNER_ID + " .upd-x{background:transparent;color:#6b7480;padding:9px 8px}";
    var s = el("style", { id: "app-update-style" }, []);
    s.textContent = css;
    document.head.appendChild(s);
  }

  function removeBanner() {
    var b = document.getElementById(BANNER_ID);
    if (b) b.remove();
  }

  function waitForRestart(tries) {
    // приложение перезапускается — ждём, пока /api/version снова ответит, и перезагружаем
    tries = tries || 0;
    if (tries > 120) { window.location.reload(); return; }
    fetch("/api/version", { cache: "no-store" })
      .then(function (r) { return r.ok ? r.json() : Promise.reject(); })
      .then(function () { setTimeout(function () { window.location.reload(); }, 1500); })
      .catch(function () { setTimeout(function () { waitForRestart(tries + 1); }, 2000); });
  }

  function showBanner(info) {
    styleOnce();
    removeBanner();

    var txt = el("div", { class: "upd-txt" }, [
      el("b", {}, ["Доступно обновление " + (info.latest || "")]),
    ]);
    if (info.notes) txt.appendChild(el("span", { class: "upd-notes" }, [info.notes]));

    var goBtn = el("button", { class: "upd-go", type: "button" }, ["Обновить"]);
    var xBtn = el("button", { class: "upd-x", type: "button", title: "Позже" }, ["✕"]);
    xBtn.addEventListener("click", removeBanner);

    goBtn.addEventListener("click", function () {
      goBtn.disabled = true;
      goBtn.textContent = "Загрузка…";
      fetch("/api/app/update/apply", { method: "POST" })
        .then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
        .then(function (res) {
          if (res.ok && res.j && res.j.ok) {
            txt.innerHTML = "";
            txt.appendChild(el("b", {}, ["Обновление устанавливается…"]));
            txt.appendChild(el("span", { class: "upd-notes" }, ["Приложение перезапустится автоматически."]));
            goBtn.remove();
            xBtn.remove();
            waitForRestart(0);
          } else {
            goBtn.disabled = false;
            goBtn.textContent = "Повторить";
            txt.appendChild(el("span", { class: "upd-notes" }, [
              (res.j && res.j.detail) || (res.j && res.j.message) || "Ошибка обновления",
            ]));
          }
        })
        .catch(function () {
          goBtn.disabled = false;
          goBtn.textContent = "Повторить";
        });
    });

    var banner = el("div", { id: BANNER_ID }, [txt, goBtn, xBtn]);
    document.body.appendChild(banner);
  }

  function check() {
    fetch("/api/app/update/status", { cache: "no-store" })
      .then(function (r) { return r.json(); })
      .then(function (s) {
        if (s && s.supported && s.available) showBanner(s);
      })
      .catch(function () { /* нет связи/сервера — молча */ });
  }

  function start() {
    check();
    setInterval(check, POLL_MS);
  }

  if (document.readyState === "loading")
    document.addEventListener("DOMContentLoaded", start);
  else start();
})();
