/**
 * @fileoverview Hook para gerenciar o ciclo de vida de uma instância Phaser.
 *
 * Encapsula: criação, destruição e resize da instância Phaser em resposta
 * a mudanças de fase, fábrica de jogo e modo mobile.
 *
 * @module hooks.usePhaser
 */

import { useRef, useEffect } from "react";
import Phaser from "phaser";
import { useIsMobile } from "./useIsMobile";

/**
 * Hook que gerencia o ciclo de vida de uma instância Phaser.
 *
 * @param {Object}   options
 * @param {Function} options.gameFactory          - Fábrica que cria a config Phaser
 * @param {Object}   options.phaseConfig          - Configuração da fase atual
 * @param {number}   options.currentPhase         - Número da fase atual
 * @param {Function} [options.customFailureHandler] - Handler customizado de falha
 * @param {Object}   options.gameConfig           - Configuração completa do jogo
 *
 * @returns {{ gameContainerRef: React.RefObject<HTMLDivElement> }}
 */
export function usePhaser({
  gameFactory,
  phaseConfig,
  currentPhase,
  customFailureHandler,
  gameConfig,
}) {
  const gameContainerRef = useRef(null);
  const gameInstanceRef = useRef(null);
  const isInitializingRef = useRef(false);
  const isMobile = useIsMobile();

  // Redimensiona Phaser ao alternar entre mobile e desktop.
  useEffect(() => {
    if (gameInstanceRef.current && gameContainerRef.current) {
      const phaserScale = gameInstanceRef.current.scale;
      phaserScale.resize(
        gameContainerRef.current.clientWidth,
        gameContainerRef.current.clientHeight,
      );
    }
  }, [isMobile]);

  // (Re)inicializa Phaser quando a fase ou a fábrica mudam.
  useEffect(() => {
    if (isInitializingRef.current) {
      return;
    }

    isInitializingRef.current = true;

    if (gameInstanceRef.current) {
      try {
        gameInstanceRef.current.destroy(true);
      } catch (error) {
        console.warn("Erro ao destruir Phaser:", error);
      }
      gameInstanceRef.current = null;
    }

    // Aguardar um frame para garantir que o cleanup foi concluído.
    const timeoutId = setTimeout(() => {
      try {
        if (!gameContainerRef.current) {
          console.warn("Container do jogo não disponível");
          isInitializingRef.current = false;
          return;
        }

        const config = gameFactory(
          gameContainerRef.current,
          phaseConfig,
          customFailureHandler,
          currentPhase,
          gameConfig,
        );
        gameInstanceRef.current = new Phaser.Game(config);
      } catch (error) {
        console.error("Erro ao inicializar Phaser:", error);
      } finally {
        isInitializingRef.current = false;
      }
    }, 10);

    return () => {
      clearTimeout(timeoutId);

      if (gameInstanceRef.current) {
        try {
          gameInstanceRef.current.destroy(true);
        } catch (error) {
          console.warn("Erro durante cleanup do Phaser:", error);
        }
        gameInstanceRef.current = null;
      }

      isInitializingRef.current = false;
    };
  }, [gameFactory, currentPhase, customFailureHandler]); // eslint-disable-line react-hooks/exhaustive-deps

  return { gameContainerRef };
}
