package ar.uba.fi.game.input;

import ar.uba.fi.game.ai.fsm.NinjaRabbitState;
import ar.uba.fi.game.ai.msg.MessageType;
import ar.uba.fi.game.entity.Entity;
import ar.uba.fi.game.entity.NinjaRabbit;

import com.badlogic.gdx.ai.msg.MessageManager;
import com.badlogic.gdx.controllers.Controller;
import com.badlogic.gdx.controllers.ControllerAdapter;
import com.badlogic.gdx.controllers.mappings.Ouya;

/**
 * Handles input from an Ouya controller to change the inner state of a {@link NinjaRabbit}.
 *
 * @author nfantone
 *
 */
public class NinjaRabbitControllerProcessor extends ControllerAdapter {
	private final static int JUMP_KEY = Ouya.BUTTON_O;
	private final static int MOVE_AXIS = Ouya.AXIS_LEFT_X;
	// private final static int DUCK_KEY = Ouya.AXIS_LEFT_Y;
	private static final int RESET_KEY = Ouya.BUTTON_R2;

	private final Entity character;

	public NinjaRabbitControllerProcessor(final Entity ninjaRabbit) {
		if (ninjaRabbit == null) {
			throw new IllegalArgumentException("'character' cannot be null");
		}
		this.character = ninjaRabbit;
	}

	@Override
	public boolean buttonDown(final Controller controller, final int buttonCode) {
		if (buttonCode == JUMP_KEY) {
			character.changeState(NinjaRabbitState.JUMP);
		} else if (buttonCode == RESET_KEY) {
			MessageManager.getInstance().dispatchMessage(null, MessageType.DEAD.code(), character);
		}
		return super.buttonDown(controller, buttonCode);
	}

	@Override
	public boolean buttonUp(final Controller controller, final int buttonCode) {
		if (buttonCode == JUMP_KEY) {
			character.changeState(NinjaRabbitState.IDLE);
		}
		return super.buttonUp(controller, buttonCode);
	}

	@Override
	public boolean axisMoved(final Controller controller, final int axisIndex, final float value) {
		if (axisIndex == MOVE_AXIS) {
			float axisValue = 0.5f * value;
			if (Math.abs(axisValue) > Ouya.STICK_DEADZONE) {
				if (axisValue > 0) {
					character.changeState(NinjaRabbitState.RIGHT);
				} else {
					character.changeState(NinjaRabbitState.LEFT);
				}
			} else {
				character.changeState(NinjaRabbitState.IDLE);
			}
		}
		return super.axisMoved(controller, axisIndex, value);
	}
}