// ─────────────────────────────────────────────────────────────────────
// Supabase kliens — valódi integráció
// ─────────────────────────────────────────────────────────────────────
//
// BEÁLLÍTÁS (egyszeri):
//   1. Nyisd meg a config.js fájlt (a projekt gyökerében)
//   2. Töltsd ki a Supabase URL-t és az anon kulcsot:
//        Supabase → Settings → API → Project URL + anon public key
//   3. Futtasd le a schema.sql tartalmát a Supabase SQL Editor-ban
//
// A config.js .gitignore-ban van → a kulcsok nem kerülnek git-be.
// ─────────────────────────────────────────────────────────────────────

const _SupabaseLib = window.supabase; // save CDN library before overwriting the global
let _sb = null;

async function requireSupabaseClient() {
  if (_sb) return _sb;

  // Wait for the config fetch to finish (set in index.html as window._configReady)
  if (window._configReady) await window._configReady;

  const cfg = window.SUPABASE_CONFIG;
  if (cfg?.url && cfg?.key) {
    try {
      _sb = _SupabaseLib.createClient(cfg.url, cfg.key);
    } catch (e) {
      console.error("Supabase createClient hiba:", e);
    }
  }

  if (!_sb) {
    throw new Error("Hiányzó Supabase config: SUPABASE_URL / SUPABASE_ANON_KEY. (window.SUPABASE_CONFIG hiányos vagy nincs feltöltve)");
  }
  return _sb;
}


// A jelszó mezőt nem adjuk vissza normál lekérdezéseknél
const SAFE_COLS = "id,title,excerpt,content,team_id,category,tags,image_url,pinned,read_min,author,created_at,updated_at,source_url,source_title,source_description,source_og_image,sources";

// DB → frontend mezőátalakítás
function toFrontend(row) {
  if (!row) return null;
  // Prefer new `sources` JSONB array; fall back to legacy single-source columns
  const sourcesArr = Array.isArray(row.sources) && row.sources.length > 0
    ? row.sources
    : row.source_url
      ? [{ url: row.source_url, title: row.source_title || "", description: row.source_description || "", ogImage: row.source_og_image || "" }]
      : [];
  return {
    ...row,
    read:    row.read_min ?? 3,
    image:   row.image_url ? { kind: "photo", label: row.image_url } : null,
    sources: sourcesArr,
    // keep legacy field for any code that still reads post.source
    source:  sourcesArr[0] || null,
  };
}

// Frontend → DB mezőátalakítás (jelszó nélkül)
function toDb(payload) {
  const wordCount = (payload.content || "").trim().split(/\s+/).filter(Boolean).length;
  const sources   = Array.isArray(payload.sources) ? payload.sources : [];
  return {
    title:    payload.title?.trim(),
    team_id:  payload.team_id,
    category: payload.category,
    tags:     payload.tags   || [],
    content:  payload.content || "",
    excerpt:  payload.excerpt || "",
    image_url: payload.image?.label || null,
    read_min:  Math.max(1, Math.round(wordCount / 200)),
    sources,
    // keep legacy columns in sync with first source for old queries
    source_url:         sources[0]?.url         || null,
    source_title:       sources[0]?.title       || null,
    source_description: sources[0]?.description || null,
    source_og_image:    sources[0]?.ogImage     || null,
  };
}

