using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using RecrownedAthenaeum.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RecrownedAthenaeum.Input
{
    public static class InputUtilities
    {
        public static List<IInputListener> InputListeners;
        static KeyboardState keyboardState;
        static MouseState mouseState;

        static InputUtilities()
        {
            InputListeners = new List<IInputListener>();
        }

        public static void Update()
        {
            KeyboardState updatedKeyboardState = Keyboard.GetState();
            MouseState updatedMouseState = Mouse.GetState();
            bool disableKeyboard = false;
            bool disableMouse = false;
            foreach (IInputListener inputListener in InputListeners)
            {
                if (!disableKeyboard && keyboardState != updatedKeyboardState)
                {
                    disableKeyboard = inputListener.KeyboardStateChanged(updatedKeyboardState);
                }
                if (!disableMouse && mouseState != updatedMouseState)
                {
                    disableMouse = inputListener.MouseStateChanged(updatedMouseState);
                }
                if (disableKeyboard && disableMouse)
                {
                    break;
                }
            }

            UpdateStates();
        }

        public static bool MouseClicked()
        {
            if (mouseState.LeftButton == ButtonState.Pressed)
            {
                return Mouse.GetState().LeftButton != ButtonState.Pressed;
            }
            return false;
        }

        private static void UpdateStates()
        {
            keyboardState = Keyboard.GetState();
            mouseState = Mouse.GetState();
        }

        public static bool MouseWithinBoundries(Rectangle bounds)
        {
            MouseState mouseState = Mouse.GetState();
            if (mouseState.X >= bounds.X && mouseState.X <= (bounds.X + bounds.Width) && mouseState.Y >= bounds.Y && mouseState.Y <= (bounds.Y + bounds.Height))
            {
                return true;
            }
            return false;
        }
    }
}