#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 *node = NULL;
	cn_cbor *parent = NULL;
	cn_cbor *root = NULL;

	for (; ib < cch; ib++) {
		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;
}
