using UnityEngine;
using Zenject;
using DanroJump.Audio;
using DanroJump.Prizes;
using DanroJump.SceneFlow;
namespace DanroJump.Settings
{
///
/// ProjectContext/SceneContext installer сервисных настроек.
/// ProjectContext/SceneContext installer глобальных сервисов.
///
public sealed class AppServicesInstaller : MonoInstaller
{
[SerializeField] private string databaseAddress = ServiceSettingsAddressKeys.Database;
[SerializeField] private ServiceSettingsDatabase fallbackDatabase;
[SerializeField] private GameAudioSettings audioSettings;
[SerializeField] private string fileName = "service-settings.json";
[SerializeField] private string prizeSessionStateFileName = "prize-session-state.json";
[SerializeField] private bool loadImmediately = true;
[SerializeField] private bool bindActionsInScene = true;
///
/// Загружает базу настроек, создает сервис и регистрирует его в DI-контейнере.
///
public override void InstallBindings()
{
var databaseProvider = new AddressableServiceSettingsDatabaseProvider(databaseAddress, fallbackDatabase);
var database = databaseProvider.Load();
if (database == null)
{
Debug.LogError($"{nameof(AppServicesInstaller)} could not load {nameof(ServiceSettingsDatabase)}.", this);
databaseProvider.Dispose();
Container.BindInterfacesAndSelfTo().AsSingle();
return;
}
var repository = new JsonServiceSettingsRepository(fileName);
var prizeSessionRepository = new JsonPrizeSessionStateRepository(prizeSessionStateFileName);
var service = new ServiceSettingsService(database, repository);
if (loadImmediately)
{
service.Load();
}
Container.BindInstance(database).AsSingle();
Container.Bind().FromInstance(databaseProvider).AsSingle();
Container.Bind().FromInstance(databaseProvider).AsSingle();
Container.Bind().FromInstance(repository).AsSingle();
Container.Bind().FromInstance(service).AsSingle();
Container.Bind().FromInstance(service).AsSingle();
Container.Bind().FromInstance(prizeSessionRepository).AsSingle();
Container.BindInterfacesAndSelfTo().AsSingle();
Container.BindInterfacesAndSelfTo().AsSingle();
if (audioSettings != null)
{
Container.BindInstance(audioSettings).AsSingle();
}
Container.BindInterfacesAndSelfTo().AsSingle().NonLazy();
Container.BindInterfacesTo().AsSingle().WithArguments(bindActionsInScene).NonLazy();
}
}
}