/**
*Programme cree par The Clusters
*Classe de IHM graphique qui permet de creer une partie sur le reseau
*@see Serveur.java,
* @author The Clusters
*@version 1.0
**/

package chkoba;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.FileReader;
import java.util.Scanner;
import java.util.ArrayList;
import chkoba.*;

/**
*	Classe Cree
*/

public class Cree extends JFrame implements ActionListener
{
	private JPanel /** panel gerant la bordure de la fenetre*/pDecorateur, /** panel ou vont s'ajouter tous les elements de la fenetre*/pGeneral, /** panel des boutons*/pBouton, /**panel gerant le panel des boutons */pSudBouton, /**panel gerant la bordure des radioboutons 2 ou 4 joueur */pDecorateur1;
	private JPanel /**panel gerant la bordure des radioboutons nombre de joueur humain */pDecorateur2, /**  panel gerant la bordure des radioboutons de team*/pDecorateur3, /** panel gerant toute la partie gauche du panel general*/pGauche, /** panel gerant toute la partie droite du panel general*/pDroit;
	private JPanel /**  panel gerant les radioboutons nombre de joueur*/pGaucheRadio, /** panel gerant les radioboutons nombre de joueur humain*/pDroitRadio, /** panel gerant la partie gauche et la partie droite*/pCentre, /** panel gerant les radioboutons en campagne ou en reseau*/pcreepartie, /** panel gerant les radioboutons de team*/pDroitTeam;
	private JButton /** bouton qui lance le jeu*/cree, /** bouton qui revient a la fenetre d'index*/retour;
	private JRadioButton /** jeu a 2 joueur*/deuxJ, /** jeu a 4 joueur*/quatreJ, /** deux joueur humain*/deuxJH, /** trois joueur humain*/troisJH, /** quatre joueur humain*/quatreJH, /** jeu en reseau*/rserveur, /** jeu en solitaire*/passerveur, /** gestion des equipe, allie n 1*/allie2, /** gestion des equipe, allie n 2*/allie3, /** gestion des equipe, allie n 3*/allie4;
	private ButtonGroup /** boutongroup de gestion du nombre de joueur*/bg1, /** boutongroup de gestion du nombre de joueur humain*/bg2, /** boutongroup de gestion du reseau*/bg3, /** boutongroup de gestion des equipes*/bg4;
	private JLabel /** label intitule nombre de joueur*/lnbJoueur, /** label intitule nombre de joueur humain*/lnbJoueurHumain, /** label vide pour la décoration nord*/lDecoN, /** label vide pour la décoration sud*/lDecoS, /** label vide pour la décoration ouest*/lDecoO, /** label vide pour la décoration est*/lDecoE, lDecoN1, lDecoS1, lDecoO1, lDecoE1, lDecoN2, lDecoS2, lDecoO2, lDecoE2, vide, lDecoN3, lDecoS3, lDecoO3, lDecoE3;
	private Index /** Index qui permet de revenir a l'index precedent*/ind;
	private IServeur /** serveur permettant de cree tous les objets en reseau*/serveur;
	private String /** string permettant la recuperation du nom du joueur dans le fichier config.txt*/joueur1;
	/** Creation d'arraylist d'integer pour la gestion des equipes*/
	private ArrayList<Integer> tm1=new ArrayList<Integer>();	
	private ArrayList<Integer> tm2=new ArrayList<Integer>();
	
	/** Creation de la fenetre avec en parametre l'index d'ou est issue le cree*/
	
