#include <stdio.h>
#include <stdlib.h>

#include <string>
#include <iostream>

#include <SDL_net.h>

int main(int argc, char *argv[])
{
    TCPsocket sd, csd; /* Socket descriptor, Client socket descriptor */
    IPaddress ip, *remoteIP;
    int quit, quit2;
    char buffer[512];

    std::cout << "Starting DarkRP2D Server..." << std::endl;

    if (SDLNet_Init() < 0)
    {
        fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError());
        exit(EXIT_FAILURE);
    }

    /* Resolving the host using NULL make network interface to listen */ 
    if (SDLNet_ResolveHost(&ip, NULL, 9999) < 0)
    {
        fprintf(stderr, "SDLNet_ResolveHost: %s\n", SDLNet_GetError());
        exit(EXIT_FAILURE);
    }

    /* Open a connection with the IP provided (listen on the host's port) */ 
    if (!(sd = SDLNet_TCP_Open(&ip)))
    {
        fprintf(stderr, "SDLNet_TCP_Open: %s\n", SDLNet_GetError());
        exit(EXIT_FAILURE);
    }

    std::cout << "DarkRP2D Server started." << std::endl;
    std::cout << "Waiting for a Connection!" << std::endl;

    /* Wait for a connection, send data and term */ quit = 0;
    while (!quit)
    { /* This check the sd if there is a pending connection. * If there is one, accept that, and open a new socket for communicating */
        if ((csd = SDLNet_TCP_Accept(sd)))
        { /* Now we can communicate with the client using csd socket * sd will remain opened waiting other connections */

            /* Get the remote address */ 
            if ((remoteIP = SDLNet_TCP_GetPeerAddress(csd))) /* Print the address, converting in the host format */
                printf("Host connected: %x %d\n", SDLNet_Read32(&remoteIP->host), SDLNet_Read16(&remoteIP->port));
            else
                fprintf(stderr, "SDLNet_TCP_GetPeerAddress: %s\n", SDLNet_GetError());

            quit2 = 0;
            while (!quit2)
            {
                if (SDLNet_TCP_Recv(csd, buffer, 512) > 0)
                {
                    printf("Client say: %s\n", buffer);

                    if (strcmp(buffer, "exit") == 0) /* Terminate this connection */
                    {
                        quit2 = 1;
                        printf("Terminate connection\n");
                    }
                    if (strcmp(buffer, "quit") == 0) /* Quit the program */
                    {
                        quit2 = 1;
                        quit = 1;
                        printf("Quit program\n");
                    }
                }
            }

            /* Close the client socket */ SDLNet_TCP_Close(csd);
        }
    }
    std::cout << "Server is closing..." << std::endl;
    SDLNet_TCP_Close(sd);
    SDLNet_Quit();
    std::cout << "Server closed!" << std::endl;

    return EXIT_SUCCESS;

    return 0;
}