#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int gClientSocket;

int bServerResult;
int bServerError;

int main(int argc, char** argv)
{
    if (argc < 3)
    {
        fprintf(stderr, "-USAGE- %s <ip> <port>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    char* ip = argv[1];
    unsigned int port = atoi(argv[2]);
    char str[128], szResult[128];

    struct sockaddr_in server;

    if ((gClientSocket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket()");
        exit(EXIT_FAILURE);
    }

    memset(&server, 0, sizeof (struct sockaddr_in));
    server.sin_family       = AF_INET;
    server.sin_addr.s_addr  = inet_addr(ip);
    server.sin_port         = htons(port);
 
    if (connect(gClientSocket, (struct sockaddr*) &server, sizeof server) != -1)
    {
        printf("Connecting %s:%d...\n", inet_ntoa(server.sin_addr), htons(server.sin_port));
        
        int bytes_read;

        int i;
        unsigned long int quantity = 0;
        char term;

        printf("Number of values to compute: ");
        if (scanf("%lu%c", &quantity, &term) != 2 || quantity < 0 || term != '\n')
        {
            printf("-ERROR- Enter a valid unsigned integer!\n");
            close(gClientSocket);
            exit(EXIT_FAILURE);
        }

        quantity = htonl(quantity);

        if (send(gClientSocket, &quantity, sizeof (int), 0) == -1)
        {
            close(gClientSocket);
            perror("send()");
            exit(EXIT_FAILURE);
        }
        quantity = ntohl(quantity);

        float fDummy;
        char term2;

        for (i = 0; i < quantity; i++)
        {
            printf("INPUT #%d: ", i + 1);
            scanf("%s", str);

            if (sscanf(str, "%f%c", &fDummy, &term2) != 1)
            {
                printf("-ERROR- Enter a valid number!");
                close(gClientSocket);
                exit(EXIT_FAILURE);
            }

            if (send(gClientSocket, str, strlen(str) + 1, 0) == -1)
            {
                close(gClientSocket);
                perror("send()");
                exit(EXIT_FAILURE);
            }
            bzero(str, sizeof str);
        }
            
        if ((bytes_read = recv(gClientSocket, szResult, sizeof szResult, 0) != -1))
        {
            if (bytes_read == 0)
            {
                close(gClientSocket);
                printf("The server shutdown!\n");
                exit(0);
            }
            printf("Result: %s\n", szResult);
        }
        else
        {
            close(gClientSocket);
            perror("recv()");
            exit(0);
        }
    }
    return 0;
}