	public Cree(Index i)
	{
		setTitle("Creer une partie");
		setLocation(50,200);
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setIconImage(Toolkit.getDefaultToolkit().getImage(Cree.class.getResource("./icone.png")));	//permet de changer l'image dans le haut de la frame
		ind = i;
		
		/* Creation des panels */
		
		pGeneral = new JPanel();
		pDecorateur = new JPanel();
		pDecorateur1 = new JPanel();
		pDecorateur2 = new JPanel();
		pDecorateur3 = new JPanel();
		pBouton = new JPanel();
		pSudBouton = new JPanel();
		pGauche = new JPanel();
		pDroit = new JPanel();
		pGaucheRadio = new JPanel();
		pDroitRadio = new JPanel();
		pCentre = new JPanel();
		pcreepartie = new JPanel();
		pDroitTeam = new JPanel();
		
		/* Changement d'etat des panels */
		
		pDecorateur.setLayout(new BorderLayout());		// panel gerant la bordure de la fenetre
		pDecorateur1.setLayout(new BorderLayout());		// panel gerant la bordure des radioboutons 2 ou 4 joueur
		pDecorateur2.setLayout(new BorderLayout());		// panel gerant la bordure des radioboutons nombre de joueur humain
		pDecorateur3.setLayout(new BorderLayout());		// panel gerant la bordure des radioboutons de team
		pGeneral.setLayout(new BorderLayout());		// panel ou vont s'ajouter tous les elements de la fenetre
		pBouton.setLayout(new FlowLayout());			// panel des boutons
		pSudBouton.setLayout(new BorderLayout());		// panel gerant le panel des boutons
		pGauche.setLayout(new BorderLayout());		// panel gerant toute la partie gauche du panel general
		pDroit.setLayout(new BorderLayout());			// panel gerant toute la partie droite du panel general
		pGaucheRadio.setLayout(new GridLayout(2,1));	// panel gerant les radioboutons nombre de joueur
		pDroitRadio.setLayout(new GridLayout(3,1));		// panel gerant les radioboutons nombre de joueur humain
		pCentre.setLayout(new GridLayout(1,2));		// panel gerant la partie gauche et la partie droite
		pcreepartie.setLayout(new FlowLayout());		// panel gerant les radioboutons en campagne ou en reseau
		pDroitTeam.setLayout(new GridLayout(3,2));		// panel gerant les radioboutons de team
		
		/* Ajout du Panel principal */
		
		add(pDecorateur);
		pDecorateur.add(pGeneral);
		
		/* On s'occupe de la deco */
		
		lDecoN = new JLabel(" ");
		lDecoS = new JLabel(" ");
		lDecoO = new JLabel("       ");
		lDecoE = new JLabel("       ");
		
		pDecorateur.add(lDecoN, "North");
		pDecorateur.add(lDecoS, "South");
		pDecorateur.add(lDecoO, "West");
		pDecorateur.add(lDecoE, "East");

		lDecoN.setBackground(Color.LIGHT_GRAY);
		lDecoN.setOpaque(true); // permet de rendre le label opaque et non plus transparent
		lDecoS.setBackground(Color.LIGHT_GRAY);
		lDecoS.setOpaque(true);
		lDecoO.setBackground(Color.LIGHT_GRAY);
		lDecoO.setOpaque(true);
		lDecoE.setBackground(Color.LIGHT_GRAY);
		lDecoE.setOpaque(true);
		
		/* On s'occupe du nord */
		
		/* Creation du boutongroup et des deux radioboutons */
		
		bg3 = new ButtonGroup();
		rserveur = new JRadioButton("En reseau");
		passerveur = new JRadioButton("Campagne");
		
		rserveur.addActionListener(this);
		passerveur.addActionListener(this);
		
		bg3.add(rserveur);
		bg3.add(passerveur);
		
		/* Par defaut c'est le mode campagne qui sera selectionne */
		
		passerveur.setSelected(true);
		pcreepartie.setOpaque(true);
		
		/* On ajoute les radioboutons a leur panel */
		
		pcreepartie.add(passerveur);
		pcreepartie.add(rserveur);
		pGeneral.add(pcreepartie, "North");
		
		/* On s'occupe de la partie gauche */
		
		/* Creation du boutongroup et des deux radioboutons */
		
		bg1 = new ButtonGroup();
		deuxJ = new JRadioButton("2J");
		deuxJ.addActionListener(this);
		
		quatreJ = new JRadioButton("4J");
		quatreJ.addActionListener(this);
		
		bg1.add(deuxJ);
		bg1.add(quatreJ);
		
		/* Par defaut c'est le mode 2joueur qui sera selectionne */
		
		deuxJ.setSelected(true);
		
		/* On ajoute les radioboutons a leur panel, onchange la couleur de fond et on a joute le panel radiobouton au panel decorateur */
		
		pGaucheRadio.add(deuxJ);
		pGaucheRadio.add(quatreJ);
		pGaucheRadio.setBackground(Color.LIGHT_GRAY);
		pDecorateur1.add(pGaucheRadio);
		
		/* On s'occupe de la deco de la partie gauche */
			
		lDecoN1 = new JLabel(" ");
		lDecoS1 = new JLabel(" ");
		lDecoO1 = new JLabel("       ");
		lDecoE1 = new JLabel("       ");
		
		pDecorateur1.add(lDecoN1, "North");
		pDecorateur1.add(lDecoS1, "South");
		pDecorateur1.add(lDecoO1, "West");
		pDecorateur1.add(lDecoE1, "East");

		lDecoN1.setBackground(Color.LIGHT_GRAY);
		lDecoN1.setOpaque(true); // permet de rendre le label opaque et non plus transparent
		lDecoS1.setBackground(Color.LIGHT_GRAY);
		lDecoS1.setOpaque(true);
		lDecoO1.setBackground(Color.LIGHT_GRAY);
		lDecoO1.setOpaque(true);
		lDecoE1.setBackground(Color.LIGHT_GRAY);
		lDecoE1.setOpaque(true);
		
		/* On ajoute le panel decorateur au panel de gauche */
		
		pGauche.add(pDecorateur1);
		
		/* On s'occupe du label de gauche */
		
		lnbJoueur = new JLabel("Nombre de joueurs ?");
		lnbJoueur.setOpaque(true);
		lnbJoueur.setBackground(Color.LIGHT_GRAY);
		pGauche.add(lnbJoueur, "North");
		
		/* On s'occupe de la partie droite */
		
		/* Creation du boutongroup et des trois radioboutons */
		
		bg2 = new ButtonGroup();
		deuxJH = new JRadioButton("2J");
		troisJH = new JRadioButton("3J");
		quatreJH = new JRadioButton("4J");
		
		deuxJH.addActionListener(this);
		troisJH.addActionListener(this);
		quatreJH.addActionListener(this);
		
		/* Par defaut il ne seront pas clicable vu que c'est un mode accessible uniquement en reseau et que le reseau n'est pas selectionne par defaut */
		
		deuxJH.setEnabled(false);
		troisJH.setEnabled(false);
		quatreJH.setEnabled(false);
		
		bg2.add(deuxJH);
		bg2.add(troisJH);
		bg2.add(quatreJH);
		
		/* On s'occupe des boutons de team */
		
		/* Creation du boutongroup et des trois radioboutons */
		
		bg4 = new ButtonGroup();
		allie2 = new JRadioButton("Allie avec le joueur 2");
		allie3 = new JRadioButton("Allie avec le joueur 3");
		allie4 = new JRadioButton("Allie avec le joueur 4");
		vide = new JLabel(" ");
		
		bg4.add(allie2);
		bg4.add(allie3);
		bg4.add(allie4);
		
		/* Par defaut il ne seront pas clicable vu que c'est un mode accessible uniquement en reseau et que le reseau n'est pas selectionne par defaut */
		
		allie2.setEnabled(false);
		allie3.setEnabled(false);
		allie4.setEnabled(false);
		
		allie2.addActionListener(this);
		allie3.addActionListener(this);
		allie4.addActionListener(this);
		
		/* Ajout des radioboutons de team a leur panel */
		
		pDroitTeam.add(allie2);
		pDroitTeam.add(allie3);
		pDroitTeam.add(allie4);
		
		/* Ajout des radioboutons du nombre de joueur humain a leur panel */
		
		pDroitRadio.add(deuxJH);
		pDroitRadio.add(troisJH);
		pDroitRadio.add(quatreJH);
		
		/* Ajout des panels des radioboutons a leur panel decorateur respectif */
		
		pDroitTeam.setBackground(Color.LIGHT_GRAY);
		pDecorateur3.add(pDroitTeam);
		pDecorateur2.add(pDroitRadio);
		
		/* On s'occupe de la deco des rediobouton des teams */
		
		lDecoN3 = new JLabel(" ");
		lDecoS3 = new JLabel(" ");
		lDecoO3 = new JLabel("       ");
		lDecoE3 = new JLabel("       ");
		
		pDecorateur3.add(lDecoN3, "North");
		pDecorateur3.add(lDecoS3, "South");
		pDecorateur3.add(lDecoO3, "West");
		pDecorateur3.add(lDecoE3, "East");

		lDecoN3.setBackground(Color.LIGHT_GRAY);
		lDecoN3.setOpaque(true); // permet de rendre le label opaque et non plus transparent
		lDecoS3.setBackground(Color.LIGHT_GRAY);
		lDecoS3.setOpaque(true);
		lDecoO3.setBackground(Color.LIGHT_GRAY);
		lDecoO3.setOpaque(true);
		lDecoE3.setBackground(Color.LIGHT_GRAY);
		lDecoE3.setOpaque(true);
		
		/* On s'occupe de la deco  des radioboutons du nombre de joueur humain */
			
		lDecoN2 = new JLabel(" ");
		lDecoS2 = new JLabel(" ");
		lDecoO2 = new JLabel("       ");
		lDecoE2 = new JLabel("       ");
		
		pDecorateur2.add(lDecoN2, "North");
		pDecorateur2.add(lDecoS2, "South");
		pDecorateur2.add(lDecoO2, "West");
		pDecorateur2.add(lDecoE2, "East");

		lDecoN2.setBackground(Color.LIGHT_GRAY);
		lDecoN2.setOpaque(true); // permet de rendre le label opaque et non plus transparent
		lDecoS2.setBackground(Color.LIGHT_GRAY);
		lDecoS2.setOpaque(true);
		lDecoO2.setBackground(Color.LIGHT_GRAY);
		lDecoO2.setOpaque(true);
		lDecoE2.setBackground(Color.LIGHT_GRAY);
		lDecoE2.setOpaque(true);
		
		/* On ajoute le panel decorateur au panel de droite */
		
		pDecorateur3.add(pDroitTeam);
		pDroit.add(pDecorateur3, "East");
		pDroit.add(pDecorateur2);
		
		/* On s'occupe du label de droite */
		
		lnbJoueurHumain = new JLabel("Nombre de joueurs humain ?");
		lnbJoueurHumain.setOpaque(true);
		lnbJoueurHumain.setBackground(Color.LIGHT_GRAY);
		pDroit.add(lnbJoueurHumain, "North");
		
		/* On change la couleur de fond */
		
		pSudBouton.setBackground(Color.LIGHT_GRAY);
		pcreepartie.setBackground(Color.LIGHT_GRAY);
		pBouton.setBackground(Color.LIGHT_GRAY);
		
		/* On s'occupe des boutons */
		
		cree = new JButton("Creer");
		retour = new JButton("Retour");
		
		cree.addActionListener(this);
		retour.addActionListener(this);
		
		pBouton.add(cree);
		pBouton.add(retour);
		
		pSudBouton.add(pBouton, "East");
		pGeneral.add(pSudBouton, "South");
		
		/* On ajoute les panels de gauche et de droite au panel central puis au panel general */
		
		pCentre.add(pGauche);
		pCentre.add(pDroit);
		pGeneral.add(pCentre);
		
		/* Comme on a pas défini de taille par defaut il faut faire un pack afin de faire une taille minimum automatique et biensur on rend la fenetre visible */

		pack();
		setVisible(true);
	}
	
