package d2input

import (
	"github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum"
	"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
)

// Static checks to confirm struct conforms to interface
var _ d2interface.InputEventHandler = &HandlerEvent{}
var _ d2interface.KeyEvent = &KeyEvent{}
var _ d2interface.KeyCharsEvent = &KeyCharsEvent{}
var _ d2interface.MouseEvent = &MouseEvent{}
var _ d2interface.MouseMoveEvent = &MouseMoveEvent{}

// HandlerEvent is an event that EventHandlers will process and respond to
type HandlerEvent struct {
	keyMod    d2enum.KeyMod
	buttonMod d2enum.MouseButtonMod
	x         int
	y         int
}

// KeyMod yields the modifier for a key action
func (e *HandlerEvent) KeyMod() d2enum.KeyMod {
	return e.keyMod
}

// ButtonMod yields the modifier for a button action
func (e *HandlerEvent) ButtonMod() d2enum.MouseButtonMod {
	return e.buttonMod
}

// X returns the x screen coordinate for the event
func (e *HandlerEvent) X() int {
	return e.x
}

//Y returns the y screen coordinate for the event
func (e *HandlerEvent) Y() int {
	return e.y
}

type KeyCharsEvent struct {
	HandlerEvent
	chars []rune
}

func (e *KeyCharsEvent) Chars() []rune {
	return e.chars
}

type KeyEvent struct {
	HandlerEvent
	key d2enum.Key
	// Duration represents the number of frames this key has been pressed for
	duration int
}

func (e *KeyEvent) Key() d2enum.Key {
	return e.key
}
func (e *KeyEvent) Duration() int {
	return e.duration
}

type MouseEvent struct {
	HandlerEvent
	mouseButton d2enum.MouseButton
}

func (e *MouseEvent) KeyMod() d2enum.KeyMod {
	return e.HandlerEvent.keyMod
}

func (e *MouseEvent) ButtonMod() d2enum.MouseButtonMod {
	return e.HandlerEvent.buttonMod
}

func (e *MouseEvent) X() int {
	return e.HandlerEvent.x
}

func (e *MouseEvent) Y() int {
	return e.HandlerEvent.y
}

func (e *MouseEvent) Button() d2enum.MouseButton {
	return e.mouseButton
}

type MouseMoveEvent struct {
	HandlerEvent
}

func (e *MouseMoveEvent) KeyMod() d2enum.KeyMod {
	return e.HandlerEvent.keyMod
}

func (e *MouseMoveEvent) ButtonMod() d2enum.MouseButtonMod {
	return e.HandlerEvent.buttonMod
}

func (e *MouseMoveEvent) X() int {
	return e.HandlerEvent.x
}

func (e *MouseMoveEvent) Y() int {
	return e.HandlerEvent.y
}
