// ============================================================
// Supabase Auth Hub (wjwc) — shared auth state for all screens
// 2,881 users (academy 2,543 + tpt_seo 525 + reuse 187)
// ============================================================

const SUPABASE_URL = 'https://wjwcuhykdjklrrtycynq.supabase.co';
const SUPABASE_ANON_KEY = 'sb_publishable_asCLnQf1v9h6ON4tzVWR3A_aw2FVv1x';
const HUB_API_BASE = 'https://api.kindlestartup.com';

// Init client (window.supabase from UMD lib)
const sbClient = window.supabase.createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
  auth: {
    persistSession: true,
    autoRefreshToken: true,
    storageKey: 'kindlestartup-hub-auth',
    detectSessionInUrl: true,  // OAuth callback
  },
});

// ----- Auth API helpers -----
const Auth = {
  client: sbClient,

  async signInWithPassword(email, password) {
    const { data, error } = await sbClient.auth.signInWithPassword({ email, password });
    if (error) throw error;
    return data;
  },

  async signUp(email, password, fullName) {
    const { data, error } = await sbClient.auth.signUp({
      email,
      password,
      options: {
        data: { full_name: fullName || null },
        emailRedirectTo: window.location.origin + '/#/dashboard',
      },
    });
    if (error) throw error;
    return data;
  },

  async signInWithGoogle() {
    const { data, error } = await sbClient.auth.signInWithOAuth({
      provider: 'google',
      options: { redirectTo: window.location.origin + '/#/dashboard' },
    });
    if (error) throw error;
    return data;
  },

  async signInWithMagicLink(email) {
    const { data, error } = await sbClient.auth.signInWithOtp({
      email,
      options: { emailRedirectTo: window.location.origin + '/#/dashboard' },
    });
    if (error) throw error;
    return data;
  },

  async resetPassword(email) {
    const { data, error } = await sbClient.auth.resetPasswordForEmail(email, {
      redirectTo: window.location.origin + '/#/auth/reset',
    });
    if (error) throw error;
    return data;
  },

  async signOut() {
    const { error } = await sbClient.auth.signOut();
    if (error) throw error;
  },

  async getSession() {
    const { data } = await sbClient.auth.getSession();
    return data.session;
  },

  // Subscribe to auth state changes; cb gets (event, session)
  onAuthChange(cb) {
    const { data: sub } = sbClient.auth.onAuthStateChange(cb);
    return () => sub.subscription.unsubscribe();
  },
};

// ----- React hook: useSession() -----
function useSession() {
  const { useState, useEffect } = React;
  const [session, setSession] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    Auth.getSession().then(s => {
      setSession(s);
      setLoading(false);
    });
    const unsub = Auth.onAuthChange((_event, s) => setSession(s));
    return unsub;
  }, []);

  return { session, user: session?.user || null, loading };
}

// ----- API call with Bearer token if logged in -----
async function apiFetch(path, options = {}) {
  const session = await Auth.getSession();
  const headers = { 'Content-Type': 'application/json', ...(options.headers || {}) };
  if (session?.access_token) headers.Authorization = `Bearer ${session.access_token}`;
  return fetch(HUB_API_BASE + path, { ...options, headers });
}

// ----- React hook: useUserData() — fetch /me when session exists -----
function useUserData() {
  const { useState, useEffect } = React;
  const { session } = useSession();
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    if (!session) { setData(null); return; }
    let cancelled = false;
    setLoading(true);
    apiFetch('/functions/v1/me')
      .then(r => r.json())
      .then(j => { if (!cancelled) { setData(j); setError(null); }})
      .catch(e => { if (!cancelled) setError(e); })
      .finally(() => { if (!cancelled) setLoading(false); });
    return () => { cancelled = true; };
  }, [session?.access_token]);

  return { data, loading, error, refresh: () => setData(null) };
}

// Expose to global scope
window.Auth = Auth;
window.useSession = useSession;
window.useUserData = useUserData;
window.apiFetch = apiFetch;
window.HUB_API_BASE = HUB_API_BASE;
