package modeles;

import javafx.util.*;
import java.io.IOException;
import java.util.Random;
public class Menu {
	

	public void menuJeu() {
		Labyrinthe lab=menuStartGame();
		Marche marche= (Marche) lab.listePorte.get(0).getSalle1();
		Personnage perso = menuSelection(lab);
		boolean jeu=true;
		perso.setSalle(lab.listePorte.get(0).getSalle1());
		try {
			do {
				jeu=Menudeplacement(perso, perso.getSalle(),lab);
				if (perso.getSalle().getType().contentEquals("Marche") && perso.isVivant()) {
					lab.restore();
					MenuMarche(perso, lab);
				}
			}while(perso.isVivant() && !perso.getSalle().estSortie() && jeu);
		}catch (Exception e) {
			System.out.println(e);
		}
		if (perso.isVivant()) System.out.println("Felicitation vous avez vaincu le grand Neltharion ! Vous avez sauver Azeroth");
	}

	public String menuCombat(Monstre mons, Personnage perso, Labyrinthe lab) throws IOException {
		int degat;
		int reponse = 0;
		System.out.println("Un monstre du nom de "+mons.getNom()+" se presente devant vous et il est tres en colere \nIl lui reste : "+mons.getpVie()+"\nIl vous reste : "+perso.pVie+"\nVous avez "+perso.getPotion().size()+" potion.");
		while (true){
			System.out.println("\t - 1 attaquer\n\t - 2 Potion \n\t- 3 Fuir");
			try{
				reponse=Clavier.entrerClavierInt();
			}catch (Exception e) {
				System.in.read();
			}
			switch (reponse) {
			case 1:
				degat = perso.attaquer(mons, lab);
				System.out.println("Vous infligez "+degat+" a votre adversaire.");
				if (!mons.isVivant()) {
					perso.setpVieMax(perso.getpVieMax()+1);
					perso.soin();
					perso.getSalle().cle(lab);
					System.out.println(perso.remplirBourse());
					return "Votre ennemie trepasse et vous obtenez la cle des portes de la salle.";
				} else {
					System.out.println("Au tour de votre adversaire. Il attaque preparez vous ! ");
					System.out.println("il vous inflige "+ mons.attaquer(perso,lab)+".");
					if (!perso.isVivant()) {
						return "C'est ainsi que vous trepassez sous les coups des tenebres. Reposez vous heros... Vous avez l'eternite.";
					}
					else System.out.println("votre ennemie n'est pas encore a bout, achevez le ! \nIl lui reste :"+mons.getpVie()+"\nIl vous reste :"+perso.pVie+"\nVous avez "+perso.getPotion().size()+" potion.");
				}
				break;

			case 2 :
				if (!perso.getPotion().isEmpty()) {
					perso.utiliser(perso.getPotion().remove(0));
					System.out.println("Vous utilisez une potion. Votre vie est maintenant au maximum.");
				} else {
					System.out.println("Il ne vous reste plus de potion.");
				}
				break;

			case 3 :
				System.out.println("Vous tentez de fuir.");
				Random rd = new Random();
				if (rd.nextInt(100)<50) {
					perso.soin();
					return "Vous avez fuit.";
				} else {
					System.out.println("Ce fut un echec !");
					System.out.println("Au tour de votre adversaire. Il attaque preparez vous ! ");
					System.out.println("il vous inflige "+ mons.attaquer(perso,lab)+".");
					if (!perso.isVivant()) {
						return "C'est ainsi que vous trepassez sous les coups des tenebres. Reposez vous heros... Vous avez l'eternite.";
					}
					else System.out.println("votre ennemie n'est pas encore a bout, achevez le ! \nIl lui reste :"+mons.getpVie()+"\nIl vous reste :"+perso.pVie+"\nVous avez "+perso.getPotion().size()+" potion.");
				}
			}

		}
	}

	public Labyrinthe menuStartGame() {
		System.out.println("L'Aventure vous appelle ! Le choix s'offre a vous, une histoire peut s'ecrire une autre peut continuer :\n1) Nouvelle Partie\n2) Continuer votre progression");
		switch(Clavier.entrerClavierInt()) {
		case 1:
			return new Labyrinthe();
		case 2:
			Generateur ge = new Generateur();
			return ge.labyrinthe();
		default :
			return null;
		}
	}

	public Personnage menuSelection(Labyrinthe lab) {
		System.out.println("Bonjour Etranger, je suis le narrateur de votre histoire. Comment dois-je vous appeler ? ");
		int i = 0;
		for (Personnage per : lab.listePersonnage) {
			System.out.println(i++ + ") "+per.getNom());
		}

		Personnage pers;
		try{
			pers =lab.listePersonnage.get(Clavier.entrerClavierInt());
		}
		catch(Exception e) {
			System.out.println("Le personnage dont vous me parlez n'existe pas.");
			return null;
		}
		System.out.println("Enchante de vous rencontrer "+pers.getNom()+".");
		return pers;
	}

