using System;
using System.Collections.Generic;
using UI;
using UnityEngine;

namespace Level
{
    public class LevelManager : MonoBehaviour
    {
        private static LevelManager _instance = null;
        public static LevelManager Instance
        {
            get
            {
                if (_instance == null)
                {
                    GameObject gameObject = new GameObject("Level Manager");
                    _instance = gameObject.AddComponent<LevelManager>();
                    _instance.Initialize();
                }

                return _instance;
            }
        }

        private Dictionary<string, Level> _levels = null;
        public Dictionary<string, Level> Levels
        {
            get
            {
                if (_levels == null)
                    Initialize();

                return _levels;
            }
        }

        private Level currentLevel = null;

        private void Awake()
        {
            if (_instance == null)
                _instance = this;

            if (_instance != this)
                Destroy(this);
        }

        private void Initialize()
        {
            GameObject[] levelPrefabs = Resources.LoadAll<GameObject>("Levels/");
            Transform levelContainer = new GameObject("Levels").transform;
            _levels = new Dictionary<string, Level>(levelPrefabs.Length);

            System.Array.Sort(levelPrefabs, (x, y) => Int32.Parse(x.name).CompareTo(Int32.Parse(y.name)));

            GameObject levelInstance = null;
            Level level = null;
            foreach (GameObject levelPrefab in levelPrefabs)
            {
                levelInstance = new GameObject(levelPrefab.gameObject.name);
                levelInstance.transform.SetParent(levelContainer);
                level = levelInstance.AddComponent<Level>();
                level.SetLevel(levelPrefab.name);
                _levels.Add(levelPrefab.gameObject.name, level);
            }
        }

        public void SwitchToLevel(string levelName)
        {
            DisableAllLevels();

            currentLevel = Levels[levelName];
            currentLevel.Enable();

            // TODO Move Player To currentLevel.StartingPoint

            UIManager.Instance.CloseAllCanvases();
        }

        private void DisableAllLevels()
        {
            foreach (Level level in Levels.Values)
                level.Disable();
        }
    }
}
