#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <cn-cbor/cn-cbor.h>

#include "json.h"

#ifdef USE_CBOR_CONTEXT
extern cn_cbor_context *context;
#define CBOR_CONTEXT_PARAM , context
#define CBOR_CONTEXT_PARAM_COMMA context,
#else
#define CBOR_CONTEXT_PARAM
#define CBOR_CONTEXT_PARAM_COMMA
#endif

const cn_cbor *ParseString(char *rgch, int ib, int cch)
{
	char ch;
	int ib2;
	cn_cbor *parent = NULL;
	cn_cbor *root = NULL;

	for (; ib < cch; ib++) {
		cn_cbor *node = NULL;
		ch = rgch[ib];
		switch (ch) {
			case '{':
				node = cn_cbor_map_create(CBOR_CONTEXT_PARAM_COMMA NULL);
				break;

			case '[':
				node = cn_cbor_array_create(CBOR_CONTEXT_PARAM_COMMA NULL);
				break;

			case '}':
			case ']':
				if (parent == NULL) {
					fprintf(stderr, "Parse failure @ '%s'\n", &rgch[ib]);
					return NULL;
				}
				parent = parent->parent;
				break;

			case ' ':
			case '\r':
			case '\n':
			case ':':
			case ',':
				break;

			case '"':
				for (ib2 = ib + 1; ib2 < cch; ib2++) {
					if (rgch[ib2] == '"') {
						break;
					}
				}
				rgch[ib2] = 0;
				node = cn_cbor_string_create(
					&rgch[ib + 1], CBOR_CONTEXT_PARAM_COMMA NULL);
				// rgch[ib2] = '"';
				ib = ib2;
				break;

			case 't':
				if (strncmp(&rgch[ib], "true", 4) != 0) {
					goto error;
				}
				node =
					cn_cbor_data_create(NULL, 0, CBOR_CONTEXT_PARAM_COMMA NULL);
				node->type = CN_CBOR_TRUE;
				ib += 3;
				break;

			case 'f':
				if (strncmp(&rgch[ib], "false", 5) != 0) {
					goto error;
				}
				node =
					cn_cbor_data_create(NULL, 0, CBOR_CONTEXT_PARAM_COMMA NULL);
				node->type = CN_CBOR_FALSE;
				ib += 4;
				break;

			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
			case '-':
				node = cn_cbor_int_create(
					atol(&rgch[ib]), CBOR_CONTEXT_PARAM_COMMA NULL);
				if (rgch[ib] == '-') {
					ib++;
				}
				while (isdigit(rgch[ib])) {
					ib++;
				}
				ib--;
				break;

			default:
			error:
				fprintf(stderr, "Parse failure @ '%s'\n", &rgch[ib]);
				return NULL;
		}

		if ((node != NULL) && (parent != NULL)) {
			node->parent = parent;
			if (parent->last_child != NULL) {
				parent->last_child->next = node;
				parent->last_child = node;
			}
			else {
				parent->first_child = node;
			}
			parent->last_child = node;
			parent->length++;

			if ((node->type == CN_CBOR_MAP) || (node->type == CN_CBOR_ARRAY)) {
				parent = node;
			}
		}
		if (parent == NULL) {
			parent = node;
			if (root == NULL) {
				root = node;
			}
		}
	}

	return root;
}

const cn_cbor *ParseJson(const char *fileName)
{
	int cch;
	char *rgch;
	FILE *fp = fopen(fileName, "r");

	if (fp == NULL) {
		fprintf(stderr, "Cannot open file '%s'\n", fileName);

		return NULL;
	}

	rgch = malloc(8 * 1024);
	cch = (int)fread(rgch, 1, 8 * 1024, fp);
	fclose(fp);

	return ParseString(rgch, 0, cch);
}

static void build_decoding_table();

static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
	'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
	'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
	'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
	'2', '3', '4', '5', '6', '7', '8', '9', '-', '_'};
static unsigned char *decoding_table = NULL;
static int mod_table[] = {0, 2, 1};

char *base64_encode(const unsigned char *data,
	size_t input_length,
	size_t *output_length)
{
	*output_length = 4 * ((input_length + 2) / 3);

	char *encoded_data = malloc(*output_length);
	if (encoded_data == NULL) {
		return NULL;
	}

	for (size_t i = 0, j = 0; i < input_length;) {
		uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0;
		uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0;
		uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0;

		uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;

		encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F];
		encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F];
		encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F];
		encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];
	}

	for (int i = 0; i < mod_table[input_length % 3]; i++) {
		encoded_data[*output_length - 1 - i] = '=';
	}

	return encoded_data;
}

unsigned char *base64_decode(const char *data,
	size_t input_length,
	size_t *output_length)
{
	char *p = NULL;

	if (decoding_table == NULL) {
		build_decoding_table();
	}

	if (input_length % 4 != 0) {
		int c = 4 - (input_length % 4);
		p = malloc(input_length + c);
		memcpy(p, data, input_length);
		memcpy(p + input_length, "====", c);
		input_length += c;
		data = p;
	}

	*output_length = input_length / 4 * 3;
	if (data[input_length - 1] == '=') {
		(*output_length)--;
	}
	if (data[input_length - 2] == '=') {
		(*output_length)--;
	}

	unsigned char *decoded_data = malloc(*output_length);
	if (decoded_data == NULL) {
		if (p != NULL) {
			free(p);
		}
		return NULL;
	}

	for (unsigned int i = 0, j = 0; i < input_length;) {
		uint32_t sextet_a =
			data[i] == '=' ? 0 & i++ : (unsigned)decoding_table[(int)data[i++]];
		uint32_t sextet_b =
			data[i] == '=' ? 0 & i++ : (unsigned)decoding_table[(int)data[i++]];
		uint32_t sextet_c =
			data[i] == '=' ? 0 & i++ : (unsigned)decoding_table[(int)data[i++]];
		uint32_t sextet_d =
			data[i] == '=' ? 0 & i++ : (unsigned)decoding_table[(int)data[i++]];

		uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) +
						  (sextet_c << 1 * 6) + (sextet_d << 0 * 6);

		if (j < *output_length) {
			decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
		}
		if (j < *output_length) {
			decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
		}
		if (j < *output_length) {
			decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
		}
	}

	free(p);
	return decoded_data;
}

static void build_decoding_table()
{
	decoding_table = malloc(256);

	for (int i = 0; i < 64; i++) {
		decoding_table[(int)encoding_table[i]] = (unsigned char)i;
	}
}

void base64_cleanup()
{
	free(decoding_table);
}

unsigned char *hex_decode(const char *data,
	size_t input_length,
	size_t *output_length)
{
	if (input_length % 2 != 0) {
		return NULL;
	}

	*output_length = input_length / 2;

	unsigned char *decoded_data = malloc(*output_length);
	if (decoded_data == NULL) {
		return NULL;
	}

	for (unsigned int i = 0, j = 0; i < input_length; i++) {
		int c;

		if ('0' <= data[i] && data[i] <= '9') {
			c = data[i] - '0';
		}
		else if ('A' <= data[i] && data[i] <= 'F') {
			c = data[i] - 'A' + 10;
		}
		else if ('a' <= data[i] && data[i] <= 'f') {
			c = data[i] - 'a' + 10;
		}
		else {
			return NULL;
		}

		if ((i & 0x1) == 0) {
			decoded_data[j] = ((unsigned char)c << 4);
		}
		else {
			decoded_data[j++] |= (unsigned char)c;
		}
	}

	return decoded_data;
}