	public boolean Menudeplacement(Personnage perso, Salle salle,Labyrinthe lab) throws IOException {
		Generateur gene =new Generateur();
		System.out.println("Choisissez une direction:\n Z) Haut\n S) Bas\n D) Droite\n Q) Gauche\n X) sauvegarder et quitter");
		Salle s;
		Monstre mons;
		Pair<Integer,Integer>next;
		String csb="";
		switch(Clavier.entrerClavierString()) {
		case "Z":
			next=new Pair(salle.getCoordonnes().getKey(),salle.getCoordonnes().getValue()+1);
			if((s=salle.findNextSalle(next, lab))==null){
				System.out.println("Je ne connais pas cette salle");
				Menudeplacement(perso, salle, lab);
			} 
			while (!s.estVide() && perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				mons=lab.listeMonstre.get(s.getListeEnnemie().get(0));
				csb=menuCombat(mons, perso, lab);
				if (csb.contentEquals("Votre ennemie trepasse et vous obtenez la cle des portes de la salle.")) {
					s.getListeEnnemie().remove(0);
				}
				System.out.println(csb);
			}
			if (perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				System.out.println("vous vous deplacez");
				perso.seDeplacer(s);
			}
			break;
		case "S":
			next=new Pair(salle.getCoordonnes().getKey(),salle.getCoordonnes().getValue()-1);
			if((s=salle.findNextSalle(next, lab))==null){
				System.out.println("Je ne connais pas cette salle");
				Menudeplacement(perso, salle, lab);
				break;
			}
			while (!s.estVide() && perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				mons =lab.listeMonstre.get(s.getListeEnnemie().get(0));
				csb=menuCombat(mons, perso, lab);
				if (csb.contentEquals("Votre ennemie trepasse et vous obtenez la cle des portes de la salle.")) {
					s.getListeEnnemie().remove(0);
				}
				System.out.println(csb);
			}
			if (perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				System.out.println("vous vous deplacez");
				perso.seDeplacer(s);
			}
			break;
		case "D":
			next=new Pair(salle.getCoordonnes().getKey()+1,salle.getCoordonnes().getValue());
			if((s=salle.findNextSalle(next, lab))==null){
				System.out.println("Je ne connais pas cette salle");
				Menudeplacement(perso, salle, lab);
				break;
			}
			while (!s.estVide() && perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				mons =lab.listeMonstre.get(s.getListeEnnemie().get(0));
				csb=menuCombat(mons, perso, lab);
				if (csb.contentEquals("Votre ennemie trepasse et vous obtenez la cle des portes de la salle.")) {
					s.getListeEnnemie().remove(0);
				}
				System.out.println(csb);
			}
			if (perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				System.out.println("vous vous deplacez");
				perso.seDeplacer(s);
			}
			break;
		case "Q":
			next=new Pair(salle.getCoordonnes().getKey()-1,salle.getCoordonnes().getValue());
			if((s=salle.findNextSalle(next, lab))==null){
				System.out.println("Je ne connais pas cette salle");
				Menudeplacement(perso, salle, lab);
				break;
			}
			while (!s.estVide() && perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				mons =lab.listeMonstre.get(s.getListeEnnemie().get(0));
				csb=menuCombat(mons, perso, lab);
				if (csb.contentEquals("Votre ennemie trepasse et vous obtenez la cle des portes de la salle.")) {
					s.getListeEnnemie().remove(0);
				}
				System.out.println(csb);
			}
			if (perso.isVivant() && !csb.contentEquals("Vous avez fuit.")) {
				System.out.println("vous vous deplacez");
				perso.seDeplacer(s);
			}
			break;
		case "X" :
			try {
				gene.save(lab);
				}catch(Exception e) {
					System.out.println(e);
				}
			return false;
		default :
			System.out.println("erreur de lecture");
		}
		if(perso.isVivant())System.out.println("Vous etes a la salle de coordonnes "+perso.getSalle().getCoordonnes().getKey()+" "+perso.getSalle().getCoordonnes().getValue()+".");
		return true;
	}

	public void MenuMarche(Personnage perso, Labyrinthe lab) {
		System.out.println("Voulez-vous acheter un objet:(votre bourse :"+perso.getValeurBourse() +")\n1) Oui\n2) Non");
		switch(Clavier.entrerClavierString()) {
		case "1":
			System.out.println(Marche.creerObjetsAVendre(lab)+"\nVoulez-vous acheter une arme ? (oui/non)");
			String selection=Clavier.entrerClavierString();
			if(selection.contentEquals("oui")) {
				System.out.println("Quel numero pour l'arme ?");
				int valeur = Clavier.entrerClavierInt();
				if (perso.getBourse().Achat(lab.listeArme.get(valeur))>=0) perso.equiper(lab.listeArme.get(valeur),lab);
			} else {
				System.out.println("Pourquoi Pas une armure alors ? (oui/non)");
				selection=Clavier.entrerClavierString();
				if(selection.contentEquals("oui")) {
					System.out.println("Quel numero pour l'armure ?");
					int valeur = Clavier.entrerClavierInt();
					if (perso.getBourse().Achat(lab.listeArmure.get(valeur))>=0) perso.equiper(lab.listeArmure.get(valeur),lab);
				}
			}
			break;
		case "2":
			System.out.println("Vous sortez du marche.");
		}
	}
}
