/*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 "InterfaceCombat.hpp"

InterfaceCombat::InterfaceCombat() : positionX(0), positionY(0)
{
	
}

void InterfaceCombat::ajouteJoueur(Joueur *pJoueurAjoute)
{
	listeJoueurs.push_back(pJoueurAjoute);
	listeTextesNoms.push_back(sf::Text());
	listeTextesVies.push_back(sf::Text());
	listeBarresVies.push_back(sf::Shape());
	listeTextesEnergie.push_back(sf::Text());
	listeBarresEnergie.push_back(sf::Shape());
	
	dessine(listeJoueurs.size() - 1);
}

void InterfaceCombat::supprimeJoueur(Joueur *pJoueurSupprime, MoteurGraphique &pMoteurRendu)
{
	std::vector<Joueur*>::iterator it = rechercheJoueur(pJoueurSupprime);
	
	if (it != listeJoueurs.end())
	{
		int ix = std::distance(listeJoueurs.begin(), it);
		pMoteurRendu.supprimeObjet(&listeTextesNoms[ix]);
		pMoteurRendu.supprimeObjet(&listeTextesVies[ix]);
		pMoteurRendu.supprimeObjet(&listeBarresVies[ix]);
		pMoteurRendu.supprimeObjet(&listeTextesEnergie[ix]);
		pMoteurRendu.supprimeObjet(&listeBarresEnergie[ix]);
		
		listeJoueurs.erase(it);
		listeTextesNoms.erase(listeTextesNoms.begin() + ix);
		listeTextesVies.erase(listeTextesVies.begin() + ix);
		listeBarresVies.erase(listeBarresVies.begin() + ix);
		listeTextesEnergie.erase(listeTextesEnergie.begin() + ix);
		listeBarresEnergie.erase(listeBarresEnergie.begin() + ix);
	}
}

void InterfaceCombat::demarreAffichage(MoteurGraphique &pMoteurRendu)
{
	for (int i = 0; i < listeJoueurs.size(); i++)
	{
		pMoteurRendu.ajouteObjet(&listeTextesNoms[i]);
		pMoteurRendu.ajouteObjet(&listeTextesVies[i]);
		pMoteurRendu.ajouteObjet(&listeBarresVies[i]);
		pMoteurRendu.ajouteObjet(&listeTextesEnergie[i]);
		pMoteurRendu.ajouteObjet(&listeBarresEnergie[i]);
	}
}

void InterfaceCombat::supprimeAffichage(MoteurGraphique &pMoteurRendu)
{
	for (int i = 0; i < listeJoueurs.size(); i++)
	{
		pMoteurRendu.supprimeObjet(&listeTextesNoms[i]);
		pMoteurRendu.supprimeObjet(&listeTextesVies[i]);
		pMoteurRendu.supprimeObjet(&listeBarresVies[i]);
		pMoteurRendu.supprimeObjet(&listeTextesEnergie[i]);
		pMoteurRendu.supprimeObjet(&listeBarresEnergie[i]);
	}
}

void InterfaceCombat::updateNom(Joueur *pJoueurMisAJour)
{
	std::vector<Joueur*>::iterator it = rechercheJoueur(pJoueurMisAJour);
	
	if (it != listeJoueurs.end())
	{
		int indexJoueur = std::distance(listeJoueurs.begin(), it);
		
		listeTextesNoms[indexJoueur].SetString(listeJoueurs[indexJoueur]->getNom());
	}
}

void InterfaceCombat::updateVies(Joueur *pJoueurMisAJour)
{
	std::vector<Joueur*>::iterator it = rechercheJoueur(pJoueurMisAJour);
	
	if (it != listeJoueurs.end())
	{
		int indexJoueur = std::distance(listeJoueurs.begin(), it);
		Joueur *joueurMisAJour = listeJoueurs[indexJoueur];
		
		std::ostringstream viesString;
		viesString << joueurMisAJour->getVies();
		
		std::ostringstream maxViesString;
		maxViesString << joueurMisAJour->getMaxVies();
		
		listeTextesVies[indexJoueur].SetString(viesString.str() + "/" + maxViesString.str());
		listeBarresVies[indexJoueur].SetScaleX((float)joueurMisAJour->getVies() / joueurMisAJour->getMaxVies());
	}
}

void InterfaceCombat::updateEnergie(Joueur *pJoueurMisAJour)
{
	std::vector<Joueur*>::iterator it = rechercheJoueur(pJoueurMisAJour);
	
	if (it != listeJoueurs.end())
	{
		int indexJoueur = std::distance(listeJoueurs.begin(), it);
		Joueur *joueurMisAJour = listeJoueurs[indexJoueur];
		
		std::ostringstream energieString;
		energieString << joueurMisAJour->getEnergie();
		
		std::ostringstream maxEnergieString;
		maxEnergieString << joueurMisAJour->getMaxEnergie();
		
		listeTextesEnergie[indexJoueur].SetString(energieString.str() + "/" + maxEnergieString.str());
		listeBarresEnergie[indexJoueur].SetScaleX(joueurMisAJour->getEnergie() / joueurMisAJour->getMaxEnergie());
	}
}

void InterfaceCombat::dessine(int pIndexJoueur)
{
	int largeurBarreVie = 100;
	int hauteurBarreVie = 20;
	int largeurBarreEnergie = 100;
	int hauteurBarreEnergie = 20;
	int positionXInterface = positionX + (largeurBarreVie + 50) * pIndexJoueur;
	int positionYInterface = positionY;
	
	//Nom
	sf::Text nomJoueur(listeJoueurs[pIndexJoueur]->getNom(), sf::Font::GetDefaultFont(), 30);
	nomJoueur.SetX(positionXInterface);
	nomJoueur.SetY(positionYInterface);
	nomJoueur.SetColor(sf::Color(0, 0, 0, 255));
	
	listeTextesNoms[pIndexJoueur] = nomJoueur;
	
	//Vies
	std::ostringstream viesString;
	viesString << listeJoueurs[pIndexJoueur]->getVies();
	
	std::ostringstream maxViesString;
	maxViesString << listeJoueurs[pIndexJoueur]->getMaxVies();

	int positionYBarreVies = nomJoueur.GetPosition().y + nomJoueur.GetRect().Height + 5;
	
	sf::Shape barreViesJoueur = sf::Shape::Rectangle(0, 0, largeurBarreVie, hauteurBarreVie, sf::Color(0, 255, 0, 75));
	barreViesJoueur.SetX(positionXInterface);
	barreViesJoueur.SetY(positionYBarreVies);
	
	sf::Text viesJoueur(viesString.str() + "/" + maxViesString.str(), sf::Font::GetDefaultFont(), 10);
	int largeurChampVies = viesJoueur.GetRect().Width;
	int hauteurChampVies = viesJoueur.GetRect().Height;
	viesJoueur.SetX(positionXInterface + (largeurBarreVie - largeurChampVies) / 2);
	viesJoueur.SetY(positionYBarreVies + (hauteurBarreVie - hauteurChampVies) / 2);
	viesJoueur.SetColor(sf::Color(255, 255, 255, 255));
	
	listeTextesVies[pIndexJoueur] = viesJoueur;
	listeBarresVies[pIndexJoueur] = barreViesJoueur;
	
	//Energie
	std::ostringstream energieString;
	energieString << listeJoueurs[pIndexJoueur]->getEnergie();
	
	std::ostringstream maxEnergieString;
	maxEnergieString << listeJoueurs[pIndexJoueur]->getMaxEnergie();

	int positionYBarreEnergie = positionYBarreVies + hauteurBarreVie + 5;
	
	sf::Shape barreEnergieJoueur = sf::Shape::Rectangle(0, 0, largeurBarreEnergie, hauteurBarreEnergie, sf::Color(0, 200, 255, 75));
	barreEnergieJoueur.SetX(positionXInterface);
	barreEnergieJoueur.SetY(positionYBarreEnergie);
	
	sf::Text energieJoueur(energieString.str() + "/" + maxEnergieString.str(), sf::Font::GetDefaultFont(), 10);
	int largeurChampEnergie = energieJoueur.GetRect().Width;
	int hauteurChampEnergie = energieJoueur.GetRect().Height;
	energieJoueur.SetX(positionXInterface + (largeurBarreEnergie - largeurChampEnergie) / 2);
	energieJoueur.SetY(positionYBarreEnergie + (hauteurBarreEnergie - hauteurChampEnergie) / 2);
	energieJoueur.SetColor(sf::Color(255, 255, 255, 255));
	
	listeTextesEnergie[pIndexJoueur] = energieJoueur;
	listeBarresEnergie[pIndexJoueur] = barreEnergieJoueur;
}

std::vector<Joueur*>::iterator InterfaceCombat::rechercheJoueur(Joueur *pJoueurRecherche)
{
	std::vector<Joueur*>::iterator it;
	it = std::find(listeJoueurs.begin(), listeJoueurs.end(), pJoueurRecherche);
	
	return it;
}

void InterfaceCombat::setPositionX(float pPosition)
{
	int mouvementX = pPosition - positionX;
	
	for (int i = 0; i < listeJoueurs.size(); i++)
	{	
		//Textes
		listeTextesNoms[i].SetX(listeTextesNoms[i].GetPosition().x + mouvementX);
		listeTextesVies[i].SetX(listeTextesVies[i].GetPosition().x + mouvementX);
		listeTextesEnergie[i].SetX(listeTextesEnergie[i].GetPosition().x + mouvementX);
		
		//Barres
		listeBarresVies[i].SetX(listeBarresVies[i].GetPosition().x + mouvementX);
		listeBarresEnergie[i].SetX(listeBarresEnergie[i].GetPosition().x + mouvementX);
	}
	
	positionX = pPosition;
}

float InterfaceCombat::getPositionX() const
{
	return positionX;
}

void InterfaceCombat::setPositionY(float pPosition)
{
	int mouvementY = pPosition - positionY;
	
	for (int i = 0; i < listeJoueurs.size(); i++)
	{	
		//Textes
		listeTextesNoms[i].SetY(listeTextesNoms[i].GetPosition().y + mouvementY);
		listeTextesVies[i].SetY(listeTextesVies[i].GetPosition().y + mouvementY);
		listeTextesEnergie[i].SetY(listeTextesEnergie[i].GetPosition().y + mouvementY);
		
		//Barres
		listeBarresVies[i].SetY(listeBarresVies[i].GetPosition().y + mouvementY);
		listeBarresEnergie[i].SetY(listeBarresEnergie[i].GetPosition().y + mouvementY);
	}
	
	positionY = pPosition;
}

float InterfaceCombat::getPositionY() const
{
	return positionY;
}