const supabase = {
  // Témakörök — helyi adatból
  async listTopics() {
    return { data: TOPICS, error: null };
  },

  // Bejegyzések lekérése (jelszó nélkül)
  async listPosts({ category = null, topicId = null, search = "" } = {}) {
    const _sb = await requireSupabaseClient();

    const buildQuery = (cols) => {
      let q = _sb.from("posts").select(cols).order("created_at", { ascending: false });
      if (category) q = q.eq("category", category);
      if (topicId)  q = q.eq("team_id", topicId);
      return q;
    };

    let { data, error } = await buildQuery(SAFE_COLS);
    // Ha a sources oszlop még nem létezik (migration nem futott), fallback régi oszlopokra
    if (error && error.message?.includes("sources")) {
      const SAFE_COLS_LEGACY = SAFE_COLS.replace(",sources", "");
      ({ data, error } = await buildQuery(SAFE_COLS_LEGACY));
    }
    if (error) return { data: [], error };

    let rows = (data || []).map(toFrontend);

    if (search) {
      const q = search.toLowerCase();
      rows = rows.filter(p =>
        p.title.toLowerCase().includes(q) ||
        (p.excerpt || "").toLowerCase().includes(q)
      );
    }

    return { data: rows, error: null };
  },

  // Új bejegyzés létrehozása (jelszó kötelező)
  async createPost(payload) {
    const _sb = await requireSupabaseClient();
    if (!payload.title?.trim() || !payload.team_id || !payload.category) {
      return { data: null, error: { message: "Cím, témakör és kategória megadása kötelező." } };
    }
    if (!payload.password?.trim()) {
      return { data: null, error: { message: "A bejegyzéshez jelszó megadása kötelező." } };
    }

    const { data, error } = await _sb
      .from("posts")
      .insert({ ...toDb(payload), password: payload.password.trim() })
      .select(SAFE_COLS)
      .single();

    if (error) return { data: null, error };
    return { data: toFrontend(data), error: null };
  },

  // Jelszó ellenőrzése (szerkesztés/törlés előtt)
  async checkPassword(id, password) {
    const _sb = await requireSupabaseClient();
    const pid = id;
    const pwd = String(password ?? "").trim();

    if (!pwd) return { data: null, error: { message: "Helytelen jelszó." } };

    // NOTE: 406 gyakran akkor jön, ha a filter típusa nem egyezik a DB oszlop típussal.
    // A password mezőt ebben a projekben szövegként kezeli a schema.
    const { data, error } = await _sb
      .from("posts")
      .select("id")
      .eq("id", pid)
      .eq("password", pwd)
      .single();

    if (error || !data) return { data: null, error: { message: "Helytelen jelszó." } };
    return { data, error: null };
  },

  // Bejegyzés frissítése — jelszó szükséges
  async updatePost(id, password, patch) {
    const _sb = await requireSupabaseClient();
    const { error: authErr } = await this.checkPassword(id, password);
    if (authErr) return { data: null, error: authErr };

    const { data, error } = await _sb
      .from("posts")
      .update(toDb(patch))
      .eq("id", id)
      .select(SAFE_COLS)
      .single();

    if (error) return { data: null, error };
    return { data: toFrontend(data), error: null };
  },

  // Bejegyzés törlése — jelszó szükséges
  async deletePost(id, password) {
    const _sb = await requireSupabaseClient();
    const { error: authErr } = await this.checkPassword(id, password);
    if (authErr) return { data: null, error: authErr };

    const { error } = await _sb.from("posts").delete().eq("id", id);
    if (error) return { data: null, error };
    return { data: { id }, error: null };
  },

  // Megjegyzések lekérése egy bejegyzéshez
  async listComments(postId) {
    const _sb = await requireSupabaseClient();
    const { data, error } = await _sb
      .from("post_comments")
      .select("*")
      .eq("post_id", postId)
      .order("created_at", { ascending: true });
    return { data: data || [], error };
  },

  // Megjegyzés hozzáadása
  async addComment({ post_id, author, body }) {
    const _sb = await requireSupabaseClient();
    const { data, error } = await _sb
      .from("post_comments")
      .insert({ post_id, author, body })
      .select()
      .single();
    return { data, error };
  },

  // Kép feltöltése Supabase Storage-ba (bucket: "post-images", public)
  async uploadImage(file) {
    const _sb = await requireSupabaseClient();
    const ext = file.name.split(".").pop().toLowerCase();
    const name = `${Date.now()}-${Math.random().toString(36).slice(2)}.${ext}`;
    const { data, error } = await _sb.storage
      .from("post-images")
      .upload(name, file, { upsert: false });
    if (error) return { url: null, error };
    const { data: { publicUrl } } = _sb.storage.from("post-images").getPublicUrl(data.path);
    return { url: publicUrl, error: null };
  },
};

// Dev-helpers: ensure expected API exists in window.supabase
// (prevents runtime "supabase.listTopics is not a function" / "createPost is not a function")
window.supabase = supabase;
if (!window.supabase) window.supabase = {};
window.supabase.listTopics = window.supabase.listTopics || supabase.listTopics;
window.supabase.listPosts  = window.supabase.listPosts  || supabase.listPosts;
window.supabase.createPost = window.supabase.createPost || supabase.createPost;
window.supabase.updatePost = window.supabase.updatePost || supabase.updatePost;
window.supabase.deletePost = window.supabase.deletePost || supabase.deletePost;
window.supabase.listComments = window.supabase.listComments || supabase.listComments;
window.supabase.addComment = window.supabase.addComment || supabase.addComment;
window.supabase.uploadImage = window.supabase.uploadImage || supabase.uploadImage;

