package modele;

import java.awt.Font;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

import controleur.GLOBAL;

/**
 * Gestion des joueurs
 *
 */
public class Joueur extends Objet {

	/**
	 * vie de départ pour tous les joueurs
	 */
	private static final int MAXVIE = 10 ;
	/**
	 * gain de points de vie lors d'une attaque
	 */
	private static final int GAIN = 1 ; 
	/**
	 * perte de points de vie lors d'une attaque
	 */
	private static final int PERTE = 2 ; 
	
	/**
	 * pseudo saisi
	 */
	private String pseudo ;
	/**
	 * n° correspondant au personnage (avatar) pour le fichier correspondant
	 */
	private int numPerso ; 
	/**
	 * instance de JeuServeur pour communiquer avec lui
	 */
	private JeuServeur jeuServeur ;
	/**
	 * numéro d'�tape dans l'animation (de la marche, touché ou mort)
	 */
	private int etape ;
	/**
	 * la boule du joueur
	 */
	private Boule boule ;
	/**
	* vie restante du joueur
	*/
	private int vie ; 
	/**
	* tourné vers la gauche (0) ou vers la droite (1)
	*/
	private int orientation ;
	
	private JLabel message;
	
	/**
	 * Constructeur
	 */
	public Joueur(JeuServeur jeuServeur) {
		this.jeuServeur = jeuServeur;
		
		vie = MAXVIE;
		etape = 1;
		orientation = 1;
	}

	/**
	 * Initialisation d'un joueur (pseudo et numéro, calcul de la 1ère position, affichage, création de la boule)
	 */
	public void initPerso(String pseudo, int numPerso, ArrayList<Mur> listeMurs, Collection<Joueur> joueurs) {
		this.pseudo = pseudo;
		this.numPerso = numPerso;
		
		super.label = new JLabel();
		this.message = new JLabel();
		this.premierePosition(listeMurs, joueurs);
		jeuServeur.ajoutJLabelJeuArene(label);
		jeuServeur.ajoutJLabelJeuArene(message);	
		this.affiche("marche", this.etape);
		
		this.message.setHorizontalAlignment(SwingConstants.CENTER);
		this.message.setFont(new Font("Arial", Font.PLAIN, 8));
		
		System.out.println("joueur "+pseudo+" - num perso "+numPerso+" créé");
	}

	/**
	 * Calcul de la première position aléatoire du joueur (sans chevaucher un autre joueur ou un mur)
	 */
	private void premierePosition(ArrayList<Mur> listeMurs, Collection<Joueur> joueurs) {
		this.getJLabel().setBounds(0, 0, GLOBAL.largeurPerso, GLOBAL.hauteurPerso);
		
		do {
		    posX = (int) Math.round(Math.random() * (GLOBAL.tailleXArene - GLOBAL.largeurPerso)) ;
		    posY = (int) Math.round(Math.random() * (GLOBAL.tailleYArene - GLOBAL.hauteurPerso - GLOBAL.hauteurMessage)) ;
		    System.out.println(posX + " " + posY);
		} while(this.toucheJoueur(joueurs) || this.toucheMur(listeMurs));

	}
	
	/**
	 * Affiche le personnage et son message
	 */
	public void affiche(String etat, int etape) {
		super.label.setBounds(posX, posY, GLOBAL.largeurPerso, GLOBAL.hauteurPerso);
		String chemin = GLOBAL.cheminPersos + "perso" + this.numPerso + etat + etape + "d" + this.orientation + ".gif";
		URL ressource = getClass().getClassLoader().getResource(chemin);
		super.label.setIcon(new ImageIcon(ressource));
		
		System.out.println(super.label.getBounds());
		this.message.setBounds(posX-10, posY+GLOBAL.hauteurPerso, GLOBAL.largeurPerso+10, GLOBAL.hauteurMessage);
		this.message.setText(pseudo + " : " + vie);
		
		this.jeuServeur.envoiJeuATous();
	}

	/**
	 * Gère une action reçue et qu'il faut afficher (déplacement, tire de boule...)
	 */
	public void action() {
	}

	/**
	 * Gère le déplacement du personnage
	 */
	private void deplace() { 
	}

	/**
	 * Contrôle si le joueur touche un des autres joueurs
	 * @return true si deux joueurs se touchent
	 */
	private Boolean toucheJoueur(Collection<Joueur> joueurs) {
		for(Joueur player : joueurs) {
			if (this != player && this.toucheObjet(player)) {
	            return true;
	        }
		}
		return false;
	}

	/**
	 * Gain de points de vie après avoir touché un joueur
	 */
	public void gainVie() {
	}
	
	/**
	 * Perte de points de vie après avoir été touché 
	 */
	public void perteVie() {
	}
	
	/**
	* Contrôle si le joueur touche un des murs
	* @return true si un joueur touche un mur
	*/
	private Boolean toucheMur(ArrayList<Mur> listeMurs) {
		for(Mur mur : listeMurs) {
			if(this.toucheObjet(mur)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * vrai si la vie est à 0
	 * @return true si vie = 0
	 */
	public Boolean estMort() {
		return null;
	}
	
	/**
	 * Le joueur se déconnecte et disparait
	 */
	public void departJoueur() {
	}
	
}
