import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;
public class Joueur extends Creature {
	
	Nourriture[] nourriture_joueur = new Nourriture[5];
	Ressource[] ressources_joueur = new Ressource[9];
	Objet[] armes_joueur = new Objet[10];
	Objet[] equipements_joueur = new Objet[8];
	Objet[] objets_joueur = new Objet[4];
	BufferedImage imageJoueur,imageAnim;
	String nom = "Askiri" ; 
	Jeu jeu;
	static int largeur = 70;
	static int hauteur = 70;
	int k =0;
	int l = 0;
	int nourriture = 700 ;
	int eau = 700;
	int degat=100;
	int degat_arbre=10;
	int degat_mine=100;
	int resistance=100;
	long baisse,dernierBaisse,cooldown=300;
	
	public Joueur(float x, float y, Jeu j) {
		super(x, y, largeur, hauteur);
		bords.x = 5;
		bords.y = 30;
		bords.width =50;
		bords.height = 32;
		this.jeu=j;
		vie = 500 ;
				
		
		
		//liste de ressources
		ressources_joueur[0]=Liste.ressource_bois;
		ressources_joueur[1]=Liste.ressource_pierre;
		ressources_joueur[2]=Liste.ressource_fer;
		ressources_joueur[3]=Liste.ressource_emeraude;
		ressources_joueur[4]=Liste.ressource_lin;
		ressources_joueur[5]=Liste.ressource_paille;
		ressources_joueur[6]=Liste.ressource_diamant;
		ressources_joueur[7]=Liste.ressource_peau;
		ressources_joueur[8]=Liste.ressource_pierretalissement;
		
		nourriture_joueur[0]=Liste.ressource_viandelapin;
		nourriture_joueur[1]=Liste.ressource_viandeloup;
		nourriture_joueur[2]=Liste.ressource_viandeours;
		nourriture_joueur[3]=Liste.ressource_baies;
		nourriture_joueur[4]=Liste.ressource_eau;	
		
		//liste d'objets
		armes_joueur[0]=Liste.objet_epeebois;
		armes_joueur[1]=Liste.objet_epeepierrre;
		armes_joueur[2]=Liste.objet_epeefer;
		armes_joueur[3]=Liste.objet_epeeemeraude;
		armes_joueur[4]=Liste.objet_epeediamant;
		armes_joueur[5]=Liste.objet_piochepierre;
		armes_joueur[6]=Liste.objet_piochefer;
		armes_joueur[7]=Liste.objet_hachepierre;
		armes_joueur[8]=Liste.objet_hachefer;
		armes_joueur[9]=Liste.objet_hacheemeraude;
		equipements_joueur[0]=Liste.objet_casquecuir;
		equipements_joueur[1]=Liste.objet_casquefer;
		equipements_joueur[2]=Liste.objet_casqueemeraude;
		equipements_joueur[3]=Liste.objet_casquediamant;
		equipements_joueur[4]=Liste.objet_armurecuir;
		equipements_joueur[5]=Liste.objet_armurefer;
		equipements_joueur[6]=Liste.objet_armureemeraude;
		equipements_joueur[7]=Liste.objet_armurediamant;
		objets_joueur[0]=Liste.objet_corde;
		objets_joueur[1]=Liste.objet_echelle;
		objets_joueur[2]=Liste.objet_talissement;
		objets_joueur[3]=Liste.objet_gourde;
		
		this.vitesse=20;
		
		
	
	}
	
	

	
	public void tick() {
		
		baisserEauNourriture();
		monterVie();
		baisserVie();
		majoration();
		getClavier();
		move();
		Fenetre.camera.centrerSurCreature(this);
		attaque();
		animationTick();
		boire();
		
		
	}
	
	// Baisse la nourriture et l'eau du joueur de manière régulée
	
	public void baisserEauNourriture(){
		
		baisse  = System.currentTimeMillis() - dernierBaisse;
		if(baisse > cooldown){
				dernierBaisse = System.currentTimeMillis(); 
				nourriture--;
				eau--;
		}
	}
	
	// Monte la vie du joueur si l'eau et la nourriture est supérieur ou égal à 600
	public void monterVie(){
		if(eau>=600 && nourriture>=600)
			vie+=10;
	
	
	}
	
