#include "HashTable.h"
#include "Types.h"
#include "Vector.h"
#include "String.h"
#include "BumpAlloc.h"
#include <stdio.h>

int
main() {
    MemoryManager g = M_std_tracked(),
                  t = M_bump(KiB(4));

    String *hexes = V_new(&g, sizeof(String), 8);

    Result status = R_Ok;
    for (usize i = 7; i <= 4830; i += 69) {
        PRINT_NOTOK(V_pushp((Vector**)&hexes, S_printf(&t, "%x", i)));
    }

    String all = S_printf(&g, "Total: %ld\n", V_count(hexes));
    for (usize i = 0; i + 4 < V_count(hexes); i += 4) {
        PRINT_NOTOK(
            S_append(&all,
                S_concat(&t,
                    hexes[0+i], " ", hexes[1+i], " ", hexes[2+i], " ", hexes[3+i], "\n",
                    NULL)));
    }

    printf("%s|%s|\n", all, S_substr(&t, all, 23, 4));

    MemoryManager T = M_std();

    HashTable tet = H_new(&T, 16);
    PRINT_NOTOK(H_insertstr(tet, "Hello", "World"));
    PRINT_NOTOK(H_insertf(tet, "a", 1.414));
    PRINT_NOTOK(H_inserti(tet, "+", 4829));

    printf("Table: %s [%p] %f %d\n",
           H_getstr(tet, "Hello"), H_getstr(tet, "Hello"),
           H_getf(tet, "a") == NULL ? 0.0 :  *H_getf(tet, "a"),
           H_geti(tet, "+") == NULL ? 0    : *H_geti(tet, "+"));
    PRINT_NOTOK(H_freevals(&tet));
    PRINT_NOTOK(H_free(&tet));

    PRINT_NOTOK(g.destroy(&g));
    PRINT_NOTOK(t.destroy(&t));
    PRINT_NOTOK(T.destroy(&T));
    return 0;
}
