/**
 *  Triangles
 *  Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, version 3 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "TrianglesWindow.hpp"
#include "InputTarget.hpp"

TrianglesWindow::TrianglesWindow(const std::string& title, sf::Vector2u size):
	InputTarget(_inputMap),
	_size(size),
	_title(title)
{
	_context = nullptr;
	_inputMap.map(0, Input(sf::Keyboard::R, Input::Type::Pressed));
	bind(0, [this](const sf::Event&)
	{
		if(_size == sf::Vector2u(640u, 480u))
			_size = sf::Vector2u(1366u, 768u);
		else
			_size = sf::Vector2u(640u, 480u);
		close();
		open();
	});
}

TrianglesWindow::~TrianglesWindow()
{
	close();
}

void TrianglesWindow::setContext(Context* context)
{
	_context = context;
}

void TrianglesWindow::clear()
{
	_window.clear(sf::Color::Black);
}

void TrianglesWindow::clear(sf::Color color)
{
	_window.clear(color);
}

void TrianglesWindow::render()
{
	_window.display();
}

void TrianglesWindow::recreate()
{
	close();
	open();
}

void TrianglesWindow::lockFramerate(bool locked)
{
	if(_context->vsync)
		return;
	if(locked)
		_window.setFramerateLimit(30);
	else
		_window.setFramerateLimit(240);
}

bool TrianglesWindow::setActive(bool active)
{
	return _window.setActive(active);
}

void TrianglesWindow::setSize(sf::Vector2u& size)
{
	_size = size;
}

void TrianglesWindow::setSize(unsigned width, unsigned height)
{
	_size = sf::Vector2u(width, height);
}

sf::Vector2u TrianglesWindow::getSize()
{
	return _window.getSize();
}

void TrianglesWindow::setView(const sf::View* view)
{
	_window.setView(*view);
}

void TrianglesWindow::setView()
{
	_window.setView(_window.getDefaultView());
}

void TrianglesWindow::draw(sf::Drawable& drawable)
{
	_window.draw(drawable);
}
void TrianglesWindow::draw(sf::Drawable& drawable, sf::RenderStates states)
{
	_window.draw(drawable, states);
}
void TrianglesWindow::draw(sf::Drawable& drawable, sf::Shader* shader)
{
	_window.draw(drawable, shader);
}

bool TrianglesWindow::pollEvent(sf::Event& event)
{
	return _window.pollEvent(event);
}

sf::Vector2i TrianglesWindow::getMousePosition()
{
	return sf::Mouse::getPosition(_window);
}

void TrianglesWindow::open()
{
	sf::ContextSettings settings;
	settings.majorVersion = 3;
	settings.minorVersion = 0;
	settings.antialiasingLevel = 8;
	_window.create(sf::VideoMode(_size.x, _size.y), _title, (_context->fullscreen ? sf::Style::Fullscreen : (sf::Style::Titlebar | sf::Style::Close)), settings);
	_window.setKeyRepeatEnabled(false);
	if(_context->vsync)
		_window.setVerticalSyncEnabled(true);
	if(_context)
		_context->needsUpdate = true;
}

void TrianglesWindow::close()
{
	if(_window.isOpen())
		_window.close();
}