#include <tcpTest.h>

#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

#include <socket.h>

#include <logger.h>
#include <PontCoopScheduler.h>
#include <wizHelper.h>


const uint8_t TCPTEST_SOCK;

uint8_t remoteAddr[] = { 172, 16, 3, 31 };
uint16_t remotePort = 5000;

void tcpTestHandler(void *handle) {
    static uint8_t state = 0;
    int8_t res = 0;


    if (isNetworkAvailable()) {
        switch (state) {
        case 0:
            coloredMsg(LOG_YELLOW, "tth, initializing socket");

            res = socket(TCPTEST_SOCK, Sn_MR_TCP, 12345, SF_IO_NONBLOCK);
            coloredMsg(LOG_YELLOW, "tth, socket returns %d", res);

            if (res == TCPTEST_SOCK) {
                coloredMsg(LOG_YELLOW, "tth, socket is initialized");
                state = 1;
            } else {
                state = 255;
            }
            break;

        case 1:
            coloredMsg(LOG_YELLOW, "tth, connecting");
            
            res = connect(TCPTEST_SOCK, remoteAddr, remotePort);
            coloredMsg(LOG_YELLOW, "tth, connect returns %d", res);

            if (res == SOCK_BUSY) {
                coloredMsg(LOG_YELLOW, "tth, ok, waiting for established");
                state = 2;
            } else {
                state = 255;
            }
            break;

        case 2:
            coloredMsg(LOG_YELLOW, "tth, waiting for established");

            uint8_t sockState = getSn_SR(TCPTEST_SOCK);
            coloredMsg(LOG_YELLOW, "tth, socket state is 0x%02x", sockState);

            if (sockState == SOCK_ESTABLISHED) {
                coloredMsg(LOG_YELLOW, "tth, connection is established");
                state = 255;
            }

        case 255:
            coloredMsg(LOG_YELLOW, "tth, error state, will stop here");
            schDel(tcpTestHandler, NULL);
            break;
        }
    } else {
        coloredMsg(LOG_YELLOW, "tth, network not yet ready");
    }
}

void tcpTestInit() {
    schAdd(tcpTestHandler, NULL, 0, 100);
}