/**
 * PDF Builder React - API Globale
 * Expose l'interface de communication entre WordPress et le bundle React
 */

import { debugError, debugWarn } from '../utils/debug';
import { TemplateState, BuilderState } from '../types/elements';

// Stocker les références globales
let editorInstance: unknown = null;
let currentTemplate: TemplateState | null = null;
let editorState: BuilderState | null = null;

/**
 * Enregistre l'instance de l'éditeur
 */
export function registerEditorInstance(instance: unknown) {
  editorInstance = instance;

}

/**
 * Charge un template dans l'éditeur
 */
export async function loadTemplate(templateData: any) {

  try {
    currentTemplate = templateData;

    // Dispatcher un événement personnalisé que PDFBuilder écoutera
    const event = new CustomEvent('pdfBuilderLoadTemplate', {
      detail: templateData
    });

    document.dispatchEvent(event);

    return true;
  } catch (error) {
    
    return false;
  }
}

/**
 * Récupère l'état actuel de l'éditeur
 */
export function getEditorState() {

  
  if (!editorInstance) {
    debugWarn('[Global API] Editor instance not available for state');
    return null;
  }
  
  return editorState;
}

/**
 * Met à jour l'état de l'éditeur
 */
export function setEditorState(state: BuilderState) {

  editorState = state;
}

/**
 * Récupère le template actuel
 */
export function getCurrentTemplate() {
  return currentTemplate;
}

/**
 * Exporte les données du template
 */
export function exportTemplate() {

  
  if (!editorInstance) {
    debugError('[Global API] Editor instance not available');
    return null;
  }

  return {
    template: currentTemplate,
    state: editorState,
    timestamp: new Date().toISOString()
  };
}

/**
 * Sauvegarde un template
 */
export async function saveTemplate(templateData: TemplateState) {

  
  try {
    currentTemplate = templateData;
    
    // Dispatcher un événement personnalisé
    const event = new CustomEvent('pdfBuilderSaveTemplate', {
      detail: templateData
    });
    
    document.dispatchEvent(event);

    
    return true;
  } catch (error) {
    debugError('[Global API] Error saving template', error);
    return false;
  }
}

/**
 * Réinitialise l'API
 */
export function resetAPI() {

  editorInstance = null;
  currentTemplate = null;
  editorState = null;
}

/**
 * Met à jour les dimensions du canvas
 */
export function updateCanvasDimensions(width: number, height: number) {
  try {
    // Mettre à jour l'objet window global
    if (!window.pdfBuilderCanvasSettings) {
      window.pdfBuilderCanvasSettings = {};
    }
    window.pdfBuilderCanvasSettings.canvas_width = width;
    window.pdfBuilderCanvasSettings.canvas_height = height;

    // Dispatcher un événement pour notifier le contexte React
    const event = new CustomEvent('pdfBuilderCanvasSettingsUpdated');
    window.dispatchEvent(event);

    return true;
  } catch (error) {
    debugError('[Global API] Error updating canvas dimensions', error);
    return false;
  }
}

/**
 * Met à jour les paramètres de rotation
 */
export function updateRotationSettings(enabled: boolean) {
  try {
    // Mettre à jour l'objet window global
    if (!window.pdfBuilderCanvasSettings) {
      window.pdfBuilderCanvasSettings = {};
    }
    window.pdfBuilderCanvasSettings.enable_rotation = enabled;

    // Dispatcher un événement pour notifier le contexte React
    const event = new CustomEvent('pdfBuilderCanvasSettingsUpdated');
    window.dispatchEvent(event);

    return true;
  } catch (error) {
    debugError('[Global API] Error updating rotation settings', error);
    return false;
  }
}

/**
 * Interface de l'API globale
 */
export interface GlobalAPI {
  registerEditorInstance: typeof registerEditorInstance;
  loadTemplate: typeof loadTemplate;
  getEditorState: typeof getEditorState;
  setEditorState: typeof setEditorState;
  getCurrentTemplate: typeof getCurrentTemplate;
  exportTemplate: typeof exportTemplate;
  saveTemplate: typeof saveTemplate;
  resetAPI: typeof resetAPI;
  updateCanvasDimensions: typeof updateCanvasDimensions;
  updateRotationSettings: typeof updateRotationSettings;
}




