using System.Threading.Tasks;
using RMC.Core.Exceptions;
using UnityEngine;
namespace RMC.Backend.Baas.Aws
{
///
/// The main entry point for this
///
/// J.A.W.S. For Unity
/// * Just (For Unity And)
/// * Amazon
/// * Web
/// * Services
///
///
public class Jaws : IBackendSystem
{
// Events ----------------------------------------
public BackendSystemEvent OnInitialized { get; } = new BackendSystemEvent();
// Properties ------------------------------------
public static Jaws Instance
{
get
{
if (_Instance == null)
{
_Instance = new Jaws();
}
return _Instance;
}
}
public bool IsInitialized { get { return _isInitialized; }}
public IAccountsSubsystem Accounts { get { return _accounts; }}
public IDatabaseSubsystem Database { get { return _database; }}
public ICloudCodeSubsystem CloudCode { get { return _cloudCode; }}
public IAISubsystem AI { get { return _ai; }}
// Fields ----------------------------------------
private bool _isInitialized = false;
private readonly JawsAccountsSubsystem _accounts;
private readonly JawsCloudCodeSubsystem _cloudCode;
private readonly JawsDatabaseSubsystem _database;
private readonly JawsAISubsystem _ai;
// Statics ----------------------------------------
private static Jaws _Instance = null;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void InitializeOnLoad()
{
//Manually clear since fast compile is supported
//https://docs.unity3d.com/6000.0/Documentation/ScriptReference/InitializeOnEnterPlayModeAttribute.html
_Instance = null;
}
// Initialization --------------------------------
private Jaws()
{
// Create all subsystems in constructor
// To allow for any early subscriptions
_accounts = new JawsAccountsSubsystem();
_cloudCode = new JawsCloudCodeSubsystem();
_database = new JawsDatabaseSubsystem();
_ai = new JawsAISubsystem();
}
///
/// Initialize
///
public async Task InitializeAsync()
{
if (_isInitialized)
{
return;
}
_isInitialized = true;
// Initialize Subsystems
await _accounts.InitializeAsync();
await _cloudCode.InitializeAsync();
await _database.InitializeAsync();
await _ai.InitializeAsync();
//
OnInitialized.Invoke(this);
}
///
/// Require initialization. Usage is optional
///
///
public void RequireIsInitialized()
{
if (!IsInitialized)
{
throw new NotInitializedException(this);
}
}
// Methods ---------------------------------------
}
}