#ifndef INPUT_CONTROL_PAD_HPP
#define INPUT_CONTROL_PAD_HPP

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

#ifdef TARGET_SYSTEM_PSP
    #define USPEED_FW_BTN_MAX_COUNT         12          // 8 + 4 pour le POV
    #define USPEED_FW_AXIS_MAX_COUNT        2           // X et Y
#elif defined TARGET_SYSTEM_WIN32
    #define USPEED_FW_BTN_MAX_COUNT         36          // 32 (maximum) + 4 pour le POV
    #define USPEED_FW_AXIS_MAX_COUNT        6           // 6 axes
#endif


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

namespace USpeedGameEngine
{

class InputControl::Pad
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        //! Le temps passé depuis la dernière pression relâchée
        unsigned long int btnDelay[USPEED_FW_BTN_MAX_COUNT];
        /**
         * Les délais de prise en compte des pressions des boutons
         * <ul>
         *   <li>btnMinDelay[..][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>btnMinDelay[..][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 btnMinDelay[USPEED_FW_BTN_MAX_COUNT][2];
        /**
         * L'étape de lecture de l'état des touches/boutons.
         * <ul>
         *    <li>0 : première pression du bouton à lire - pas de délai</li>
         *    <li>1 : première pression du bouton 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.
         */
        int btnStateStep[USPEED_FW_BTN_MAX_COUNT];
        //! Les états des boutons de la PSP ou d'une manette avant qu'on les lise de nouveau
        bool btnPreviousStates[USPEED_FW_BTN_MAX_COUNT];
        #ifdef TARGET_SYSTEM_PSP
        #elif defined TARGET_SYSTEM_WIN32
            //! Le n° du pad sélectionné (1 <= . <= USPEED_FW_PAD_MAX_COUNT).
            unsigned int currentPad;
        #endif

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur sélectionnant la manette spécifiée
        Pad();
        // Destructeur par défaut
        ~Pad();

        // Mise à jour temporelle pour les délais de pressions des boutons.
        void updateTimers(unsigned long int elapsedTime);
        // Retourne le n° de la manette sélectionnée : Le n° du pad sélectionné (1 <= . <= USPEED_FW_PAD_MAX_COUNT).
        unsigned int getCurrentPad();
        // Sélection de la manette à utiliser.
        void setCurrentPad(unsigned int choice);
        // Remet à zéro l'état des contrôles et les délais
        void resetStates();
        // Retourne l'état d'un bouton de la manette choisie
        bool getBtnState(unsigned int btnNum);
        // Retourne l'état d'un axe de la manette
        unsigned int getAxisState(USGE_InputControl axis);
        // Retourne l'état d'une direction du POV
        bool getPovState(USGE_InputControl pov);
        // Permet de définir le temps minimum autorisé entre chaque pression de boutons
        void setBtnDelay(unsigned int btnNum, unsigned long int msTime);
        void setBtnDelay(unsigned int btnNum, unsigned long int first, unsigned long int next);
        // Permet de définir le temps minimum autorisé entre chaque pression pour TOUS les boutons
        void setBtnDelayAll(unsigned long int msTime);
        void setBtnDelayAll(unsigned long int first, unsigned long int next);

        /////////////////////////
        // Fonctions statiques //
        /////////////////////////
        // Retourne le nombre de manettes détectées
        static unsigned int getPadCount();
        static unsigned int getPadCount(bool refresh);
        // Initialisation des manettes (détection et établissement de la table de correspondance sous Win32).
        static void initialize();
    protected :
    private :
};
}        // Fin "namespace USpeedGameEngine"

#endif
