import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class Fenetre extends JPanel implements ActionListener {
	static int LARGEUR_FENETRE;
	static int HAUTEUR_FENETRE;
	Timer timer;
	static int x;
	int compteur;
	boolean show = false ;
	static boolean gameover =false;
	
	BufferedImage screen ;
	Jeu jeu ;
	static Camera camera;
	static GestionEntite gEntite;
	static Clavier clavier;
	static Joueur j1;
	static Pnj pnjAccueil,pnjAide1,pnjAide2,pnjAide3,pnj3 ;
	static PnjTalisman pj;
	static Monde monde;
	static GestionItem gItem;
	static GestionRespawn gRespawn;
	static Monstre m0,m1,m2;
	static GestionAnimation gAnim;
	static Affichage affichage;
	Audio audio;
	BarreJauge barreJauge_vie;
	BarreJauge barreJauge_faim;
	BarreJauge barreJauge_soif;
	Coffre c1,c2,c3;
	CoffreFin cf;
	
	
	
	
	public Fenetre(int LARGEUR_FENETRE, int HAUTEUR_FENETRE,Clavier clavier, Jeu jeu){
		
		this.jeu=jeu;
		this.clavier=clavier;
		setSize(LARGEUR_FENETRE,HAUTEUR_FENETRE);
		
		this.HAUTEUR_FENETRE = HAUTEUR_FENETRE;
		this.LARGEUR_FENETRE = LARGEUR_FENETRE;
		//On joue le son d'ambiance
		audio.playSound("ambiance.wav");
		//On cree la map via le fichier texte world3
		monde = new Monde("assets/world3.txt");
		//On cree notre joueur aux coordonnees indiquées par le fichier texte
		j1 = new Joueur(monde.getSpawnX(),monde.getSpawnY(), jeu);
		
				
		pnjAccueil= new Pnj(700,700,100,100,this,"On t'a volé ton talisman! Retrouve le voleur! Deplace toi avec les fleches et combat avec Z,Q,S ou D",1);
		pnjAide1 = new Pnj(8000,1300,100,100,this,"Tu peux boire ne appuyant sur ENTRER proche d'un point d'eau !",2);
		pnjAide2 = new Pnj(5750,1250,100,100,this,"Recolte du bois et appuye sur I pour ouvrir ton inventaire et O pour le fermer! Tu peux creer des objets avec ENTER et les equiper avec E",2);
		pnjAide3 = new Pnj(3800,1000,100,100,this,"Recolte des minerais en les attaquant !",2);
		pnj3 = new Pnj(2550,17850,100,100,this,"Retrouve ton talisman !!!",3);
		pj = new PnjTalisman(864,3410,100,100,this,"Tiens , je te rends ta pierre de talisman. Grace a elle tu peux decouvrir un village perdu ",3);
		c1 = new Coffre(8700,4500,50,50);
		c2 = new Coffre(7400,3800,50,50);
		c3 = new Coffre(7000,6000,50,50);
		cf = new CoffreFin(2924,8770,50,50);
		camera = new Camera(0,0);
		
		
		affichage = new Affichage();
		
		
		
		
		
		//Gère toutes les Entites, cest beaucoup plus faciles pour les tick() et dessine()
		gEntite = new GestionEntite();
		
		
		//monstres :
		if(true){
			gEntite.addEntite(new Monstre(1800,1200,50,50));
			gEntite.addEntite(new Monstre(2840,1440,50,50));
			gEntite.addEntite(new Monstre(3400,1740,50,50));
			gEntite.addEntite(new Monstre(4280,780,50,50));
			gEntite.addEntite(new Monstre(5060,720,50,50));
			gEntite.addEntite(new Monstre(4314,1893,50,50));
			gEntite.addEntite(new Monstre(5434,1893,50,50));
			gEntite.addEntite(new Monstre(6794,1857,50,50));
			gEntite.addEntite(new Monstre(7674,1777,50,50));
			gEntite.addEntite(new Monstre(8394,1697,50,50));
			gEntite.addEntite(new Monstre(8394,1057,50,50));
			gEntite.addEntite(new Monstre(7434,1057,50,50));
			
			gEntite.addEntite(new MonstreAgressif(7034,577,100,100,1));
			gEntite.addEntite(new MonstreAgressif(8014,257,100,100,1));
			gEntite.addEntite( new MonstreAgressif(9674,1827,100,100,1));
			gEntite.addEntite( new MonstreAgressif(3295,2277,100,100,1));
			gEntite.addEntite( new MonstreAgressif(3294,2837,100,100,1));
			gEntite.addEntite( new MonstreAgressif(2975,3317,100,100,1));
			gEntite.addEntite( new MonstreAgressif(3294,3797,100,100,1));
			gEntite.addEntite( new MonstreAgressif(4653,3957,100,100,1));
			gEntite.addEntite( new MonstreAgressif(5215,3237,100,100,1));
			gEntite.addEntite(new MonstreAgressif(5215,2677,100,100,1));
			gEntite.addEntite( new MonstreAgressif(6364,2720,100,100,1));
			gEntite.addEntite( new MonstreAgressif(6605,3707,100,100,1));
			gEntite.addEntite( new MonstreAgressif(7484,3650,100,100,1));
			gEntite.addEntite( new MonstreAgressif(7324,3970,100,100,1));
			gEntite.addEntite( new MonstreAgressif(7605,2630,100,100,1));
			gEntite.addEntite( new MonstreAgressif(8725,2630,100,100,1));
			gEntite.addEntite( new MonstreAgressif(9304,3030,100,100,1));
			gEntite.addEntite( new MonstreAgressif(1734,4480,100,100,1));

			gEntite.addEntite( new MonstreAgressif(3224,4310,100,100,1));
			gEntite.addEntite( new MonstreAgressif(2984,5030,100,100,1));
			gEntite.addEntite( new MonstreAgressif(1885,5350,100,100,1));
			gEntite.addEntite( new MonstreAgressif(3134,5290,100,100,1));


			gEntite.addEntite( new MonstreAgressif(8944,4437,100,100,2));
			gEntite.addEntite( new MonstreAgressif(4794,5497,100,100,2));
			gEntite.addEntite( new MonstreAgressif(4794,6137,100,100,2));
			gEntite.addEntite( new MonstreAgressif(5514,5497,100,100,2));
			gEntite.addEntite( new MonstreAgressif(6104,4930,100,100,2));
			gEntite.addEntite( new MonstreAgressif(6504,5490,100,100,2));
			gEntite.addEntite( new MonstreAgressif(7064,5730,100,100,2));
			gEntite.addEntite( new MonstreAgressif(5335,6817,100,100,2));
			gEntite.addEntite( new MonstreAgressif(4694,6577,100,100,2));
			gEntite.addEntite( new MonstreAgressif(3845,7212,100,100,2));
			gEntite.addEntite( new MonstreAgressif(2865,7377,100,100,2));
			gEntite.addEntite( new MonstreAgressif(1785,7170,100,100,2));
			gEntite.addEntite( new MonstreAgressif(1545,6450,100,100,2));
			gEntite.addEntite( new MonstreAgressif(2324,6300,100,100,2));
			gEntite.addEntite( new MonstreAgressif(6254,7517,100,100,2));
			gEntite.addEntite( new MonstreAgressif(7294,7677,100,100,2));

			gEntite.addEntite( new MonstreAgressif(7934,7677,100,100,2));
			gEntite.addEntite( new MonstreAgressif(7854,8157,100,100,2));
			gEntite.addEntite( new MonstreAgressif(6814,6157,100,100,2));
			gEntite.addEntite( new MonstreAgressif(5694,7857,100,100,2));

			gEntite.addEntite( new MonstreAgressif(4814,7937,100,100,2));
			gEntite.addEntite( new MonstreAgressif(4814,9057,100,100,2));

			
			gEntite.addEntite( new MonstreAgressif(3775,8737,200,200,3));
			
			
			
			
			
			
			
			//ajout des entites
			gEntite.addEntite(new ArbreIndestrictible(3795,5417,Liste.arbre,this));
			
			//arbre
			gEntite.addEntite(new Arbre(29*200+50,2*250,Liste.arbre));
			gEntite.addEntite(new Arbre(30*200+50,2*250,Liste.arbre));
			gEntite.addEntite(new Arbre(29*200+100,3*250,Liste.arbre));
			gEntite.addEntite(new Arbre(30*200+100,3*250,Liste.arbre));
			gEntite.addEntite(new Arbre(27*200+100,4*250,Liste.arbre));
			gEntite.addEntite(new Arbre(28*200+100,4*250,Liste.arbre));
			gEntite.addEntite(new Arbre(29*200+100,4*250,Liste.arbre));
			gEntite.addEntite(new Arbre(30*200+100,4*250,Liste.arbre));
			gEntite.addEntite(new Arbre(31*200+100,4*250,Liste.arbre));
			gEntite.addEntite(new Arbre(29*200+100,5*250,Liste.arbre));
			gEntite.addEntite(new Arbre(28*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(27*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(26*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(25*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(24*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(23*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(22*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(21*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(20*200-50,7*250-100,Liste.arbre));
			gEntite.addEntite(new Arbre(7135,1560,Liste.arbre));
			gEntite.addEntite(new Arbre(2814,2770,Liste.arbre));
			gEntite.addEntite(new Arbre(2414,3270,Liste.arbre));
			gEntite.addEntite(new Arbre(2634,3710,Liste.arbre));
			gEntite.addEntite(new Arbre(800,5250,Liste.arbre));
			gEntite.addEntite(new Arbre(1000,5250,Liste.arbre));
			gEntite.addEntite(new Arbre(1200,5250,Liste.arbre));
			gEntite.addEntite(new Arbre(6685,5627,Liste.arbre));
			gEntite.addEntite(new Arbre(7245,5407,Liste.arbre));
			gEntite.addEntite(new Arbre(5635,5427,Liste.arbre));
			gEntite.addEntite(new Arbre(5633,5727,Liste.arbre));
			gEntite.addEntite(new Arbre(5515,6067,Liste.arbre));
			gEntite.addEntite(new Arbre(6855,277-23,Liste.arbre));
			gEntite.addEntite(new Arbre(6855+200,277-23,Liste.arbre));
			
			gEntite.addEntite(new Arbre(6475,3890,Liste.arbre));
			gEntite.addEntite(new Arbre(6400,3370,Liste.arbre));
			gEntite.addEntite(new Arbre(6905,2510,Liste.arbre));
			gEntite.addEntite(new Arbre(4695,2910,Liste.arbre));
			gEntite.addEntite(new Arbre(4765,3250,Liste.arbre));
			
			//pierre
			gEntite.addEntite(new Pierre(25*200,1*250,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-1*150,1*250,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-2*150,1*250,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-3*150-60,1*250,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-5*150,1*250,Liste.pierre));
			gEntite.addEntite(new Pierre(26*200-30,2*250,Liste.pierre));
			gEntite.addEntite(new Pierre(26*200-30,2*250,Liste.pierre));
			gEntite.addEntite(new Pierre(26*200+60,3*250-60,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-50,2*250+20,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-60,1*250+10+110,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-60-210,1*250+10+130,Liste.pierre));
			gEntite.addEntite(new Pierre(25*200-60-380,1*250+10+120,Liste.pierre));
			
			
			gEntite.addEntite(new Lin(6464,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*3,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*4,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*5,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*6,Liste.Elin));
			gEntite.addEntite(new Lin(6464,280+50*7,Liste.Elin));
			
			gEntite.addEntite(new Lin(6464+50,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*3,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*4,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*5,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*6,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*7,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*8,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*9,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50,280+50*10,Liste.Elin));
			
			gEntite.addEntite(new Lin(6464+50+50,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*3,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*4,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*5,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*6,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*7,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*8,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*9,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+50,280+50*10,Liste.Elin));
			
			gEntite.addEntite(new Lin(6464+50+100,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*3,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*4,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*5,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*6,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*7,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*8,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*9,Liste.Elin));
			gEntite.addEntite(new Lin(6464+50+100,280+50*10,Liste.Elin));
			
			gEntite.addEntite(new Lin(6664+50*0,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*0,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*0,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*0,280+50*3,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*1,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*1,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*1,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*1,280+50*3,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,280+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,280+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,280+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,280+50*3,Liste.Elin));
		
			gEntite.addEntite(new Lin(6664+50*0,797+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*0,797+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*0,797+50*2,Liste.Elin));
			
			gEntite.addEntite(new Lin(6664+50*1,797+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*1,797+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*1,797+50*2,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,797+50*0,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,797+50*1,Liste.Elin));
			gEntite.addEntite(new Lin(6664+50*2,797+50*2,Liste.Elin));
			
			for(int i=0;i<11;i++){
				for(int j=0;j<10;j++){
					gEntite.addEntite(new Paille(9174+50*i,277+50*j,Liste.Epaille));
				}
			}
			
			gEntite.addEntite(new Paille(9105,360-50,Liste.Epaille));
			gEntite.addEntite(new Paille(9105,360-100,Liste.Epaille));
			gEntite.addEntite(new Paille(9105-50,360-50,Liste.Epaille));
			gEntite.addEntite(new Paille(9105-100,360-50,Liste.Epaille));
			
			gEntite.addEntite(new Paille(9105,560+100,Liste.Epaille));
			gEntite.addEntite(new Paille(9105,560+50,Liste.Epaille));
			gEntite.addEntite(new Paille(9105,560,Liste.Epaille));
			gEntite.addEntite(new Paille(9035,620,Liste.Epaille));
			
			gEntite.addEntite(new Diamant(1870,5100,Liste.Ediamant));
			gEntite.addEntite(new Diamant(1900,5220,Liste.Ediamant));
			gEntite.addEntite(new Diamant(7074,3850,Liste.Ediamant));
			
			for(int i=0;i<2;i++){
				for(int j=0;j<3;j++){
					gEntite.addEntite(new Diamant(4664+150*i,2510+100*j,Liste.Ediamant));
				}
			}
			for(int i=0;i<3;i++){
				for(int j=0;j<1;j++){
					gEntite.addEntite(new Diamant(8725+150*i,3460+100*j,Liste.Ediamant));
				}
			}
			
			for(int i=0;i<3;i++){
				for(int j=0;j<3;j++){
					gEntite.addEntite(new Diamant(1414+150*i,5010+100*j,Liste.Ediamant));
				}
			}
			
			
			
			for(int i=0;i<2;i++){
				for(int j=0;j<2;j++){
					gEntite.addEntite(new Emeraude(9264+150*i+20,2520+100*j+34,Liste.Eemeraude));
				}
			}
			for(int i=0;i<3;i++){
				for(int j=0;j<4;j++){
					gEntite.addEntite(new Emeraude(8745+150*i,2980+100*j,Liste.Eemeraude));
				}
			}
			
			gEntite.addEntite(new Emeraude(9554,3200,Liste.Eemeraude));
			gEntite.addEntite(new Emeraude(7814,3630,Liste.Eemeraude));
			gEntite.addEntite(new Emeraude(8224,3650,Liste.Eemeraude));
			
			
			gEntite.addEntite(c1);
			gEntite.addEntite(c2);
			gEntite.addEntite(c3);
			gEntite.addEntite(cf);
			gEntite.addEntite(pnjAccueil);
			gEntite.addEntite(pnjAide1);
			gEntite.addEntite(pnjAide2);
			gEntite.addEntite(pnjAide3);
			gEntite.addEntite(pnj3);
			gEntite.addEntite(pj);
			gEntite.addEntite(j1);
		}
		
		// Semblable au GestionEntite
		gAnim = new GestionAnimation();
		
		gItem = new GestionItem();
		
		gRespawn = new GestionRespawn();
		
		//Creation des barres de vie,faim et soif
		
		barreJauge_vie = new BarreJauge(200,40,j1.vie,Color.red,"coeur.png");
		barreJauge_faim = new BarreJauge(600,40,j1.nourriture,new Color(145,105,30),"poulet.png");
		barreJauge_soif = new BarreJauge(1000,40,j1.eau,Color.blue,"eau.png");
		
		
		timer = new Timer((int)(1.0/60.0)*1000,this);
		timer.start();	
	}
	
	
	public void paint(Graphics g){
			
		//Buffer :
		BufferedImage monBuf = new BufferedImage(LARGEUR_FENETRE,HAUTEUR_FENETRE,BufferedImage.TYPE_INT_RGB);
		Graphics Buffer = monBuf.getGraphics();
		
		
		Buffer.setColor(Color.white);
		Buffer.fillRect(0, 0, LARGEUR_FENETRE, HAUTEUR_FENETRE);
		monde.dessine(Buffer, this);
		gItem.dessine(Buffer);
		gEntite.dessine(Buffer,this);
		gAnim.dessine(Buffer,this);
		
		//Enleve les affiches ci-dessous si le joueur a fini le jeu
		if(!cf.fin){
			affichage.dessine(Buffer);
			barreJauge_vie.dessine(Buffer,this);
			barreJauge_faim.dessine(Buffer,this);
			barreJauge_soif.dessine(Buffer,this);
		}
					
		//Dessine le  Buffer :
		g.drawImage(monBuf,0,0, this);
		
		//Affichage de la map	
		if(clavier.m){
			g.drawImage(ImageLoader.ImgLoader("map.gif"),500,100,800,800,this);
			g.setColor(new Color(215,255,31));
			g.fillOval((int)(j1.x/11) + 500,(int)((j1.y)/11) + 100,15,15);
		}
		
		//Affiche l'image gameover si le joueur est mort et quitte le jeu
		if(gameover){
			Fenetre.gEntite.getEntites().clear();	
			g.drawImage(ImageLoader.ImgLoader("gameover.gif"),0,0,this);
			compteur++;
			if(compteur > 100)
				System.exit(0);
		
		
		}
		
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(!j1.enVie)
			
		monde.tick();
		if(show){
			if(clavier.ouvrirInventaire){
				jeu.fenetre_INVENTAIRE.show=true;
				this.show=false;
			}
			gEntite.tick();
			gItem.tick();
			gRespawn.tick();
			
			barreJauge_vie.actuInfo(j1.vie);
			barreJauge_faim.actuInfo(j1.nourriture);
			barreJauge_soif.actuInfo(j1.eau);
			
			screen=ImageLoader.screen(this);
			addKeyListener(clavier);
			repaint();	
		}
	}
	
			
	
}
