"use client";

import { useEffect, useRef, useState } from "react";
import { readApiResponse } from "../lib/chunked-upload";
import { sendLiveAlert } from "../lib/live-alerts";

type Release = { id: string; version: string; title: string; notes: string; download_url?: string | null; mandatory: number; published_at?: number };
type UpdatePayload = { currentVersion: string; update: Release | null };

export function UpdateCenter() {
  const [release, setRelease] = useState<Release | null>(null);
  const [currentVersion, setCurrentVersion] = useState("");
  const [busy, setBusy] = useState(false);
  const [error, setError] = useState("");
  const announced = useRef("");

  useEffect(() => {
    let active = true;
    async function check() {
      try {
        const response = await fetch("/api/app-updates", { cache: "no-store" });
        if (!response.ok) return;
        const payload = await readApiResponse<UpdatePayload>(response);
        if (!active) return;
        setCurrentVersion(payload.currentVersion);
        setRelease(payload.update);
        if (payload.update && announced.current !== payload.update.id) {
          announced.current = payload.update.id;
          sendLiveAlert("Yeni panel güncellemesi", `v${payload.update.version} · ${payload.update.title}`);
        }
      } catch { /* Arka plan kontrolünde mevcut ekran korunur. */ }
    }
    void check();
    const timer = window.setInterval(check, 15_000);
    return () => { active = false; window.clearInterval(timer); };
  }, []);

  async function action(next: "apply" | "dismiss") {
    if (!release) return;
    setBusy(true); setError("");
    try {
      const response = await fetch("/api/app-updates", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: next }) });
      await readApiResponse(response);
      if (next === "apply") {
        window.setTimeout(() => window.location.reload(), 350);
      } else setRelease(null);
    } catch (caught) {
      setError(caught instanceof Error ? caught.message : "Güncelleme işlemi tamamlanamadı");
      setBusy(false);
    }
  }

  if (!release) return null;
  return <aside className={`updateCenter ${release.mandatory ? "mandatory" : ""}`} role="status" aria-live="polite">
    <div className="updatePulse"><i/><i/><span>↑</span></div>
    <div className="updateCopy"><span>YENİ PANEL SÜRÜMÜ · v{release.version}</span><strong>{release.title}</strong><p>{release.notes}</p><small>Mevcut sürüm: v{currentVersion || "—"}{release.mandatory ? " · Zorunlu güncelleme" : " · İsteğe bağlı güncelleme"}</small>{error && <em>{error}</em>}</div>
    <div className="updateActions"><button className="updateApply" disabled={busy} onClick={() => void action("apply")}>{busy ? "Güncelleniyor…" : "Güncelle ve yenile"}<span>→</span></button>{!release.mandatory && <button className="updateLater" disabled={busy} onClick={() => void action("dismiss")}>Daha sonra</button>}</div>
  </aside>;
}
