using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;

public class InitialAngele
{
    public float Angle;
}
public class AssetManager : MonoSingleton<AssetManager>
{
    public static List<string> SourceInfos = new List<string>();
    public bool IsLocalBuildingsData;
    //场景初始旋转角度
    [HideInInspector] public float InitialAngle = 0;
    //主相机
    [HideInInspector] public GameObject MainCamera;
    //平面图相机
    [HideInInspector] public GameObject PlaneCamera;
    //主体
    public GameObject ZhuTi;
    //室内
    public GameObject ShiNei;
    //透明
    public GameObject Transparent;
    //漫游
    [HideInInspector] public GameObject RoamingAssets;
    //默认图片
    [HideInInspector] public Sprite DefaultSprite;
    //图标集
    [HideInInspector] public List<GameObject> Icons = new List<GameObject>();
    //设备列表
    public Devices DeviceList = new Devices();
    //WindZone
    [HideInInspector] public WindZone windZone;
    //城市代码
    [HideInInspector] public string CityCode = "110000";
    //实时天气请求地址
    [HideInInspector] public string WeatherCallPath = "https://restapi.amap.com/v3/weather/weatherInfo?city=";
    //天气Key
    [HideInInspector] public string Key = "3439b43eeadc76070ab66d522158a667";
    //态势标绘力量图标
    [HideInInspector] public SpriteAtlas PowerAtlas;
    //楼层按钮
    [HideInInspector] public List<FloorController> Floors = new List<FloorController>();
    //高亮
    public HighlightPlus.HighlightProfile highlightProfile;
    //态势标绘特效
    public List<GameObject> powerEffacts = new List<GameObject>();
    //态势标绘顶部信息
    public GameObject powerInfo;
    //态势标绘喷水特效
    public GameObject hose;
    //周边水源、行车路线信息
    public GameObject annotationInfo;
    public GameObject LoadingPanel;

    public List<GameObject> characters = new List<GameObject>();
    public GameObject yBot;
    private void Awake()
    {
        MainCamera = Camera.main.gameObject;

        if (windZone == null)
        {
            windZone = new GameObject().AddComponent<WindZone>();
            windZone.transform.parent = transform;
            windZone.name = "WindZone";
        }
        //获取模型旋转角度
        HttpManager.Instance.Get<InitialAngele>(HttpManager.Instance.GetInitialAnge, data => InitialAngle = data.Angle);
        //获取设备列表
        HttpManager.Instance.Get<Devices>(HttpManager.Instance.GetDeiveceList, data => DeviceList = data);
    }

    private void Start()
    {
        UIManager.Instance.Show<MainButtonsPanel>();
        UIManager.Instance.Show<CompassPanel>();
        UIManager.Instance.Show<FloorButtonsPanel>();
        LoadAssets();

        ShiNei = new GameObject("ShiNei");
        ShiNei.transform.parent = transform;
    }
    public void SetLoadingPanel(bool value)
    {
        LoadingPanel.SetActive(value);
    }

    private void LoadAssets()
    {
        Addressables.LoadAssetsAsync<GameObject>("Character", null).Completed += handle => { characters = handle.Result.ToList(); };
        Addressables.LoadAssetAsync<GameObject>("YBot").Completed += handle => { yBot = handle.Result; };

        //加载天空盒
        Addressables.InstantiateAsync("SkyController").Completed += SkyHandle;
        if (!IsLocalBuildingsData)
        {
            //外观
            Addressables.LoadAssetsAsync<GameObject>("ZhuTi", null).Completed += ZhuTiHandle;
            //室内
            //Addressables.LoadAssetsAsync<GameObject>("ShiNei", null).Completed += ShiNeiHandle;
            //场景
            Addressables.LoadAssetsAsync<GameObject>("Scene", null).Completed += SceneHandle;
            //透明建筑
            //Addressables.InstantiateAsync("Transparent").Completed += TransparentHandle;
        }
        //加载高度和毗邻资源
        Addressables.LoadAssetsAsync<GameObject>("Prop", null).Completed += PropHandle;
        //加载默认资源
        Addressables.LoadAssetsAsync<GameObject>("default", null).Completed += DefaultAssetsHandle;
        //图片展示面板默认图片
        Addressables.LoadAssetAsync<Sprite>("DefualtSprite").Completed += DefaultSpriteHandle;
        //设备图标
        Addressables.LoadAssetsAsync<GameObject>("Icon", null).Completed += IconsHandle;
        //态势标绘图标
        Addressables.LoadAssetAsync<SpriteAtlas>("Powers").Completed += PowerAtlasHandle;
        //态势标绘粒子特效
        Addressables.LoadAssetsAsync<GameObject>("power", null).Completed += PowerHandle;
        //态势标绘信息
        Addressables.LoadAssetAsync<GameObject>("PowerInfo").Completed += PowerInfoHandle;
        //态势标绘水流
        Addressables.LoadAssetAsync<GameObject>("Hose").Completed += HoseHandle;
        //行车路线周边水源信息
        Addressables.LoadAssetAsync<GameObject>("AnnotationInfo").Completed += AnnotationInfoHandle;
    }
    /// <summary>
    /// 获取透明建筑
    /// </summary>
    public void GetTransparent()
    {
        SetLoadingPanel(true);
        Addressables.InstantiateAsync("Transparent").Completed += TransparentHandle;
    }
    #region Private Funtions
    private void AnnotationInfoHandle(AsyncOperationHandle<GameObject> obj)
    {
        annotationInfo = obj.Result;
    }

