#ifndef INPUT_CONTROL_KEYBOARD_HPP
#define INPUT_CONTROL_KEYBOARD_HPP

// Détection du système cible...
#include "usgeDetectSystem.h"

// La classe mère
#include "InputControl.hpp"

#include "Chrono/Chrono.hpp"


namespace USpeedGameEngine
{

class InputControl::Keyboard
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        #ifdef TARGET_SYSTEM_PSP
        #elif defined TARGET_SYSTEM_WIN32
            #define USGE_KEYBOARD_KEYS_MAX_COUNT    256
            //! Le temps passé depuis la dernière pression relâchée
            Chrono keyDelay[USGE_KEYBOARD_KEYS_MAX_COUNT];
            /**
             * Les délais de prise en compte des pressions des touches.
             * <ul>
             *   <li>keyMinDelay[..][0] : (Délai n°1) Le temps (en ms) depuis la première pression en dessous duquel on ne considère pas la nouvelle pression</li>
             *   <li>keyMinDelay[..][1] : (Délai n°2) Le temps (en ms) depuis la deuxième (et supérieure) pression en dessous duquel on ne considère pas la nouvelle pression</li>
             * </ul>
             */
            unsigned long int keyMinDelay[USGE_KEYBOARD_KEYS_MAX_COUNT][2];
            /**
             * L'étape de lecture de l'état des touches.
             * <ul>
             *    <li>0 : première pression de la touche à lire - pas de délai</li>
             *    <li>1 : première pression de la touche lue - délai n°1</li>
             *    <li>2 : seconde (et supérieure) pression de la touche à lire - délai n°2</li>
             * </ul>
             * L'état est ramené à "0" dès que la pression n'est plus détectée.
             */
            char keyStateStep[USGE_KEYBOARD_KEYS_MAX_COUNT];
            //! Les états des touches avant qu'on les lise de nouveau
            bool keyPreviousStates[USGE_KEYBOARD_KEYS_MAX_COUNT];
        #endif

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur par défaut
        Keyboard();
        // Destructeur par défaut
        ~Keyboard();

        // Remet à zéro l'état des contrôles et les délais
        void resetStates();
        // Retourne l'état d'une touche du clavier
        bool getKeyState(unsigned int keyNum);

        //////////////////////////////////////////
        // Affectations des délais de pressions //
        //////////////////////////////////////////
        // Permet de définir le temps minimum autorisé entre chaque pression de touches
        void setKeyDelay(unsigned int keyNum, unsigned long int msTime);
        void setKeyDelay(unsigned int keyNum, unsigned long int first, unsigned long int next);
        // Permet de définir le temps minimum autorisé entre chaque pression pour TOUTES les touches
        void setKeyDelayAll(unsigned long int msTime);
        void setKeyDelayAll(unsigned long int first, unsigned long int next);

    protected :
    private :
};
}        // Fin "namespace USpeedGameEngine"

#endif
