#ifndef USGE_MIN_CAPI_HPP
#define USGE_MIN_CAPI_HPP

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

// Framework d'audit du code
#include "Core/usgeAudit.h"

#ifdef __cplusplus
extern "C"
{
#endif

    /**
     * Structure de définition d'une trame clé pour l'animation.
     */
    typedef struct USGE_MinCAPI_KeyFrame
    {
        unsigned long int duration; /**< Temps de l'animation pour arriver à la cible en millisecondes */
        float xPosition;            /**< Position cible (X) */
        float yPosition;            /**< Position cible (Y) */
        float zPosition;            /**< Position cible (Z) */
        float xRotation;            /**< Rotation cible (X) */
        float yRotation;            /**< Rotation cible (Y) */
        float zRotation;            /**< Rotation cible (Z) */
    } USGE_MinCAPI_KeyFrame;

    /***************************************************************
     * Le noyau                                                    *
     **************************************************************/
    /* Définition du point d'entrée de l'application. */
    int USGE_CAPI_main(const char* appTitle, int argNumber, char *argList[], void (*customInit)(void), void (*customMain)(unsigned long int), void (*customFinish)(void));
    /* Retourne la version du moteur USpeed Game Engine. */
    const char *USGE_CAPI_engineVersion();
    /* Retourne le rapport "Largeur/Hauteur" de l'écran. */
    float USGE_CAPI_screenRatio();
    /* Choix de l'id de l'icône de l'application Win32 dans les ressources. */
    void USGE_CAPI_windowIcon(unsigned int iconId);

    /***************************************************************
     * Les surfaces 2D                                             *
     **************************************************************/
    /* Allocation d'une nouvelle surface 2D. */
    void *USGE_CAPI_newSurface2D(const char *imgFilename, int isPNG);
    /* Désallocation d'une surface 2D. */
    void USGE_CAPI_deleteSurface2D(void *surface);
    /* Détermination de la taille d'une surface 2D. */
    void USGE_CAPI_sizeSurface2D(void *surface, float width, float height);
    /* Détermination de la position d'une surface 2D. */
    void USGE_CAPI_positionSurface2D(void *surface, float x, float y);
    /* Détermination des coordonnées d'application de la texture d'une surface 2D. */
    void USGE_CAPI_uvMapSurface2D(void *surface, float xStart, float yStart, float xEnd, float yEnd);
    /* Détermination de la profondeur (position du calque) d'une surface 2D. */
    void USGE_CAPI_layerSurface2D(void *surface, float z);
    /* Affichage de la surface 2D. */
    void USGE_CAPI_renderSurface2D(void *surface);
    /* Permet de définir l'animation associée à une surface 2D. */
    void USGE_CAPI_animationSurface2D(void *surface, void *anim);

    /***************************************************************
     * Les animations                                              *
     **************************************************************/
    /* Allocation d'une nouvelle animation. */
    void *USGE_CAPI_newAnimation();
    /* Désallocation d'une animation. */
    void USGE_CAPI_deleteAnimation(void *anim);
    /* Suppression de toutes les trames clé pour l'animation. */
    void USGE_CAPI_resetAnimation(void *anim);
    /* Ajoute une trame clé pour l'animation. */
    void USGE_CAPI_addKeyFrameAnimation(void *anim, USGE_MinCAPI_KeyFrame keyFrame);
    /* Lancement de l'animation. */
    void USGE_CAPI_playAnimation(void *anim);
    /* Arrêt et retour au début de l'animation. */
    void USGE_CAPI_stopAnimation(void *anim);
    /* Mise en pause de l'animation. */
    void USGE_CAPI_pauseAnimation(void *anim);
    /* Mise en boucle de l'animation. */
    void USGE_CAPI_loopAnimation(void *anim, int activate);

    /***************************************************************
     * Le chronomètre                                              *
     **************************************************************/
    /* Remise à zéro du chronomètre. */
    void USGE_CAPI_resetChrono();
    /* Lancement du chronomètre. */
    void USGE_CAPI_runChrono();
    /* Mise en pause du chronomètre. */
    void USGE_CAPI_pauseChrono();
    /* Récupération du temps écoulé (en millisecondes) du chronomètre. */
    unsigned long int USGE_CAPI_readChrono();

    /***************************************************************
     * Clavier, souris et manette                                  *
     **************************************************************/
    /* Permet de définir le temps minimum autorisé. */
    void USGE_CAPI_delayKeyboard(unsigned int keyNum, unsigned long int first, unsigned long int next);
    /* Retourne l'état d'une touche du clavier. */
    int USGE_CAPI_readKeyboard(unsigned int keyNum);
    /* Retourne l'état d'un bouton de la souris. */
    int USGE_CAPI_readMouse(unsigned int keyNum);
    /* Retourne l'état de la molette de la souris. */
    int USGE_CAPI_wheelMouse();
    /* Remet à zéro l'état de la molette de la souris. */
    void USGE_CAPI_resetWheelMouse();
    /* Retourne l'état d'une touche de la souris. */
    void USGE_CAPI_positionMouse(long int *x, long int *y);
    /* Positionne le curseur de la souris. */
    void USGE_CAPI_moveMouse(long int x, long int y);
    /* Permet de définir le temps minimum autorisé. */
    void USGE_CAPI_delayMouse(unsigned int clickNum, unsigned long int first, unsigned long int next);
    /* Définition du contrôleur de jeu à utiliser (Win32 uniquement). */
    void USGE_CAPI_selectPad(unsigned int choice);
    /* Retourne l'état d'une direction du POV (Point Of View). */
    int USGE_CAPI_povPad(unsigned int povDir);
    /* Permet de définir le temps minimum autorisé. */
    void USGE_CAPI_delayPad(unsigned int btnNum, unsigned long int first, unsigned long int next);
    /* Retourne l'état d'un bouton de la manette choisie. */
    int USGE_CAPI_readPad(unsigned int btnID);

#ifdef __cplusplus
}
#endif

#endif
