package clientIHM;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import client.ClientGestTopics;

import chat.ChatRoom;
import chat.Chatter;

/** Interface principale d'accueil du client. Instancie les autres écrans 
 * de configuration et permet d'y accéder par des boutons.
 */
public class ChatterIHM extends JFrame implements Chatter,ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/** Loge le texte des posts sur la chatroom courante */
	JTextArea texte;
	/** loge le message actuellement tapé par l'utilisateur */
	JTextField messageField;
	/** envoie le message courant. (On doit être connecté à une chatroom) */
	JButton postButton;
	/** configure et lance la connection au serveur de topics */
	JButton connectionButton;
	/** permet de choisir un topic à rejoindre ou créer un topic */
	JButton topicsButton;
	/** Permet de modifier le pseudo et le mot de passe utilisé lors de la connection 
	 * */
	JButton pseudoButton;
	
	/** le gestionnaire de topic (proxy coté client du gestionnaire Topics). */ 
	ClientGestTopics gt ;
	/** La chatroom courante, sur laquelle est envoyée le prochain post */
	ChatRoom cr;
	/** ecran d'IHM de gestion connection */
	GestConnectionIHM confConn;
	/** ecran d'IHM de gestion de topic */
	GestChatRoomIHM confTopic;
	/** ecran d'IHM de gestion du login */
	GestPseudoIHM confPseudo;
	/** protocole de connection , pour forcer l'emploi correct des boutons */
	enum SessionState {
		DISCONNECTED,
		CONNECTED,
		CHATTING
	}
	
	SessionState state;
	JPanel jp;
	
	/** Crée une fenêtre d'accueil et intancie les classes liées. Gère les l'ajout des actionListener aux boutons. */
	public ChatterIHM () {
		// local vars and settings
		setTitle("Chat");
		this.setSize(600,400);
		gt = new ClientGestTopics();

		confConn = new GestConnectionIHM(gt,this);
		confTopic = new GestChatRoomIHM (gt,this);
		confPseudo = new GestPseudoIHM ();


		// buttons
		// Pour les posts
		JPanel saisieZone = new JPanel();
		postButton = new JButton("Post");
		postButton.addActionListener(this);
		messageField = new JTextField(40);
		saisieZone.add(messageField);
		saisieZone.add(postButton);
		this.add(saisieZone,"South");
		// pour les boutons pour ouvrir les autres IHM
		JPanel configZone = new JPanel();
		connectionButton = new JButton ("Connection");
		connectionButton.addActionListener(this);
		topicsButton = new JButton ("Choisir ChatRoom");
		topicsButton.addActionListener(this);
		pseudoButton = new JButton ("Gestion pseudo");
		pseudoButton.addActionListener(this);
		configZone.add(connectionButton);
		configZone.add(topicsButton);
		configZone.add(pseudoButton);
		this.add(configZone,"North");
		
		// la session en cours
		texte = new JTextArea(40,50);
		this.add(texte,"Center");
		
		// Gérer le click sur la croix : fermer
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		
		// état de la session : conditionne quels boutons sont actuellement actifs. 
		setState(SessionState.DISCONNECTED);

		
	}
	
	/** Affiche le message reçu dans la zone de texte à l'écran */
	public void recevoirMessage(String message, Chatter auteur) {
		texte.setText(texte.getText()+"\n"+auteur.getPseudo()+ " > " + message);
	}

	/** rend le pseudo, utilisé pour étiqueter le message sortant */
	public String getPseudo() {
		// TODO Auto-generated method stub
		return confPseudo.pseudo;
	}

	
	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == connectionButton) {
			confConn.setVisible(true);
		} else if (ev.getSource() == topicsButton) {
			confTopic.setVisible(true);			
		} else if (ev.getSource() == postButton) {
			if (cr != null) {
				cr.poster(messageField.getText(),this);
				messageField.setText("");
			}
		} else if (ev.getSource() == pseudoButton) {
			confPseudo.setVisible(true);
			state = SessionState.CONNECTED;
		}
	}
	
	public static void main (String [] args) {
		ChatterIHM c = new ChatterIHM ();
		c.setVisible(true);
	}
	
	public void setChatRoom (ChatRoom cr) {
		this.cr = cr;
		state = SessionState.CHATTING;
	}

	
	public void setState (SessionState s) {
		state = s;
		switch (state) {
		case DISCONNECTED :
			connectionButton.setEnabled(true);
			pseudoButton.setEnabled(true);
			postButton.setEnabled(false);
			topicsButton.setEnabled(false);
			break;
		case CONNECTED :
			connectionButton.setEnabled(false);
			pseudoButton.setEnabled(true);
			postButton.setEnabled(false);
			topicsButton.setEnabled(true);
			break;
		case CHATTING:
			connectionButton.setEnabled(false);
			pseudoButton.setEnabled(true);
			postButton.setEnabled(true);
			topicsButton.setEnabled(true);
		break;			
		}
	}
	
	
}
