using System;
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;

namespace InterfaceOff
{
    public class WindowSpawner : MonoBehaviour
    {
        private List<Type> WindowTypes { get; } = new();

        [field: SerializeField] private GameObject SampleChild { get; set; }
        [field: SerializeField] private Canvas GameCanvas { get; set; }

        [field: SerializeField] public bool AutoSpawn { get; private set; } = true;

        private void Awake()
        {
            /* Fetches all window types created */
            Type[] types = typeof(WindowBase).Assembly.GetTypes();
            foreach (Type t in types)
            {
                if (t.IsSubclassOf(typeof(WindowBase)))
                {
                    WindowTypes.Add(t);
                }
            }

            /* Logs the amount of types found and errors if there is none */
            Debug.Log($"Found [{WindowTypes.Count}] different window types ");
            if (WindowTypes.Count == 0)
            {
                Debug.LogError("Could not find any window types");
            }
        }

        private void SpawnNewRandomWindow()
        {
            /* Creates the gameobject with a random class */
            GameObject go = Instantiate(SampleChild, GameCanvas.transform);
            go.SetActive(true);

            Type type = WindowTypes.GetRandom();
            WindowBase windowBase = go.AddComponent(type) as WindowBase;

            /* Checks it created correctly before instantiating further */
            if (DebugUtils.IsNull(windowBase))
            {
                Debug.LogError("How did this happen");
                return;
            }

            /* Makes sure the WindowInteractions and WindowComponents are setup before passing to user code */
            windowBase.Interactions = go.GetComponent<WindowInteractions>();
            windowBase.Interactions.SetAttachedTo(windowBase);

            windowBase.Components = go.GetComponent<WindowComponents>();
            windowBase.InstantiateWindowBase();
        }

        private void FixedUpdate()
        {
            if (AutoSpawn)
            {
                /* Checks if it should spawn a window */
                bool shouldSpawn = Random.Range(0, 60) == 0;
                if (shouldSpawn)
                {
                    SpawnNewRandomWindow();
                }
            }
        }

        private void Update()
        {
            if (!AutoSpawn)
            {
                if (Input.GetKeyDown(KeyCode.Space))
                {
                    SpawnNewRandomWindow();
                }
            }
        }
    }
}