	//Baisse la vie si l'eau ou la nourriture est nulle
	public void baisserVie(){
		if(eau==0 || nourriture==0)
			vie-=10;
	
	
	}
	//Controle le max de vie, nourriture et eau
	public void majoration(){
		if(eau>=1000)
			eau=1000;
		if(vie>=1000)
			vie=1000;
		if(nourriture>=1000)
			nourriture=1000;
	
	}
	// Permet de boire si on est proche d'une tile eau et qu'on est pas au max en eau, sinon ça rempli la gourde
	public void boire(){
		
		if(Fenetre.clavier.keyToutJusteAppuie(KeyEvent.VK_ENTER) && eau < 1000 ){
			if(collisionEau((int)(x+largeur+vitesse)/Tile.largeur,(int)y/Tile.hauteur)){
				eau+=50;
				Audio.playSound("boire.wav");
			}
			if(collisionEau((int)(x-vitesse)/Tile.largeur,(int)y/Tile.hauteur)){
				eau+=50;
				Audio.playSound("boire.wav");
			}
			if(collisionEau((int)x/Tile.largeur,(int)(y-vitesse)/Tile.hauteur)){
				eau+=50;
				Audio.playSound("boire.wav");
			}
			if(collisionEau((int)x/Tile.largeur,(int)(y+hauteur+vitesse)/Tile.hauteur)){
				eau+=50;
				Audio.playSound("boire.wav");
			}
		}
		else if(Fenetre.clavier.keyToutJusteAppuie(KeyEvent.VK_ENTER) && eau >= 1000 && objets_joueur[3].exister && nourriture_joueur[4].nombre<25){
			nourriture_joueur[4].nombre++;
		
		}
		
			
		
		
			
			
		
	
	}
	// Controle si le joueur est proche d'une tile eau
	public boolean collisionEau(int x, int y){ // BOOLEAN EN FONCTION DE LA SOLIDITE DES LA TILE
		
		if(Fenetre.monde.getTile(x, y).getId() == 24)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 25)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 26)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 30)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 31)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 32)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 39)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 40)
			return true;
		else if(Fenetre.monde.getTile(x, y).getId() == 41)
			return true;	
		else
			return false;
	}
	//Cree un rectangle positionné en fonction de la touche appuyée et si une entite autre que le joueur se trouve dans la zone elle subie des degats
	public void attaque(){
		
		
		Rectangle cb = getCollisionBounds(0, 0); // Création d'un rectangle à une position égale au rectangle rouge de collision
		Rectangle ar = new Rectangle(); // Création d'un carré de 20 servant de zone d'attaque 
		int arSize = 20;
		ar.width = arSize;
		ar.height = arSize;
		
		if(Fenetre.clavier.degatUp){
			ar.x = cb.x + cb.width / 2 - arSize / 2;
			ar.y = cb.y - arSize;
			direction = 2;
		}else if(Fenetre.clavier.degatDown){
			ar.x = cb.x + cb.width / 2 - arSize / 2;
			ar.y = cb.y + cb.height;
			direction =3;
		}else if(Fenetre.clavier.degatLeft){
			ar.x = cb.x - arSize;
			ar.y = cb.y + cb.height / 2 - arSize / 2;
			direction = 1;
		}else if(Fenetre.clavier.degatRight){
			ar.x = cb.x + cb.width;
			ar.y = cb.y + cb.height / 2 - arSize / 2;
			direction = 0;
		}else{
			return; // On s'arrête ici car du coup aucune attaque
		}
		
		
		
		for(int i = 0 ; i<Fenetre.gEntite.getEntites().size();i++){
			Entite e = Fenetre.gEntite.getEntites().get(i);
			if(e.equals(this))
				continue; // Passe à l'entité suivante
			if(e.getCollisionBounds(0, 0).intersects(ar)){
				e.subisAttaque(degat);
				return;
			}
		}
	}
	
	
	
	// Getter & Setter
	private void getClavier(){
		xMove = 0;
		yMove = 0;
		
		if(Fenetre.clavier.up){
			yMove = -vitesse;
			direction = 2;
			
		}
		if(Fenetre.clavier.down){
			yMove = vitesse;
			direction = 3;
			
		}
		if(Fenetre.clavier.left){
			xMove = -vitesse;
			direction = 1;
		}
		if(Fenetre.clavier.right){
			xMove = vitesse;
			direction=0;
			
		}
	}
	
	
	//Controle l'animation de l'image du joueur et de l'image d'animation du combat
	public void animationTick(){
		
		k++;
		if(k>7 || !Fenetre.j1.mouvement)
			k=0;
		
		imageJoueur = ImageLoader.ImgLoaderSpe("Player.gif", 20*k, 26*direction, 20, 26);
		
		
		l++;
		if(l>1)
			l=0;
		
		imageAnim = ImageLoader.ImgLoader("animationCombat"+l+".gif");
	
	
	}
	

	//Dessine l'image d'animation de combat si le joueur attaque et dessine le joueur
	public void dessine(Graphics g, JPanel jf) {
		
		if(Fenetre.clavier.degatDown || Fenetre.clavier.degatUp || Fenetre.clavier.degatRight || Fenetre.clavier.degatLeft)
			g.drawImage(imageAnim, (int) (x-20 - Fenetre.camera.getxOffset()) , (int) (y-20 - Fenetre.camera.getyOffset()), 40, 40, jf);
			
		
		g.drawImage(imageJoueur, (int) (x - Fenetre.camera.getxOffset()) , (int) (y - Fenetre.camera.getyOffset()), largeur, hauteur, jf);
		
		
			
		
	}
	

}
