/* ============================================================
   doc-sync.jsx — Supabase document persistence
   ============================================================
   Replaces localStorage for logged-in users. When HAS_SUPABASE:
   - fetchDocs(): list all docs in the user's org
   - fetchDoc(id): load one
   - createDoc(title): insert new empty doc
   - saveDoc(id, doc): debounced upsert of blocks/meta/comments/etc.
   - deleteDoc(id): remove
   
   Offline mode falls back to localStorage (same as before).
   ============================================================ */

/* -- org helpers -------------------------------------------- */
async function fetchMyOrg() {
  const sb = getSupabase();
  if (!sb) return null;
  const { data, error } = await sb
    .from('org_members')
    .select('organization_id, role, organizations(id, name, brand)')
    .limit(1);
  if (error) { console.error('fetchMyOrg', error); return null; }
  const row = data?.[0];
  if (!row) return null;
  return {
    id: row.organization_id,
    name: row.organizations?.name || 'Organisatie',
    brand: row.organizations?.brand || {},
    role: row.role,
  };
}

/* -- document list ------------------------------------------ */
async function fetchDocs(orgId) {
  const sb = getSupabase();
  if (!sb) return [];
  const { data, error } = await sb
    .from('documents')
    .select('id, title, updated_at, created_at, meta')
    .eq('organization_id', orgId)
    .order('updated_at', { ascending: false });
  if (error) { console.error('fetchDocs', error); return []; }
  return data || [];
}

async function fetchDoc(id) {
  const sb = getSupabase();
  if (!sb) return null;
  const { data, error } = await sb
    .from('documents')
    .select('*')
    .eq('id', id)
    .maybeSingle();
  if (error) { console.error('fetchDoc', error); return null; }
  return data;
}

async function createDoc(orgId, title) {
  const sb = getSupabase();
  if (!sb) throw new Error('Supabase not ready');
  const { data: { user } } = await sb.auth.getUser();
  const empty = makeEmptyDoc();
  const { data, error } = await sb
    .from('documents')
    .insert({
      organization_id: orgId,
      title: title || empty.meta.title || 'Nieuwe aanbesteding',
      meta: empty.meta,
      blocks: [],
      heading_styles: empty.headingStyles,
      created_by: user?.id,
      updated_by: user?.id,
    })
    .select()
    .single();
  if (error) throw error;
  return data;
}

async function saveDocRemote(id, doc) {
  const sb = getSupabase();
  if (!sb) return;
  const { data: { user } } = await sb.auth.getUser();
  const payload = {
    title: doc.meta?.title || 'Onbenoemd',
    meta: { ...doc.meta, _comments: doc.comments, _suggestions: doc.suggestions },
    blocks: doc.blocks,
    heading_styles: doc.headingStyles,
    updated_by: user?.id,
  };
  const { error } = await sb.from('documents').update(payload).eq('id', id);
  if (error) console.error('saveDocRemote', error);
}

async function deleteDocRemote(id) {
  const sb = getSupabase();
  if (!sb) return;
  const { error } = await sb.from('documents').delete().eq('id', id);
  if (error) throw error;
}

function docFromRow(row) {
  if (!row) return null;
  const meta = row.meta || {};
  const comments     = meta._comments || [];
  const suggestions  = meta._suggestions || [];
  const cleanMeta = { ...meta };
  delete cleanMeta._comments;
  delete cleanMeta._suggestions;
  return {
    id: row.id,
    meta: { ...cleanMeta, title: row.title || cleanMeta.title },
    blocks: row.blocks || [],
    comments,
    suggestions,
    headingStyles: row.heading_styles || makeEmptyDoc().headingStyles,
  };
}

Object.assign(window, {
  fetchMyOrg, fetchDocs, fetchDoc, createDoc, saveDocRemote, deleteDocRemote, docFromRow,
});
