using UnityEngine;
using Zenject;
using DanroJump.SceneFlow;
namespace DanroJump.Settings
{
///
/// MonoBehaviour-фасад для вызова действий приложения из UI/Unity Events.
///
public sealed class AppUIFacade : MonoBehaviour
{
private IServiceSettingsService settings;
private ISceneFlowService sceneFlow;
///
/// Получает сервис настроек через Extenject.
///
[Inject]
public void Construct(
IServiceSettingsService injectedSettings,
[InjectOptional] ISceneFlowService injectedSceneFlow = null)
{
settings = injectedSettings;
sceneFlow = injectedSceneFlow;
}
///
/// Вручную назначает сервис настроек, если объект используется вне DI.
///
public void Configure(IServiceSettingsService service, ISceneFlowService injectedSceneFlow = null)
{
settings = service;
sceneFlow = injectedSceneFlow ?? sceneFlow;
}
///
/// Сохраняет настройки.
///
public void Save()
{
settings?.Save();
}
///
/// Перечитывает настройки, разрешенные для изменения через внешний JSON.
///
public void ReloadExternalChanges()
{
settings?.ReloadExternalChanges();
}
///
/// Повторно применяет текущие значения настроек.
///
public void ApplyAll()
{
settings?.ApplyAll();
}
///
/// Сбрасывает все настройки к значениям по умолчанию.
///
public void ResetAllToDefaults()
{
settings?.ResetAllToDefaults();
}
///
/// Сбрасывает одну группу настроек к значениям по умолчанию.
///
public void ResetGroupToDefaults(string groupName)
{
settings?.ResetGroupToDefaults(groupName);
}
///
/// Открывает папку persistentDataPath с внешним JSON настроек.
///
public void OpenPersistentDataFolder()
{
Application.OpenURL($"file://{Application.persistentDataPath}");
}
///
/// Загружает сцену по имени.
///
public void LoadScene(string sceneName)
{
var resolvedSceneFlow = GetSceneFlow();
if (!string.IsNullOrWhiteSpace(sceneName) && resolvedSceneFlow != null)
{
resolvedSceneFlow.LoadScene(sceneName);
}
}
///
/// Возвращает приложение в главное меню.
///
public void LoadMainMenu()
{
GetSceneFlow()?.OpenMainMenu();
}
private ISceneFlowService GetSceneFlow()
{
if (sceneFlow == null)
{
Debug.LogWarning($"{nameof(AppUIFacade)} requires {nameof(ISceneFlowService)} from DI.", this);
}
return sceneFlow;
}
///
/// Завершает приложение или останавливает Play Mode в редакторе.
///
public void QuitApplication()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
}
}