    private void HoseHandle(AsyncOperationHandle<GameObject> obj)
    {
        hose = obj.Result;
    }

    private void PowerInfoHandle(AsyncOperationHandle<GameObject> obj)
    {
        powerInfo = obj.Result;
    }

    private void PowerHandle(AsyncOperationHandle<IList<GameObject>> obj)
    {
        powerEffacts = obj.Result as List<GameObject>;
    }

    private void SkyHandle(AsyncOperationHandle<GameObject> obj)
    {
        var sky = obj.Result;
        sky.name = "SkyController";
        sky.transform.parent = transform;
        //显示工具架
        UIManager.Instance.Show<ToolBarPanel>();
    }
    
    /// <summary>
    /// 加载态势标绘图标
    /// </summary>
    /// <param name="obj"></param>
    private void PowerAtlasHandle(AsyncOperationHandle<SpriteAtlas> obj)
    {
        PowerAtlas = obj.Result;
    }

    /// <summary>
    /// 加载高度和毗邻资源
    /// </summary>
    /// <param name="obj"></param>
    private void PropHandle(AsyncOperationHandle<IList<GameObject>> obj)
    {
        for (int i = 0; i < obj.Result.Count; i++)
        {
            GameObject go = Instantiate(obj.Result[i]);
            go.name = go.name.Replace("(Clone)", "");
            go.transform.parent = transform;
        }
    }
    /// <summary>
    /// 加载默认图片
    /// </summary>
    /// <param name="obj"></param>
    private void DefaultSpriteHandle(AsyncOperationHandle<Sprite> obj)
    {
        DefaultSprite = obj.Result;
    }
    /// <summary>
    /// 加载设备图标
    /// </summary>
    /// <param name="obj"></param>
    private void IconsHandle(AsyncOperationHandle<IList<GameObject>> obj)
    {
        Icons = obj.Result as List<GameObject>;
    }

    /// <summary>
    /// 加载场景
    /// </summary>
    /// <param name="obj"></param>
    private void SceneHandle(AsyncOperationHandle<IList<GameObject>> obj)
    {
        GameObject sc = new GameObject() { name = "Scene" };
        sc.transform.parent = transform;
        SpawnBuildings(obj, sc.transform, false);
    }

    /// <summary>
    /// 加载室内模型
    /// </summary>
    /// <param name="obj"></param>
    //private void ShiNeiHandle(AsyncOperationHandle<IList<GameObject>> obj)
    //{
    //    GameObject shinei = new GameObject() { name = "ShiNei" };
    //    shinei.transform.parent = transform;
    //    ShiNei = shinei;
    //    SpawnBuildings(obj, shinei.transform, true);
    //}

    /// <summary>
    /// 加载主体模型
    /// </summary>
    /// <param name="obj"></param>
    private void ZhuTiHandle(AsyncOperationHandle<IList<GameObject>> obj)
    {
        GameObject zhuti = new GameObject() { name = "ZhuTi" };
        zhuti.transform.parent = transform;
        ZhuTi = zhuti;
        SpawnBuildings(obj, zhuti.transform, false);
    }
    /// <summary>
    /// 加载透明建筑
    /// </summary>
    /// <param name="obj"></param>
    private void TransparentHandle(AsyncOperationHandle<GameObject> obj)
    {
        Transparent = obj.Result;
        Transparent.name = "Transparent";
        Transparent.transform.parent = transform;
        SetLoadingPanel(false);
    }
    /// <summary>
    /// 加载默认资源
    /// </summary>
    /// <param name="obj"></param>
    private void DefaultAssetsHandle(AsyncOperationHandle<IList<GameObject>> obj)
    {
        var list = obj.Result as List<GameObject>;
        //平面图相机
        PlaneCamera = Instantiate(list.Find(go => go.name == "PlaneCamera"));
        PlaneCamera.name = "PlaneCamera";
        PlaneCamera.SetActive(false);
        PlaneCamera.transform.parent = transform;
        //设备
        var EM = Instantiate(list.Find(go => go.name == "EquipmentManager"));
        EM.name = "EquipmentManager";
        EM.transform.parent = transform;
        //power
        var PM = Instantiate(list.Find(go => go.name == "PowerManager"));
        PM.name = "PowerManager";
        PM.transform.parent = transform;
    }
    #endregion

    void SpawnBuildings(AsyncOperationHandle<IList<GameObject>> obj, Transform Parent, bool indoor)
    {
        for (int i = 0; i < obj.Result.Count; i++)
        {
            GameObject go = Instantiate(obj.Result[i]);
            go.name = go.name.Replace("(Clone)", "");
            go.transform.parent = Parent;
        }

    }
}