/* auth.jsx — hook de sesión Supabase + rol del usuario */
(function () {
  const { useState: authSt, useEffect: authEf } = React;

  function useAuth() {
    const [session,  setSession]  = authSt(null);
    const [usuario,  setUsuario]  = authSt(null); /* row de tabla usuarios */
    const [loading,  setLoading]  = authSt(true);
    /* restaurante con estado_cuenta 'pendiente' o 'rechazado' → no entra al panel */
    const [bloqueo,  setBloqueo]  = authSt(null);
    /* restaurante que tiene sesión válida pero aún no aceptó términos →
       mantenemos la sesión y mostramos el modal de aceptación (no signOut). */
    const [terminosPend, setTerminosPend] = authSt(false);

    authEf(() => {
      if (!window.treego_db) { setLoading(false); return; }

      /* Sesión inicial (puede existir si el usuario ya había iniciado antes) */
      window.treego_db.auth.getSession().then(({ data: { session: s } }) => {
        setSession(s);
        if (s) loadUsuario(s.user);
        else   setLoading(false);
      });

      /* Escuchar cambios de sesión (login / logout / refresh) */
      const { data: { subscription } } = window.treego_db.auth.onAuthStateChange(
        (_event, s) => {
          setSession(s);
          if (s) loadUsuario(s.user);
          else { setUsuario(null); setLoading(false); }
        }
      );

      return () => subscription.unsubscribe();
    }, []);

    /* Solo estado_cuenta = 'activo' puede entrar al panel del restaurante.
       'pendiente' / 'rechazado' → cerrar sesión y avisar en el login. */
    async function gateRestaurante(usuarioRow) {
      if (!usuarioRow || usuarioRow.rol !== 'restaurante') return usuarioRow;
      const { data: rest } = await window.treego_db
        .from('restaurantes')
        .select('id, estado_cuenta, terminos_aceptados')
        .eq('usuario_id', usuarioRow.id)
        .single();
      if (!rest) return usuarioRow;
      /* ¿tiene una liberación activa? entonces puede entrar pese al bloqueo */
      const { data: lib } = await window.treego_db
        .from('liberaciones_servicio')
        .select('id')
        .eq('tipo', 'restaurante').eq('entidad_id', rest.id).eq('activa', true)
        .limit(1);
      const liberado = lib && lib.length > 0;
      const ev = window.bloqueoRestaurante({ terminos_aceptados: rest.terminos_aceptados, estado_cuenta: rest.estado_cuenta }, new Date());
      if (ev.bloqueado && !liberado) {
        /* Caso accionable por el usuario: solo falta aceptar términos.
           Mantenemos la sesión y dejamos que el modal lo resuelva. */
        if (!rest.terminos_aceptados) {
          setTerminosPend(true);
          return null;
        }
        /* Otros bloqueos (pendiente/rechazado/moroso): fuera y avisar en login. */
        setBloqueo(ev.motivos[0].code);
        await window.treego_db.auth.signOut();
        return null;
      }
      return usuarioRow;
    }

    /* Marca términos como aceptados (RPC SECURITY DEFINER) y re-evalúa el acceso. */
    async function aceptarTerminos() {
      const { error } = await window.treego_db.rpc('aceptar_terminos_restaurante');
      if (error) return error;
      setTerminosPend(false);
      const { data: { session: s } } = await window.treego_db.auth.getSession();
      if (s) await loadUsuario(s.user);
      else setLoading(false);
      return null;
    }

    async function loadUsuario(authUser) {
      setLoading(true);
      const { data } = await window.treego_db
        .from('usuarios')
        .select('id, nombre, apellido, rol, email')
        .eq('email', authUser.email)
        .single();

      if (data) {
        setUsuario(await gateRestaurante(data));
        setLoading(false);
        return;
      }

      // Primer login tras confirmación de email: el perfil aún no existe.
      // Crearlo usando los metadatos guardados durante el registro.
      const meta = authUser.user_metadata || {};
      if (meta.nombre && meta.nombre_comercial) {
        const { data: nuevoUsuario, error: uErr } = await window.treego_db
          .from('usuarios')
          .insert({
            nombre:        meta.nombre,
            apellido:      meta.apellido || null,
            email:         authUser.email,
            rol:           'restaurante',
            activo:        true,
            password_hash: 'managed_by_supabase_auth',
          })
          .select('id, nombre, apellido, rol, email')
          .single();

        if (nuevoUsuario) {
          await window.treego_db
            .from('restaurantes')
            .insert({
              usuario_id:       nuevoUsuario.id,
              nombre_comercial: meta.nombre_comercial,
              municipio:        meta.municipio,
              telefono:         meta.telefono || null,
              email:            authUser.email,
              estado_cuenta:    'pendiente',
              terminos_aceptados: meta.terminos_aceptados === true,
            });
          /* cuenta nueva → queda en revisión, no entra al panel todavía */
          setUsuario(await gateRestaurante(nuevoUsuario));
        } else {
          console.error('[Treego] Error creando perfil en primer login:', uErr?.message);
          setUsuario(null);
        }
      } else {
        setUsuario(null);
      }
      setLoading(false);
    }

    async function signIn(email, password, captchaToken) {
      setBloqueo(null);
      setTerminosPend(false);
      const options = captchaToken ? { captchaToken } : undefined;
      const { error } = await window.treego_db.auth.signInWithPassword({ email, password, options });
      /* métrica de uso (F2 p48): un evento por login exitoso */
      if (!error) {
        try { window.treego_db.rpc('registrar_uso', { p_accion: 'login', p_valor: null }); } catch (e) { /* best-effort */ }
      }
      return error; /* null si OK, objeto error si falló */
    }

    async function signOut() {
      if (window.treegoCerrarCanales) window.treegoCerrarCanales(); /* F2 punto 23 */
      setBloqueo(null);
      setTerminosPend(false);
      await window.treego_db.auth.signOut();
    }

    return { session, usuario, loading, bloqueo, terminosPend, aceptarTerminos, signIn, signOut };
  }

  Object.assign(window, { useAuth });
})();
