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

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

#include "io.h"
#include "shell.h"

#define PORT 10'008 /* default port */

bool fu_connect(const int port) {
    struct sockaddr_in server_addr;
    char buffer[1024] = {0};

    if ((fu_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation failed");
        return false;
    }

    server_addr.sin_family      = AF_INET;
    server_addr.sin_port        = htons(port);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    if (connect(fu_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        return false;
    }

    return true;
}

bool init(int argc, char * * argv) {

    prompt1 = getenv("FU_PS1");
    if (not prompt1) {
        prompt1 = PS1;
    }

    const int port =
        (argc > 1)
            ?
        std::stoi(argv[1])
            :
        PORT
    ;

    if (not fu_connect(port)) {
        return false;
    }

    return true;
}

signed main(int argc, char * * argv) {
    if(not init(argc, argv)) {
        return 1;
    }

    while(fu_interpret()) { ; }
    return 0;
}