package depart.frontal.vues;

import ca.ntro.app.Ntro;
import ca.ntro.app.frontend.ViewFx;
import depart.commun.enums.ActionJoueur;
import depart.commun.monde2d.MondeDepart2d;
import depart.frontal.controles.CanvasB;
import depart.frontal.evenements.EvtA;
import depart.frontal.evenements.EvtActionJoueur;
import depart.frontal.utils.GestionnaireTouches;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

public class VueB extends ViewFx {

	@FXML
	private Button boutonA;

	@FXML
	private CanvasB canvas;
	
	private GestionnaireTouches gestionnaireTouches = new GestionnaireTouches();

	@Override
	public void initialize() {
		Ntro.assertNotNull(boutonA);
		Ntro.assertNotNull(canvas);
		
		boutonA.setFocusTraversable(false);
		
		boutonA.setOnAction(evtFx -> {

			Ntro.newEvent(EvtA.class).trigger();
			
		});
		
		rootNode().setFocusTraversable(true);
		rootNode().requestFocus();
		rootNode().addEventFilter(KeyEvent.KEY_PRESSED, evtFx -> {
			gestionnaireTouches.activer(evtFx.getCode());
		});

		rootNode().addEventFilter(KeyEvent.KEY_RELEASED, evtFx -> {
			gestionnaireTouches.desactiver(evtFx.getCode());
		});
		
		gestionnaireTouches.reagirCombinaison(touches -> {
			KeyCode touche01 = null;
			KeyCode touche02 = null;
			
			if(touches.size() > 0) {
				touche01 = touches.get(0);
			}

			if(touches.size() > 1) {
				touche02 = touches.get(1);
			}
			
			if(KeyCode.A.equals(touche01)
					|| KeyCode.LEFT.equals(touche01)) {
				
				if(KeyCode.W.equals(touche02)
						|| KeyCode.UP.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_NORD_OUEST)
					    .trigger();
					
				} else if(KeyCode.S.equals(touche02) 
							|| KeyCode.DOWN.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_SUD_OUEST)
					    .trigger();
					
				}else {

					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_OUEST)
					    .trigger();

				}

			} else if(KeyCode.W.equals(touche01) 
						|| KeyCode.UP.equals(touche01)) {

				if(KeyCode.D.equals(touche02)
						|| KeyCode.RIGHT.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_NORD_EST)
					    .trigger();
					
				} else if(KeyCode.A.equals(touche02) 
							|| KeyCode.LEFT.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_NORD_OUEST)
					    .trigger();
					
				}else {

					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_NORD)
					    .trigger();

				}

			} else if(KeyCode.D.equals(touche01) 
						|| KeyCode.RIGHT.equals(touche01)) {

				if(KeyCode.W.equals(touche02)
						|| KeyCode.UP.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_NORD_EST)
					    .trigger();
					
				} else if(KeyCode.S.equals(touche02) 
							|| KeyCode.DOWN.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_SUD_EST)
					    .trigger();
					
				}else {

					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_EST)
					    .trigger();

				}

			} else if(KeyCode.S.equals(touche01) 
						|| KeyCode.DOWN.equals(touche01)) {

				if(KeyCode.A.equals(touche02)
						|| KeyCode.LEFT.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_SUD_OUEST)
					    .trigger();
					
				} else if(KeyCode.D.equals(touche02) 
							|| KeyCode.RIGHT.equals(touche02)) {
					
					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_SUD_EST)
					    .trigger();
					
				}else {

					Ntro.newEvent(EvtActionJoueur.class)
					    .setActionJoueur(ActionJoueur.BOUGER_SUD)
					    .trigger();

				}

			} else if(KeyCode.SPACE.equals(touche01) 
						|| KeyCode.ENTER.equals(touche01)) {

				Ntro.newEvent(EvtActionJoueur.class)
					.setActionJoueur(ActionJoueur.FRAPPER)
					.trigger();

			} else {

				Ntro.newEvent(EvtActionJoueur.class)
					.setActionJoueur(ActionJoueur.ARRETER)
					.trigger();

			}
			
		});
	}

	public void methodeA(MondeDepart2d monde2d) {
		monde2d.drawOn(canvas);
	}

}
