#include <iostream>
#include <emscripten/emscripten.h>

extern "C" {
    int worker_function(void* data, int size);
}

/* Worker API */
/*
void worker_api__started(char* data, int size) {
    // int CHUNK_SIZE = 16;
    for(int i=0; i<10; i++) {
        std::cout << "Worker" << std::endl;
        emscripten_worker_respond_provisionally(0, 0);
    }
    emscripten_worker_respond(0, 0);
}
std::string hexcode(char byte) {
    unsigned int bv = reinterpret_cast<unsigned char&>(byte);
    const char codes[] = "0123456789abcdef_";
    std::string result = codes[(bv/16) % 16] + ( codes[bv % 16] + std::string());
    return result;
}
*/
std::string hexcode(unsigned char byte) {
    const static char codes[] = "0123456789abcdef_";
    std::string result = codes[(byte/16) % 16] + ( codes[byte % 16] + std::string());
    return std::string(result = codes[(byte/16) % 16] + ( codes[byte % 16] + std::string()));
}


int worker_function(void* data, int size) {
    {
    std::cout << "As bytes: ";
    size_t i = 0 ;
    char* char_data = (char*)data;
    for (; i < size; ++i) {
        std::cout << hexcode((char_data)[i]) << " ";
    }
    std::cout << "(end)";
    for (; i < size; ++i) {
        std::cout << hexcode((char_data)[i]) << " ";
    }
    std::cout << std::endl;
    }

    {
    std::cout << "As float: ";
    float* typed_data = (float*)data;
    size_t typed_size = (size + sizeof(float)-1) / sizeof(float);
    for (size_t i = 0; i < typed_size; ++i) {
        std::cout << typed_data[i] << " ";
    }
    std::cout << std::endl;
    }
    {
    std::cout << "As double: ";
    double* typed_data = (double*)data;
    size_t typed_size = (size + sizeof(double)-1) / sizeof(double);
    for (size_t i = 0; i < typed_size; ++i) {
        std::cout << typed_data[i] << " ";
    }
    std::cout << std::endl;
    }

    // emscripten_worker_respond_provisionally(0, 0);
    //emscripten_worker_respond(0, 0);
    //emscripten_worker_respond(static_cast<char*>(static_cast<void*>(static_datum.data())), static_cast<int>(sizeof(static_datum)));
    std::string result = std::string("I received ") + std::to_string(size) + " bytes.";
    //emscripten_worker_respond((void*)(result.data()), result.size());
    char* resstr = (char*)result.c_str();
    emscripten_worker_respond(resstr, result.size());
    //return result.c_str();
    return 314;
}

int worker_function2(void* verts, int size) {
}
int main(){return 0;}
