#ifndef NETWORK_SERVER_HPP
#define NETWORK_SERVER_HPP

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

#ifdef TARGET_SYSTEM_PSP
    #define SOCKET int
#elif defined TARGET_SYSTEM_WIN32
    #include <winsock.h>
#endif

// C++
#include <string>

// Personnelles
#include "Network/Network.hpp"

#ifdef TARGET_SYSTEM_PSP
    #define NETWORK_SERVER_MAX_CLIENTS 8
#elif defined TARGET_SYSTEM_WIN32
    #define NETWORK_SERVER_MAX_CLIENTS 32
#endif


namespace USpeedGameEngine
{

class Network;

class Network::Server
{
    /* **************
    * Les attributs *
    * **************/
    public :
    protected :
    private :
        SOCKET serverSocket;                                    //!< Socket du serveur
        SOCKET clientSockets[NETWORK_SERVER_MAX_CLIENTS];       //!< Liste des "sockets" des clients

    /* *************
    * Les méthodes *
    * *************/
    public :
        // Constructeur par défaut
        Server();
        // Destructeur par défaut
        ~Server();
        // Initialisation du serveur sur le port spécifié et lance le serveur qui écoute les éventuelles clients pour la connexion
        bool start(unsigned int port);
        // Arrête d'écouter les clients et coupe les connexions avec les clients déjà connectés
        void stop();
        // Le traitement régulier du serveur en cours d'exécution
        unsigned int process(std::string *targetBuffer);
        // Envoie de données du serveur à un client
        bool sendTo(std::string const &datas, unsigned int clientId);
        // Suppression d'un client de la liste des clients
        void dropClient(unsigned int clientId);

        // Retourne le nombre maximum de clients possibles
        unsigned int getMaxClients();
        // Permet de savoir si le socket du client spécifié est valide
        bool getClientState(unsigned int clientId);

        // Permet de savoir si le socket du serveur est valide et en écoute
        bool isRunning();

    protected :
    private :
};

}        // Fin "namespace USpeedGameEngine"

#endif
