namespace Guru
{
    using System;
    using UnityEngine;
    
    /// <summary>
    /// 屏幕方向
    /// </summary>
    public enum ScreenOrientation
    {
        Portrait = 0,
        Landscape,
    }
    
    
    public interface IDisposable
    {
        void Dispose();
    }
    
    public interface IContext
    {
        //--------- Components -----------------
        bool RegisterResManager<T>(T manager, string name = "") where T : IResManager, new();
        T GetResManager<T>(string name = "") where T : IResManager, new();

        bool RegisterModel<T>(T model, string name = "") where T : IModel, new();
        T GetModel<T>(string name = "") where T : IModel, new();
        
        bool RegisterController<T>(T controller, string name = "") where T : IController, new();
        T GetController<T>(string name = "") where T : IController, new();
        
        bool RegisterHelper<T>(T controller, string name = "") where T : IHelper, new();
        T GetHelper<T>(string name = "") where T : IHelper, new();
        
        
        void RegisterUpdater(IUpdater updater);
        void UnregisterUpdater(IUpdater updater);
        
    }

    /// <summary>
    /// 消息管线
    /// </summary>
    public interface IEventPipeline
    {
        //--------- Event Bus ------------------
        public void Subscribe<T>(Action<T> onReceiveMessage) where T : struct;
        public void Unsubscribe<T>(Action<T> onReceiveMessage) where T : struct;
        public void Send<T>(T message) where T : struct;
    }
    
    /// <summary>
    /// 控制器接口
    /// </summary>
    public interface IController
    {
        string Name { get;}
        Context Context { get; set;}
        void Init();
    }
    
    public interface IModel
    {
        string Name { get;}
        void Update(); // 数据刷新
    }
    
    public interface IView
    {
        string Name { get;}
        void Refresh();  // UI 刷新
    }

    public interface IHelper
    {
        string Name { get;}
        Context Context { get; set;}
    }

    public interface IResManager
    {
        string Name { get;}
        Context Context { get; set;}
        void Init();
        T Load<T>(string resUri) where T : UnityEngine.Object;
        void LoadAsync(string resUri, Action<ResLoadInfo> onLoaded);
    }
    
    /// <summary>
    /// 资源加载器
    /// </summary>
    public interface IResLoader
    {
        void LoadAsync(string resUri, Action<ResLoadInfo> onLoaded);
    }

    /// <summary>
    /// 更新器
    /// </summary>
    public interface IUpdater
    {
        void OnUpdate();
        bool IsStopped { get; set; }
    }
    
    /// <summary>
    /// 资源加载信息
    /// </summary>
    public class ResLoadInfo
    {
        public string uri = "";
        
        public bool success = false;  // 加载是否成功

        public string bundleName = ""; // bundle包的名称

        public object target = null;

        public ResLoadInfo()
        {
        }

        public ResLoadInfo(string uri)
        {
            this.uri = uri;
        }


        public GameObject AsGameObject() => target as GameObject;
        public Texture AsTexture() => target as Texture;
        public T AsObject<T>() where T : UnityEngine.Object => (T)target;
        public string AsString() => (target as TextAsset)?.text ?? "";
        public byte[] AsBinary() => (byte[])target;
    }




}