#ifndef INPUT_CONTROL_MOUSE_HPP
#define INPUT_CONTROL_MOUSE_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::Mouse
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        #ifdef TARGET_SYSTEM_PSP
        #elif defined TARGET_SYSTEM_WIN32
            #define USGE_MOUSE_CLICKS_MAX_COUNT    3
            //! Le temps passé depuis la dernière pression relâchée
            Chrono clickDelay[USGE_MOUSE_CLICKS_MAX_COUNT];
            /**
             * Les délais de prise en compte des pressions des touches.
             * <ul>
             *   <li>clickMinDelay[..][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>clickMinDelay[..][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 clickMinDelay[USGE_MOUSE_CLICKS_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 clickStateStep[USGE_MOUSE_CLICKS_MAX_COUNT];
            //! Les états des touches avant qu'on les lise de nouveau
            bool clickPreviousStates[USGE_MOUSE_CLICKS_MAX_COUNT];
        #endif

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

        // Afficher/masquer le curseur.
        static void showCursor(bool show);
        // État du paramétrage pour l'affichage/masquage du curseur.
        static bool cursorIsVisible();

        // Remet à zéro l'état des contrôles et les délais.
        void resetStates();
        // Retourne l'état d'un click de la souris.
        bool getClickState(USGE_InputControl btn);
        // Retourne la valeur de la molette de la souris.
        int getWheel();
        // Remet la valeur actuelle de la molette de la souris à l'état initial '0'.
        void resetWheel();

        /////////////////////////////////////////
        // Accesseurs à la position du curseur //
        /////////////////////////////////////////
        // Récupère la position de la souris.
        void getPosition(long int *x, long int *y);
        // Récupère la position X du curseur de la souris.
        long int getX();
        // Récupère la position Y du curseur de la souris.
        long int getY();
        // Récupère la position relative à la fenêtre du curseur de la souris.
        void getRelativePosition(long int *x, long int *y);
        // Récupère la position X relative à la fenêtre du curseur de la souris.
        long int getRelativeX();
        // Récupère la position Y relative à la fenêtre du curseur de la souris.
        long int getRelativeY();

        //////////////////////////////////////////
        // Affectation à la position du curseur //
        //////////////////////////////////////////
        // Positionne le curseur de la souris.
        void setPosition(long int x, long int y);
        // Détermination de la position X le curseur de la souris.
        void setX(long int x);
        // Détermination de la position Y le curseur de la souris.
        void setY(long int y);


        //////////////////////////////////////////
        // Affectations des délais de pressions //
        //////////////////////////////////////////
        // Permet de définir le temps minimum autorisé entre chaque pression de boutons
        void setClickDelay(unsigned int clickNum, unsigned long int msTime);
        void setClickDelay(unsigned int clickNum, unsigned long int first, unsigned long int next);
        // Permet de définir le temps minimum autorisé entre chaque pression pour TOUS les boutons
        void setClickDelayAll(unsigned long int msTime);
        void setClickDelayAll(unsigned long int first, unsigned long int next);

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

#endif
