//
// Created by jovian on 01/08/17.
//

#include "JoyPadCtrl.h"

#define XBOX_BUT_X 0
#define XBOX_BUT_Y 1
#define XBOX_BUT_B 2
#define XBOX_BUT_A 3
#define XBOX_BUT_LB 4
#define XBOX_BUT_RB 5
#define XBOX_BUT_SELECT 6
#define XBOX_BUT_START 7

#define XBOX_AXE_1X 0
#define XBOX_AXE_1Y 1
#define XBOX_AXE_2X 3
#define XBOX_AXE_2Y 4
#define XBOX_AXE_RT 2
#define XBOX_AXE_LT 5


JoyPadCtrl::JoyPadCtrl(InputAndJoy *inputJoy, SDL_JoystickID id)
        : m_inputJoy(inputJoy), m_id(id),
          m_sqCeilMove(100000000.0f), m_sqCeilVisor(500000000.0f) {
    m_visor.x = 1.0f;
}

void JoyPadCtrl::refresh() {
    // Firing
    m_firing = m_inputJoy->getButtonPad(XBOX_BUT_X, m_id);

    // Shield activation
    m_shield = m_inputJoy->getButtonPad(XBOX_BUT_A, m_id);

    // Boosting
    m_boost = m_inputJoy->getButtonPad(XBOX_BUT_B, m_id);

    // Visor
    b2Vec2 newVisor;
    newVisor.x = (float) m_inputJoy->getAxeValue(XBOX_AXE_1X, m_id);
    newVisor.y = (float) m_inputJoy->getAxeValue(XBOX_AXE_1Y, m_id);

    if (newVisor.LengthSquared() > m_sqCeilVisor) {
        m_visor = newVisor;
        m_visor.Normalize();
    }

    // Acceleration
    int acc = 30000 + m_inputJoy->getAxeValue(XBOX_AXE_LT);

    if (acc < 30000)
        m_acceleration = 0.0f;
    else // todo Progressive
        m_acceleration = 1.0f;

    // Torque with buttons
    if (m_inputJoy->getButtonPad(XBOX_BUT_LB, m_id))
        m_torque = -1.0f;
    else if (m_inputJoy->getButtonPad(XBOX_BUT_RB, m_id))
        m_torque = 1.0f;
    else
        m_torque = 0.0f;

    // Zoom
    /*int axe(30000 + m_inputJoy->getAxeValue(2, m_id));
    if (axe > 0) {
        float scale((float) axe / 30000.0f);

        if (scale > m_zoomScale)
            m_zoomScale = scale;
    }

    axe = 30000 + m_inputJoy->getAxeValue(5, m_id);
    if (axe > 0) {
        float scale((float) 10000.0f / axe);

        if (scale < m_zoomScale)
            m_zoomScale = scale;
    }*/
    if (m_inputJoy->getButtonPad(XBOX_BUT_A))
        m_zoomScale += 0.05f;
    else if (m_inputJoy->getButtonPad(XBOX_BUT_B))
        m_zoomScale -= 0.05f;
    else if (m_inputJoy->getButtonPad(XBOX_BUT_Y))
        m_zoomScale = 1.0f;
}