import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Dimension;
import java.awt.event.*;

import java.util.List;
import java.util.ArrayList;

public class GestionEtudiantsIhm extends JFrame {

	FormulaireEtudiant panneauFormulaire;
	PanneauListeEtudiants panneauListeEtudiants;
	JButton boutonEditer;
	JButton boutonModifier;
	JButton boutonAjouter;
	JButton boutonSupprimer;

	public GestionEtudiantsIhm(List<Etudiant> etudiants) {
		setLayout(new BorderLayout());

		// panneau contenant la liste des étudiants à l'Ouest
		panneauListeEtudiants = new PanneauListeEtudiants(etudiants);
		add(panneauListeEtudiants, BorderLayout.WEST);

		// panneau contenant le formulaire de saisie d'un étudiant
		panneauFormulaire = new FormulaireEtudiant();
		add(panneauFormulaire, BorderLayout.EAST);

		// panneau des boutons d'action au centre
		JPanel panneauBoutons, panneauCentral;
		panneauCentral = new JPanel();
		panneauCentral.setLayout(new BorderLayout());
		panneauBoutons = new JPanel();
		panneauBoutons.setLayout(new GridLayout(0,1));
		boutonEditer = new JButton("Editer =>");
		boutonModifier = new JButton("<= Modifier");
		boutonAjouter = new JButton("<= Ajouter");
		boutonSupprimer = new JButton("X Supprimer X");
		panneauBoutons.add(boutonEditer);
		panneauBoutons.add(boutonModifier);
		panneauBoutons.add(boutonAjouter);
		panneauBoutons.add(boutonSupprimer);
		panneauCentral.add(panneauBoutons, BorderLayout.CENTER);
		JPanel tampon = new JPanel();
		tampon.setPreferredSize(new Dimension(1,50));
		panneauCentral.add(tampon, BorderLayout.SOUTH);
		add(panneauCentral, BorderLayout.CENTER);

		// Gestion des événements
		boutonAjouter.addActionListener(new EcouteurBoutonAjouter(this));
		boutonModifier.addActionListener(new EcouteurBoutonModifier(this));
		boutonEditer.addActionListener(new EcouteurBoutonEditer(this));
		boutonSupprimer.addActionListener(new EcouteurBoutonSupprimer(this));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Assemblage et affichage
		pack();
		setVisible(true);
	}

	/**
	 * ajoute l'étudiant saisi dans le formulaire dans la liste des étudiants
	 */ 
	public void ajouterEtudiant() {
		// TODO : récupérer les valeurs dans le formulaire
		// et ajouter le nouvel étudiant corrrespondant
		System.out.println("TODO AJOUTER");
		System.out.println(panneauFormulaire.getNom() + " "
			+ panneauFormulaire.getPrenom() + " "
			+ panneauFormulaire.getAge() + " "
			+ panneauFormulaire.getSpecialite() + " "
			+ panneauFormulaire.getMoyenne());
		// Correction :
		panneauListeEtudiants.ajouterEtudiant(panneauFormulaire.getEtudiant());
	}

	/**
 	 * place l'étudiant sélectionné dans la liste dans le
 	 * formulaire de saisie
 	 */ 
	public void editerEtudiant() {
		// TODO : récupérer l'étudiant selectionné dans la liste
		// et le charger dans le formulaire
		System.out.println("TODO EDITER");
		// Correction :
		Etudiant etudiantAEditer = panneauListeEtudiants.getSelectedEtudiant();
		if (etudiantAEditer != null) {
			System.out.println(etudiantAEditer);
			panneauFormulaire.initChampsFormulaire(etudiantAEditer);
		}
	}

	/**
 	 * remplace les données de l'étudiant sélectionné dans la liste
 	 * par les infos contenues dans le formulaire
 	 */ 
	public void modifierEtudiant() {
		// TODO : récupérer les valeurs dans le formulaire
		// et modifier l'étudiant séléctionné dans la liste
		System.out.println("TODO MODIFIER");
		System.out.println(panneauFormulaire.getEtudiant());
		// Correction :
		panneauListeEtudiants.modifierEtudiant(panneauFormulaire.getEtudiant());
	}

	/**
     * supprimer l'étudiant selectionné de la liste d'étudiants
     */ 
	public void supprimerEtudiant() {
		// TODO : récupérer les valeurs dans le formulaire
		// et modifier l'étudiant séléctionné dans la liste
		System.out.println("TODO SUPPRIMER");
		// Correction :
		panneauListeEtudiants.supprimerEtudiantSelectionne();
	}


	/**
 	 * application principale : lance l'IHM initialisée avec
 	 * une liste de quelques étudiants
 	 */ 
	public static void main(String[] args) {
		List<Etudiant> etudiants;
		GestionEtudiantsIhm ihm;
		etudiants = new ArrayList<Etudiant>();
		etudiants.add(new Etudiant("Eme", "Maud", 21, Specialite.Informatique, 12.0));
		etudiants.add(new Etudiant("Dupont", "Henri", 22, Specialite.Mathematique, 8.0));
		etudiants.add(new Etudiant("Durand", "Paul", 21, Specialite.Informatique, 16.0));
		ihm = new GestionEtudiantsIhm(etudiants);
	}
}


// Ecouteurs mettant en relation les boutons d'action de l'IHM avec ses méthodes
// de modification de la liste d'étudiants

class EcouteurBoutonModifier implements ActionListener {
	private GestionEtudiantsIhm ihm;

	public EcouteurBoutonModifier(GestionEtudiantsIhm _ihm) {
		ihm = _ihm;
	}

	public void actionPerformed(ActionEvent e) {
		ihm.modifierEtudiant();
	}
}

class EcouteurBoutonEditer implements ActionListener {
	private GestionEtudiantsIhm ihm;

	public EcouteurBoutonEditer(GestionEtudiantsIhm _ihm) {
		ihm = _ihm;
	}

	public void actionPerformed(ActionEvent e) {
		ihm.editerEtudiant();
	}
}

class EcouteurBoutonSupprimer implements ActionListener {
	private GestionEtudiantsIhm ihm;

	public EcouteurBoutonSupprimer(GestionEtudiantsIhm _ihm) {
		ihm = _ihm;
	}

	public void actionPerformed(ActionEvent e) {
		ihm.supprimerEtudiant();
	}
}

class EcouteurBoutonAjouter implements ActionListener {
	private GestionEtudiantsIhm ihm;

	public EcouteurBoutonAjouter(GestionEtudiantsIhm _ihm) {
		ihm = _ihm;
	}

	public void actionPerformed(ActionEvent e) {
		ihm.ajouterEtudiant();
	}
}
