package controleur;
import modele.Jeu;

import javax.swing.JLabel;
import javax.swing.JPanel;

import controleur.GLOBAL;
import modele.JeuClient;
import modele.JeuServeur;
import outils.connexion.AsyncResponse;
import outils.connexion.ClientSocket;
import outils.connexion.Connection;
import outils.connexion.ServeurSocket;
import vue.Arene;
import vue.ChoixJoueur;
import vue.EntreeJeu;

public class Controle implements AsyncResponse {
	private EntreeJeu frmEntreeJeu ;
	private ChoixJoueur frmChoixJoueur;
	private Arene frmArene;
	private Jeu leJeu;
	
	/**
	 * Constructeur
	 */
	private Controle() {
		this.frmEntreeJeu = new EntreeJeu(this) ;
		this.frmEntreeJeu.setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Controle();
	}
	
	public void evenementEntreeJeu(String info) {
		//
		if(info.contains("serveur")) {
			System.out.println("srv");
			//
			new ServeurSocket(this, GLOBAL.PORT);
			
			this.frmArene = new Arene();
			this.frmArene.setVisible(true);
			
			this.leJeu = new JeuServeur(this);
			((JeuServeur)this.leJeu).constructionMurs();
			
			frmEntreeJeu.dispose();
		}else {
			System.out.println("ip");
			//
			new ClientSocket(this, info, GLOBAL.PORT);
		}
	}

	@Override
	public void reception(Connection connection, String ordre, Object info) {
		// TODO Auto-generated method stub
		switch (ordre){
			case "connexion":
				if(!(this.leJeu instanceof JeuServeur)) {
					frmEntreeJeu.dispose();
					this.leJeu = new JeuClient(this);
					this.leJeu.connexion(connection);
					
					this.frmArene = new Arene();
					this.frmChoixJoueur = new ChoixJoueur(this);
					this.frmChoixJoueur.setVisible(true);
				}else {
					this.leJeu.connexion(connection);
				}
				break;
			case "reception":
				leJeu.reception(connection, info);
		}
	}
	public void evenementChoixJoueur(String pseudo, int numPerso) {
		//
		this.frmChoixJoueur.dispose();
		this.frmArene.setVisible(true);
		String pseudoNumPerso = "pseudo" + GLOBAL.separateur + pseudo + GLOBAL.separateur + numPerso;
		((JeuClient)this.leJeu).envoi(pseudoNumPerso);
	}
	
	public void envoi(Connection connection, Object obj) {
		connection.envoi(obj);
	}
	
	public void evenementJeuServeur(String ordre, Object info) {
		switch(ordre) {
		case "ajout mur":
			this.frmArene.ajoutMurs(info);
			break;
		case "ajout panel murs":
			leJeu.envoi((Connection)info, this.frmArene.jpnMurs());
			break;
		case "ajout jlabel jeu":
			this.frmArene.ajoutLabelJeu((JLabel) info);
			this.frmArene.jpnJeu.repaint();
			break;
		case "ajout joueurs":
			leJeu.envoi((Connection)info, this.frmArene.getJpnJeu());
			break;
		}
	}
	
	public void evenementJeuClient(String ordre, Object info) {
		switch(ordre) {
		case "mettre murs":
			this.frmArene.setJpnMurs((JPanel)info);
			break;
		case "modif panel jeu":
			this.frmArene.setJpnJeu((JPanel)info);
			break;
		}
	}

}
