// Auto-sync da fila offline ao recuperar conexão.
// NFR-2.3: detecta retorno de conexão e sincroniza sem ação do usuário.
// NFR-2.4: falhas visíveis — nunca descarta pedido silenciosamente.

import { useEffect, useCallback } from 'react';
import { useQueryClient } from '@tanstack/react-query';
import {
  listPendingOrders,
  removePendingOrder,
  markOrderFailed,
  type PendingOrder,
} from '../offline/order-queue';
import { apiFetch } from '../api-client';

export function useOfflineSync() {
  const qc = useQueryClient();

  const sync = useCallback(async () => {
    const pending: PendingOrder[] = await listPendingOrders();
    const toSync = pending.filter((o: PendingOrder) => o.status === 'pending');
    if (toSync.length === 0) return;

    for (const order of toSync as PendingOrder[]) {
      try {
        const created = (await apiFetch('/orders', {
          method: 'POST',
          body: order.payload,
        })) as { id: string };

        // Tenta transmitir — bloqueio duro se acima da alçada; deixa como Orçamento
        try {
          await apiFetch(`/orders/${created.id}/transmit`, { method: 'PATCH' });
        } catch {
          // Desconto acima da alçada: pedido fica como Orçamento, rep transmite manualmente
        }

        await removePendingOrder(order.idempotencyKey);
      } catch (e) {
        const reason = e instanceof Error ? e.message : 'Erro ao sincronizar pedido';
        await markOrderFailed(order.idempotencyKey, reason);
      }
    }

    // Notifica UI para re-render das listas
    window.dispatchEvent(new CustomEvent('sar:sync-complete'));
    void qc.invalidateQueries({ queryKey: ['orders'] });
    void qc.invalidateQueries({ queryKey: ['dashboard'] });
  }, [qc]);

  useEffect(() => {
    // Sync imediato no mount se houver fila e conexão
    if (navigator.onLine) void sync();

    const handleOnline = () => void sync();
    const handleRequest = () => void sync();
    window.addEventListener('online', handleOnline);
    window.addEventListener('sar:sync-request', handleRequest);
    return () => {
      window.removeEventListener('online', handleOnline);
      window.removeEventListener('sar:sync-request', handleRequest);
    };
  }, [sync]);
}
