#include <stdlib.h>
#include <string.h>

#include "ipfs/repo/config/datastore.h"
#include "ipfs/os/utils.h"

int alloc_and_assign(char** result, const char* string) {
	*result = malloc(strlen(string)+1);
	if (*result == NULL)
		return 0;
	strcpy(*result, string);
	return 1;
}

/***
 * initialize the structure of the datastore
 * @param datastore the struct to initialize
 * @returns true(1) on success
 */
int ipfs_repo_config_datastore_init(struct Datastore* datastore, const char* config_root) {
	unsigned long stringLength = strlen(config_root) + 12;
	datastore->path = malloc(sizeof(char) * stringLength);
	os_utils_filepath_join(config_root, "datastore", datastore->path, stringLength);
	alloc_and_assign(&datastore->type, "lmdb");
	alloc_and_assign(&datastore->storage_max, "10GB");
	datastore->storage_gc_watermark = 90;
	alloc_and_assign(&datastore->gc_period, "1h");
	datastore->hash_on_read = 0;
	datastore->bloom_filter_size = 0;
	datastore->no_sync = 0;
	return 1;
}

/***
 * initialize the structure of the datastore
 * @param datastore the struct to initialize
 * @returns true(1) on success
 */
int ipfs_repo_config_datastore_new(struct Datastore** datastore) {
	*datastore = malloc(sizeof(struct Datastore));
	if (*datastore == NULL)
		return 0;
	(*datastore)->path = NULL;
	(*datastore)->handle = NULL;
	(*datastore)->type = NULL;
	(*datastore)->storage_max = NULL;
	(*datastore)->gc_period = NULL;
	(*datastore)->params = NULL;
	return 1;
}

/***
 * deallocate the memory and clear resources from a datastore_init
 * @param datastore the struct to deallocate
 * @returns true(1)
 */
int ipfs_repo_config_datastore_free(struct Datastore* datastore) {
	if (datastore != NULL)
	{
		if (datastore->path != NULL)
			free(datastore->path);
		if (datastore->type != NULL)
			free(datastore->type);
		if (datastore->storage_max != NULL)
			free(datastore->storage_max);
		if (datastore->gc_period != NULL)
			free(datastore->gc_period);
		if (datastore->params != NULL)
			free(datastore->params);
		if (datastore->handle != NULL)
			datastore->datastore_close(datastore);
		free(datastore);
	}
	return 1;
}