#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 = (char*) 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 = (char*) 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 = (char*) 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 = (unsigned char *)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 = (unsigned char *) 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 = (unsigned char *) 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;
}
