/**
 * Auto-sync mientras hay un proyecto abierto. Dispara una sincronización:
 *  - al recuperar la conexión,
 *  - al volver la app a primer plano,
 *  - periódicamente (intervalo suave),
 * con un candado para no solapar ciclos. La sincronización en segundo plano con
 * la app cerrada queda fuera de v1.
 */
import NetInfo from '@react-native-community/netinfo';
import { useEffect, useRef } from 'react';
import { AppState } from 'react-native';
import { isOnline } from '../net/connectivity';

const INTERVAL_MS = 60_000;

export function useAutoSync(enabled: boolean, run: () => Promise<void>) {
  const running = useRef(false);
  // Mantener la última `run` sin re-suscribir los listeners en cada render.
  const runRef = useRef(run);
  runRef.current = run;

  useEffect(() => {
    if (!enabled) return;

    const trigger = async () => {
      if (running.current) return;
      if (!(await isOnline())) return;
      running.current = true;
      try {
        await runRef.current();
      } catch {
        // silencioso: el estado/errores se reflejan en el outbox y la barra
      } finally {
        running.current = false;
      }
    };

    // Al recuperar conexión.
    const unsubNet = NetInfo.addEventListener((state) => {
      if (state.isConnected && state.isInternetReachable !== false) void trigger();
    });

    // Al volver a primer plano.
    const sub = AppState.addEventListener('change', (s) => {
      if (s === 'active') void trigger();
    });

    // Intervalo suave.
    const id = setInterval(() => void trigger(), INTERVAL_MS);

    // Un primer intento al montar.
    void trigger();

    return () => {
      unsubNet();
      sub.remove();
      clearInterval(id);
    };
  }, [enabled]);
}