	/** Permet la gestion des radioboutons et des boutons*/
	
	public void actionPerformed(ActionEvent e)
	{
		try
		{
			// Recuperation dans le fichier config du nom de l'utilisateur uniquement
			FileReader fr = new FileReader ("config.txt");
			Scanner scan = new Scanner(fr);
			scan.useDelimiter("\t");
			joueur1 = scan.next();
		}
		catch(Exception exc)
		{
			System.out.println("probleme dans la recuperation des noms dans le fichier config.txt");
			exc.printStackTrace();
		}
		
		// On s'occuppe des boutons campagne et serveur
		if (e.getSource() == passerveur)
		{
			if ( deuxJH.isEnabled() )		// lorsque l'on clic sur le radiobouton campagne si le bouton 2joueur humain est seclectionne on met tout a false
			{
				deuxJH.setEnabled(false);
				troisJH.setEnabled(false);
				quatreJH.setEnabled(false);
				allie2.setEnabled(false);
				allie3.setEnabled(false);
				allie4.setEnabled(false);
			}
		}
		else if (e.getSource() == rserveur)
		{	
			if ( deuxJ.isSelected() )
			{
				if ( deuxJH.isEnabled() )	// lorsque l'on clic sur le radiobouton reseau si le 2joueur et 2joueur humain sont seclectionne on met tout a false
				{
					deuxJH.setEnabled(false);
					troisJH.setEnabled(false);
					quatreJH.setEnabled(false);
					allie2.setEnabled(false);
					allie3.setEnabled(false);
					allie4.setEnabled(false);
					allie2.setSelected(false);
					deuxJH.setSelected(false);
				}
			}		
			else if ( quatreJ.isSelected() )
			{
				if ( !deuxJH.isEnabled() )	// lorsque l'on clic sur le radiobouton reseau si le 4joueur est selectionne et 2joueur humain n'est pas clicable on met tout a true
				{
					deuxJH.setEnabled(true);
					troisJH.setEnabled(true);
					quatreJH.setEnabled(true);
					allie2.setEnabled(true);
					allie3.setEnabled(true);
					allie4.setEnabled(true);
					allie2.setSelected(true);
					deuxJH.setSelected(true);
				}
			}
		}
		
		else if ( e.getSource() == deuxJ )		
		{
			if ( deuxJH.isEnabled() )	// lorsque l'on clic sur le radiobouton 2joueur et 2joueur humain est seclectionne on met tout a false
			{
				deuxJH.setEnabled(false);
				troisJH.setEnabled(false);
				quatreJH.setEnabled(false);
				allie2.setEnabled(false);
				allie3.setEnabled(false);
				allie4.setEnabled(false);
				allie2.setSelected(false);
				deuxJH.setSelected(false);
			}
		}
		
		else if ( e.getSource() == quatreJ )
		{
			if ( rserveur.isSelected() )		// lorsque l'on clic sur le radiobouton 4joueur et reseau est selectionne et 2joueur humain n'est pas clicable on met tout a true
			{
				if ( !deuxJH.isEnabled() )
				{
					deuxJH.setEnabled(true);
					troisJH.setEnabled(true);
					quatreJH.setEnabled(true);
					allie2.setEnabled(true);
					allie3.setEnabled(true);
					allie4.setEnabled(true);
					allie2.setSelected(true);
					deuxJH.setSelected(true);
				}
			}
			else
			{
				if ( deuxJH.isEnabled() )		// lorsque l'on clic sur le radiobouton 4joueur et reseau n'est pas selectionne 2joueur humain est seclectionne on met tout a false
				{
					deuxJH.setEnabled(false);
					troisJH.setEnabled(false);
					quatreJH.setEnabled(false);
					allie2.setEnabled(false);
					allie3.setEnabled(false);
					allie4.setEnabled(false);
					allie2.setSelected(false);
					deuxJH.setSelected(false);
				}
			}
		}
		else if (e.getSource() == retour)
		{
			// On rend la fenetre de creation invisible et on rend l'index a nouveau visible
			setVisible(false);
			ind.setVisible(true);
		}
		else if (e.getSource() == cree)
		{
			if (passerveur.isSelected())
			{
				// En mode compagne
				if ( deuxJ.isSelected() )
				{
					setVisible(false);
					new IHMPlateau(ind, true, 1, joueur1, 0, 0);			// Creation du plateau 2joueur de base
				}
				else if (quatreJ.isSelected())
				{
					setVisible(false);
					tm1.add(1); 							// Creation des equipes
					tm1.add(3);
					tm2.add(2); 
					tm2.add(4);
					
					new IHMPlateau4j(ind, true, tm1, tm2, 1, joueur1, 0, 0);	// Creation du plateau 4joueur de base
				}	
			}
			else 
			{				
				//Si on est en mode serveur : 
				
				if (deuxJ.isSelected())
				{
					setVisible(false);
					try
					{
						// On cree le serveur
						// Cela corresond a la creation des objets 
						// ainsi que leur mise en reseau
						serveur=new Serveur(2, 2, tm1);
					}
					catch(Exception exc)
					{
						exc.printStackTrace();
					}
					
					//On cree une instance du plateau en interface graphique
					//Le vrai plateau avec les objets etant cree dans Serveur.
					new IHMPlateau(ind, false, 1, joueur1, 0, 0);
				}
				else
				{
					int x=1;					// x represente le nombre de joueur humain, de base il est forcement a 1
					setVisible(false);
					
					if ( deuxJH.isSelected())		// En fonction du radiobouton du nombre de joueur humain seclectionne le x va changer 
						x=2;
					else if ( troisJH.isSelected())
						x=3;
					else if ( quatreJH.isSelected())
						x=4;					// creation des joueurs auto, autant qu'il reste de place non prise par les joueur humain
					
					if (allie2.isSelected() == true )	// Creation des equipes en fonction des radioboutons selectionne
					{
						tm1.add(1); 
						tm1.add(2);
						tm2.add(3);
						tm2.add(4);
					}
					else if (allie3.isSelected() == true)
					{
						tm1.add(1); 
						tm1.add(3); 
						tm2.add(2);
						tm2.add(4);
					}
					else if (allie4.isSelected() == true )
					{
						tm1.add(1); 
						tm1.add(4); 
						tm2.add(2);
						tm2.add(3);
					}
					
					try
					{
						serveur=new Serveur(4, x, tm1);
					}
					catch(Exception exc)
					{
						exc.printStackTrace();
					}
					new IHMPlateau4j(ind, false, tm1, tm2, x, joueur1, 0, 0);	// Creation du plateau 4joueur en reseau
				}
			}	
		}
	}
}