using UnityEngine;
using EventsAppQuest.Application.Services;
using UnityEngine.SceneManagement;

namespace EventsAppQuest.Core
{
    /// <summary>
    /// Ponto de entrada da aplicacao; inicializa configuracao e servicos.
    /// Anexar a um GameObject na cena inicial (Bootstrap).
    /// </summary>
    public class AppBootstrap : MonoBehaviour
    {
        [SerializeField] private AppConfig _appConfig;

        private void Awake()
        {
            if (_appConfig == null)
            {
                Debug.LogError("[AppBootstrap] AppConfig is not assigned.");
                return;
            }

            var registry = ServiceRegistry.Instance;

            if (_appConfig.UseMockServices)
                registry.RegisterMockServices();

#if UNITY_ANDROID && !UNITY_EDITOR
            // Quando for build Android/Quest, substitui o status XR mock por uma detecção "real" básica.
            // O restante do runtime continua preparado para fallback caso XR ainda não esteja configurado/presente.
            registry.Register<EventsAppQuest.Application.Services.IQuestXRRuntimeStatusService>(
                new EventsAppQuest.Infrastructure.Services.QuestOpenXRRuntimeStatusService());
#endif

            var router = new SceneRouter();
            registry.Register<SceneRouter>(router);
            registry.Register<AppSession>(new AppSession());

            Debug.Log("[AppBootstrap] Services initialized.");

            // Para builds Android/Quest, a prioridade é abrir direto a cena de apresentação.
            // Isso evita depender de um flag serializado em `AppConfig.asset` (que pode estar incompleto no repo).
            var shouldOpenQuest = _appConfig.OpenQuestPresentationOnStartup;
#if UNITY_ANDROID && !UNITY_EDITOR
            shouldOpenQuest = true;
#endif

            if (shouldOpenQuest)
            {
                var activeName = SceneManager.GetActiveScene().name;
                if (!string.Equals(activeName, SceneRouter.QuestPresentationSceneName, System.StringComparison.OrdinalIgnoreCase))
                    router.LoadQuestPresentationScene();
            }
            else if (!string.IsNullOrEmpty(_appConfig.MainSceneName))
            {
                router.LoadScene(_appConfig.MainSceneName);
            }
        }
    }
}
