#include "Input.h"


// Constructeur et Destructeur
Input::Input()
: m_x(0), m_y(0), m_xRel(0), m_yRel(0),
m_terminer(false), m_relativeMouse(false), m_windowHalfHeight(0), m_windowHalfWidth(0)
{
    // Initialisation du tableau m_touches[]
    for(int i(0); i < SDLK_LAST; i++)
        m_touches[i] = false;
    std::cout << "Il y a "<<SDLK_LAST<<" touches sur le clavier."<<std::endl;

    // Initialisation du tableau m_boutonsSouris[]
    for(int i(0); i < 8; i++)
        m_boutonsSouris[i] = false;
}


Input::~Input()
{}


// M�thodes
void Input::updateEvenements()
{
    // Pour �viter des mouvements fictifs de la souris, on r�initialise les coordonn�es relatives
    m_xRel = 0;
    m_yRel = 0;

    // Boucle d'�v�nements
    while(SDL_PollEvent(&m_evenements))
    {
        // Switch sur le type d'�v�nement
        switch(m_evenements.type)
        {
            // Cas d'une touche enfonc�e
            case SDL_KEYDOWN:
                m_touches[m_evenements.key.keysym.sym] = true;
            break;

            // Cas d'une touche rel�ch�e
            case SDL_KEYUP:
                m_touches[m_evenements.key.keysym.sym] = false;
            break;

            // Cas de pression sur un bouton de la souris
            case SDL_MOUSEBUTTONDOWN:
                m_boutonsSouris[m_evenements.button.button] = true;
            break;

            // Cas du rel�chement d'un bouton de la souris
            case SDL_MOUSEBUTTONUP:
                m_boutonsSouris[m_evenements.button.button] = false;
            break;

            // Cas d'un mouvement de souris
            case SDL_MOUSEMOTION:
                if (m_relativeMouse)
                {
                    m_xRel = m_evenements.motion.x-m_windowHalfWidth;
                    m_yRel = m_evenements.motion.y-m_windowHalfHeight;
                }
                else
                {
                    m_x = m_evenements.motion.x;
                    m_y = m_evenements.motion.y;
                    m_xRel = m_evenements.motion.xrel;
                    m_yRel = m_evenements.motion.yrel;
                }

            break;

            // Cas de la fermeture de la fen�tre
            case SDL_QUIT:
                m_terminer = true;
            break;

            // Les autres ne nous interessent pas : on �vite de faire r�ler g++
            default:
            break;
        }
    }

    // Pour �viter que la souris se barre en mode relative, on la "warp"
    if (m_relativeMouse)
         SDL_WarpMouse(m_windowHalfWidth, m_windowHalfHeight);
}


bool Input::terminer() const
{
    return m_terminer;
}


void Input::afficherPointeur(bool reponse) const
{
    if(reponse)
        SDL_ShowCursor(SDL_ENABLE);

    else
        SDL_ShowCursor(SDL_DISABLE);
}


void Input::capturerPointeur(bool reponse)
{
    m_relativeMouse = reponse;
}



// Getters

bool Input::getTouche(const int touche) const
{
    return m_touches[touche];
}


bool Input::getBoutonSouris(const Uint8 bouton) const
{
    return m_boutonsSouris[bouton];
}


bool Input::mouvementSouris() const
{
    if(m_xRel == 0 && m_yRel == 0)
        return false;

    else
        return true;
}


// Getters concernant la position du curseur

int Input::getX() const
{
    return m_x;
}

int Input::getY() const
{
    return m_y;
}

int Input::getXRel() const
{
    return m_xRel;
}

int Input::getYRel() const
{
    return m_yRel;
}

void Input::placerPtr(SDL_Surface* activWindow)
{
    // D�termination de l'endroit de capture du pointeur
    m_windowHalfWidth = activWindow->w / 2;
    m_windowHalfHeight = activWindow->h / 2;
}

int Input::getWinHalfH()
{
    return m_windowHalfHeight;
}

int Input::getWinHalfW()
{
    return m_windowHalfWidth;
}