/**
 * WaLe | Marroquinería Sustentable (@wale.arg)
 * src/firebase-bridge.ts - Enlace entre Firebase Firestore en la nube y la interfaz de usuario
 */
import { 
  app,
  db,
  auth,
  testConnection,
  subscribeToProducts,
  fetchProductsOnce,
  saveProductToFirestore,
  deleteProductFromFirestore,
  seedProductsIfEmpty,
  subscribeToMessages,
  saveMessageToFirestore,
  updateMessageStatusInFirestore,
  deleteMessageFromFirestore,
  signInAdminWithGoogle,
  signOutAdmin,
  onAdminAuth,
  type ProductItem,
  type MessageItem
} from './firebase';

declare global {
  interface Window {
    WaleFirebase?: {
      isReady: boolean;
      currentUser: any;
      testConnection: () => Promise<boolean>;
      saveProduct: (prod: ProductItem) => Promise<void>;
      deleteProduct: (id: string) => Promise<void>;
      saveMessage: (msg: MessageItem) => Promise<void>;
      updateMessageStatus: (id: string, status: string) => Promise<void>;
      deleteMessage: (id: string) => Promise<void>;
      syncInitialCatalogToCloud: () => Promise<void>;
      signInWithGoogle: () => Promise<any>;
      signOut: () => Promise<void>;
      onAuthChange: (cb: (user: any) => void) => () => void;
    };
    DEFAULT_PRODUCTS?: ProductItem[];
  }
}

// Inicializar el objeto global WaleFirebase
window.WaleFirebase = {
  isReady: false,
  currentUser: null,
  testConnection,
  saveProduct: saveProductToFirestore,
  deleteProduct: deleteProductFromFirestore,
  saveMessage: saveMessageToFirestore,
  updateMessageStatus: updateMessageStatusInFirestore,
  deleteMessage: deleteMessageFromFirestore,
  syncInitialCatalogToCloud: async () => {
    const defaults = window.DEFAULT_PRODUCTS || [];
    if (defaults.length > 0) {
      console.log('[WaLe Bridge] Sincronizando catálogo predeterminado a Firestore...');
      for (const p of defaults) {
        await saveProductToFirestore(p);
      }
    }
  },
  signInWithGoogle: signInAdminWithGoogle,
  signOut: signOutAdmin,
  onAuthChange: onAdminAuth
};

// Escuchar cambios de autenticación
onAdminAuth((user) => {
  if (window.WaleFirebase) {
    window.WaleFirebase.currentUser = user;
  }
  window.dispatchEvent(new CustomEvent('wale_auth_changed', { detail: user }));
});

// Sincronización en tiempo real de productos para toda la tienda
let unsubscribeProducts: (() => void) | null = null;
let unsubscribeMessages: (() => void) | null = null;

function setupRealtimeSync() {
  try {
    unsubscribeProducts = subscribeToProducts(async (cloudProducts) => {
      console.log(`[WaLe Cloud] Sincronizados ${cloudProducts.length} productos desde Firestore.`);
      
      // Si la base de datos en la nube está completamente vacía, la inicializamos con el catálogo por defecto
      if (cloudProducts.length === 0) {
        const defaults = window.DEFAULT_PRODUCTS || [];
        if (defaults.length > 0 && window.WaleFirebase?.currentUser) {
          console.log('[WaLe Cloud] Inicializando base de datos en la nube con productos iniciales...');
          await seedProductsIfEmpty(defaults);
          return;
        }
      }

      if (cloudProducts.length > 0) {
        // Actualizar almacenamiento local para respaldo y renderizado instantáneo
        try {
          localStorage.setItem('wale_products_v5', JSON.stringify(cloudProducts));
        } catch (e) {
          console.warn('[WaLe Cloud] Cache local no actualizada:', e);
        }

        // Notificar a las vistas (catálogo, home, panel de administración)
        window.dispatchEvent(new CustomEvent('wale_products_updated', { detail: cloudProducts }));
      }
    }, (err) => {
      console.warn('[WaLe Cloud] Modo de lectura local activo mientras se conecta con Firestore:', err);
    });

    // En el panel de admin o formularios, sincronizar mensajes
    if (window.location.pathname.includes('admin') || document.getElementById('admin-dashboard')) {
      unsubscribeMessages = subscribeToMessages((cloudMessages) => {
        try {
          localStorage.setItem('wale_messages_v2', JSON.stringify(cloudMessages));
        } catch (e) {
          console.warn('[WaLe Cloud] Cache local de mensajes no actualizada:', e);
        }
        window.dispatchEvent(new CustomEvent('wale_messages_updated', { detail: cloudMessages }));
      });
    }

    if (window.WaleFirebase) {
      window.WaleFirebase.isReady = true;
    }
    window.dispatchEvent(new CustomEvent('wale_firebase_ready'));
  } catch (err) {
    console.error('[WaLe Bridge] Error al configurar sincronización en tiempo real:', err);
  }
}

// Ejecutar inmediatamente o tras DOMContentLoaded
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', setupRealtimeSync);
} else {
  setupRealtimeSync();
}
