#include "Input.hpp"

Input::Input(const Input& other): _type(other._type)
{
	std::memcpy(&_event, &other._event, sizeof(sf::Event));
}
Input& Input::operator=(const Input& other)
{
	std::memcpy(&_event, &other._event, sizeof(sf::Event));
	_type = other._type;
	return *this;
}
Input::Input(const sf::Keyboard::Key& key, int type): _type(type)
{
	_event.type = sf::Event::EventType::KeyPressed;
	_event.key.code = key;
}
Input::Input(const sf::Mouse::Button& button, int type): _type(type)
{
	_event.type = sf::Event::EventType::MouseButtonPressed;
	_event.mouseButton.button = button;
}
bool Input::test() const
{
	switch(_event.type)
	{
		case sf::Event::EventType::KeyPressed:
			if(_type & Type::Pressed)
				return sf::Keyboard::isKeyPressed(_event.key.code);
			break;
		case sf::Event::EventType::MouseButtonPressed:
			if(_type & Type::Pressed)
				return sf::Mouse::isButtonPressed(_event.mouseButton.button);
			break;
		default:
			break;
	}
	return false;
}
bool Input::operator==(const sf::Event& event) const
{
	switch(event.type)
	{
		case sf::Event::EventType::KeyPressed:
			if(_type & Type::Pressed and _event.type == sf::Event::EventType::KeyPressed)
				return event.key.code == _event.key.code;
			break;
		case sf::Event::EventType::KeyReleased:
			if(_type & Type::Released and _event.type == sf::Event::EventType::KeyPressed)
				return event.key.code == _event.key.code;
			break;
		case sf::Event::EventType::MouseButtonPressed:
			if(_type & Type::Pressed and _event.type == sf::Event::EventType::MouseButtonPressed)
				return event.mouseButton.button == _event.mouseButton.button;
			break;
		case sf::Event::EventType::MouseButtonReleased:
			if(_type & Type::Released and _event.type == sf::Event::EventType::MouseButtonPressed)
				return event.mouseButton.button == _event.mouseButton.button;
			break;
		default: 
			break;
	}
	return false;
}
bool Input::operator==(const Input& other) const
{
	return _type == other._type and other == _event;
}