/*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/MoteurImage.hpp"
#include "Moteurs/MoteurGraphique.hpp"
#include "Moteurs/Physique/MoteurPhysique.hpp"
#include "Outils/InterfaceCombat.hpp"

int main()
{
	sf::RenderWindow fenetre(sf::VideoMode(1000, 600, 32), "Hikou no mizu");
	sf::Image iconeFenetre;
	iconeFenetre.LoadFromFile("icone.png");
	fenetre.SetIcon(iconeFenetre.GetWidth(), iconeFenetre.GetHeight(), iconeFenetre.GetPixelsPtr());
	fenetre.UseVerticalSync(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);
	
	Joueur joueur1("Takino", 100, 100, 5, 3);
	joueur1.setSens(1);
	joueur1.setPositionX(150);
	joueur1.setPositionY(550);
	
	Joueur joueur2("Hikou", 1000, 5, 3, 2);
	joueur2.setPositionX(350);
	joueur2.setPositionY(550);
	
	joueur1.demarreAffichage(moteurJeu);
	joueur2.demarreAffichage(moteurJeu);
	
	InterfaceCombat interfaceCombat;
	interfaceCombat.ajouteJoueur(&joueur1);
	interfaceCombat.ajouteJoueur(&joueur2);
	interfaceCombat.demarreAffichage(moteurInterface);
	
	moteurInterface.ajouteObjet(&texte);
	
	MoteurPhysique moteurPhysique;
	moteurPhysique.ajouteObjet(&joueur1);
	moteurPhysique.ajouteObjet(&joueur2);
	
	int frame;
	
	while(fenetre.IsOpened())
	{
		sf::Event evenement;
		while (fenetre.GetEvent(evenement))
		{
			if (evenement.Type == sf::Event::Closed)
				fenetre.Close();
		}
		
		joueur1.executeActions(fenetre.GetInput(), &moteurPhysique);
		joueur2.executeActions(fenetre.GetInput(), &moteurPhysique);
		
		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;
}