#include <stdarg.h>
#include <stdio.h>

#include "dk_utils.h"
#include "dk_log.h"

void* concat(size_t s, byte* a, size_t a_len, byte* b, size_t b_len)
{
    void* out = dk_malloc(s * (a_len + b_len));

    if (out == NULL) {
        return NULL;
    }

    dk_memcpy(out, a, a_len * s);
    dk_memcpy(out + a_len * s, b, b_len * s);

    return out;
}

void* concatn(size_t s, size_t n, ...)
{
    void* out, *array_pointer;
    size_t size, i, offset, array_size;

    va_list valist;

    if (n < 1)
        return NULL;

    size = 0;

    va_start(valist, n);
    for (i = 0; i < n; i++) {
        array_pointer = va_arg(valist, void*);
        array_size = va_arg(valist, size_t);
        size += array_size;
    }
    va_end(valist);

    out = dk_malloc(size * s);
    if (out == NULL) {
        return NULL;
    }

    offset = 0;

    va_start(valist, n);
    for (i = 0; i < n; i++) {
        array_pointer = va_arg(valist, void*);
        array_size = va_arg(valist, size_t);
        dk_memcpy(out + offset, array_pointer, array_size * s);
        offset += array_size * s;
    }
    va_end(valist);

    return out;
}

DK_Result long_to_byte_array(unsigned long x, byte* a, int a_len)
{
    union {
        unsigned long word;
        byte bytes[sizeof(unsigned long)];
    } u;

    if (a_len != sizeof(unsigned long))
        return DK_ERROR_BAD_PARAM;
    
    size_t i;

    u.word = x;

    for (i = a_len-1; i >= 0 && i < a_len; ++i) {
        a[i] = u.bytes[a_len - i - 1];
    }

    return DK_SUCCESS;
}

void print_array(byte* arr, size_t arr_len)
{
    int i;
    TTY_LOG("[");
    for (i = 0; i < arr_len; i++) {
        if (i == arr_len - 1) 
            TTY_LOG("%02x", arr[i]);
        else
            TTY_LOG("%02x,", arr[i]);
    }
    TTY_LOG("]\n\0");
    // DK_LOG_INFO("%s", buf);
}

void hexstr2barray(char* s, size_t slen, byte* buf, size_t buflen)
{
    for (size_t i = 0; i < (slen - 1); i += 2) {
        sscanf(s + i, "%2hhx", buf + (i / 2));
    }
}
