/*Copyright (C) 2010 Deveaux Duncan

This file is part of Hikou no mizu.

Hikou no mizu 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, either version 3 of the License, or
(at your option) any later version.

Hikou no mizu 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 Hikou no mizu.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <sstream>
#include <SFML/Graphics.hpp>
#include "Joueur/Joueur.hpp"
#include "Moteurs/Graphique/MoteurGraphique.hpp"
#include "Moteurs/Physique/MoteurPhysique.hpp"
#include "Outils/InterfaceCombat.hpp"

int main()
{
	sf::RenderWindow fenetre(sf::VideoMode(1000, 600, 32), "Hikou no mizu");
	fenetre.EnableVerticalSync(true);
	
	sf::View vueJeu(sf::FloatRect(0, 0, fenetre.GetWidth(), fenetre.GetHeight()));
	
	sf::Image fond;
	fond.LoadFromFile("fond.png");
	fond.SetSmooth(false);
	
	sf::Sprite afficheFond;
	afficheFond.SetImage(fond);
		
	sf::Text texte("", sf::Font::GetDefaultFont(), 45);
	texte.SetX(fenetre.GetWidth() - 100);
	texte.SetColor(sf::Color(0, 0, 0, 255));
	
	MoteurGraphique moteurInterface(&fenetre);
	
	MoteurGraphique moteurJeu(&fenetre);
	moteurJeu.ajouteObjet(&afficheFond);
	
	MoteurPhysique moteurPhysique(sf::FloatRect(0, -250, 1000, 850), 550, 10);
	
	Joueur joueur1("Hikou", 100, 100, 5, 3, &moteurPhysique);
	joueur1.setSens(1);
	joueur1.setPositionX(150);
	joueur1.setPositionY(550);
	
	Joueur joueur2("Takino", 1000, 5, 3, 10, &moteurPhysique);
	joueur2.setPositionX(450);
	joueur2.setPositionY(550);
	
	moteurPhysique.ajouteObjet(&joueur1);
	moteurPhysique.ajouteObjet(&joueur2);
	
	joueur1.demarreAffichage(moteurJeu);
	joueur2.demarreAffichage(moteurJeu);
	
	InterfaceCombat interfaceCombat;
	interfaceCombat.ajouteJoueur(&joueur1);
	interfaceCombat.ajouteJoueur(&joueur2);
	
	interfaceCombat.setPositionX(380);
	interfaceCombat.setPositionY(20);
	interfaceCombat.demarreAffichage(moteurInterface);
	
	//moteurInterface.ajouteObjet(&texte);
	
	int frame;

	while(fenetre.IsOpened())
	{
		sf::Event evenement;
		while (fenetre.GetEvent(evenement))
		{
			if (evenement.Type == sf::Event::Closed)
				fenetre.Close();
			
			if (evenement.Key.Code == sf::Key::F1)
			{
				sf::Image Screen;
				Screen.CopyScreen(fenetre, sf::IntRect(0, 0, 1000, 600));
				Screen.SaveToFile("screenshot.png");
			}
		}
		
		moteurPhysique.update();
		
		joueur1.executeActions(fenetre.GetInput());
		joueur2.executeActions(fenetre.GetInput());
		
		if (joueur1.vieChangee())
			interfaceCombat.updateVies(&joueur1);
		if (joueur2.vieChangee())
			interfaceCombat.updateVies(&joueur2);
		
		frame = 1.f / fenetre.GetFrameTime();
		
		std::ostringstream convertFramerate;
		convertFramerate << frame;
		texte.SetString(convertFramerate.str());
		
		fenetre.Clear();
		//Graphic part
		fenetre.SetView(vueJeu);
		moteurJeu.afficheRendu();
		
		//Interface part
		fenetre.SetView(fenetre.GetDefaultView());
		moteurInterface.afficheRendu();
		
		fenetre.Display();
	}
	
	return EXIT_SUCCESS;
}