using System;

namespace GlitchyEngine.Events
{
	public abstract class KeyEvent : Event
	{
		protected Key _keyCode;

		[Inline]
		public Key KeyCode => _keyCode;

		public override EventCategory Category => .Input | .Keyboard

		protected this(Key keyCode)
		{
			_keyCode = keyCode;
		}
	}

	public class KeyPressedEvent : KeyEvent, IEvent
	{
		private int32 _repeatCount;
		
		public int32 RepeatCount => _repeatCount;

		public override EventType EventType => .KeyPressed;
		public static EventType StaticType => .KeyPressed;

		public override StringView Name => "KeyPressed";

		public this(Key keyCode, int32 repeatCount) : base(keyCode)
		{
			_repeatCount = repeatCount;
		}

		public override void ToString(String strBuffer)
		{
			strBuffer.AppendF("KeyPressedEvent: {} ({} repeats)", _keyCode, _repeatCount);
		}
	}

	public class KeyReleasedEvent : KeyEvent, IEvent
	{
		public override EventType EventType => .KeyReleased;
		public static EventType StaticType => .KeyReleased;

		public override StringView Name => "KeyReleased";

		public this(Key keyCode) : base(keyCode) {  }

		public override void ToString(String strBuffer)
		{
			strBuffer.AppendF("KeyReleasedEvent: {}", _keyCode);
		}
	}

	public class KeyTypedEvent : Event, IEvent
	{
		private char16 _char;

		[Inline]
		public char16 Char => _char;

		public override EventCategory Category => .Input | .Keyboard

		public override EventType EventType => .KeyTyped;
		public static EventType StaticType => .KeyTyped;
		
		public override StringView Name => "KeyTyped";

		public this(char16 char)
		{
			_char = char;
		}

		public override void ToString(String strBuffer)
		{
			strBuffer.AppendF("KeyTypedEvent: {}", _char);
		}
	}
}
