//#define ENABLE_LOGGING
namespace SRF.Service
{
    using System;
    using System.Collections;
    using System.Diagnostics;
    using UnityEngine;
    using Debug = UnityEngine.Debug;
    using Object = UnityEngine.Object;
    /// 
    /// A service which has async-loading dependencies
    /// 
    /// 
    public abstract class SRDependencyServiceBase : SRServiceBase, IAsyncService where T : class
    {
        private bool _isLoaded;
        protected abstract Type[] Dependencies { get; }
        public bool IsLoaded
        {
            get { return _isLoaded; }
        }
        [Conditional("ENABLE_LOGGING")]
        private void Log(string msg, Object target)
        {
//#if ENABLE_LOGGING
            Debug.Log(msg, target);
//#endif
        }
        protected override void Start()
        {
            base.Start();
            StartCoroutine(LoadDependencies());
        }
        /// 
        /// Invoked once all dependencies are loaded
        /// 
        protected virtual void OnLoaded() {}
        private IEnumerator LoadDependencies()
        {
            SRServiceManager.LoadingCount++;
            Log("[Service] Loading service ({0})".Fmt(GetType().Name), this);
            foreach (var d in Dependencies)
            {
                var hasService = SRServiceManager.HasService(d);
                Log("[Service] Resolving Service ({0}) HasService: {1}".Fmt(d.Name, hasService), this);
                if (hasService)
                {
                    continue;
                }
                var service = SRServiceManager.GetService(d);
                if (service == null)
                {
                    Debug.LogError("[Service] Could not resolve dependency ({0})".Fmt(d.Name));
                    enabled = false;
                    yield break;
                }
                var a = service as IAsyncService;
                if (a != null)
                {
                    while (!a.IsLoaded)
                    {
                        yield return new WaitForEndOfFrame();
                    }
                }
            }
            Log("[Service] Loading service ({0}) complete.".Fmt(GetType().Name), this);
            _isLoaded = true;
            SRServiceManager.LoadingCount--;
            OnLoaded();
        }
    }
}