#ifndef __CONFIG_H__
#define __CONFIG_H__

#include "libp2p/db/datastore.h"
#include "identity.h"
#include "swarm.h"
#include "bootstrap_peers.h"
#include "addresses.h"
#include "gateway.h"
#include "replication.h"

struct MDNS {
	int enabled;
	int interval;
};

struct Discovery {
	struct MDNS mdns;
};

struct Mounts {
	char* ipfs;
	char* ipns;
};

struct Ipns {
	int resolve_cache_size;
};

struct Reprovider {
	char* interval;
};

struct RepoConfig {
	struct Identity* identity;
	struct Datastore* datastore;
	struct Filestore* filestore;
	struct Addresses* addresses;
	struct Mounts mounts;
	struct Discovery discovery;
	struct Ipns ipns;
	struct Libp2pVector* bootstrap_peers; // MultiAddresses
	//struct tour tour;
	struct Gateway* gateway;
	//struct supernode_routing supernode_client_config;
	//struct api api;
	struct Reprovider reprovider;
	struct Replication* replication;
};

/**
 * provide the full path of the config file, given the directory. 
 * NOTE: This allocates memory for result. Make sure to clean up after yourself.
 * @param path the path to the config file (without the actual file name)
 * @param result the full filename including the path
 * @returns true(1) on success, false(0) otherwise
 */
int repo_config_get_file_name(char* path, char** result);

/***
 * Returns the path "extension" relative to the configuration root.
 * If an empty string is provided for config_root, the default root
 * is used.
 * @param config_root the path to the root of the configuration
 * @param extension the extension to add to the path
 * @param result the result of config_root with extension appended
 * @param max_len the max length of the result
 * @returns true(1) if everything went okay, false(0) otherwise
 */
int config_path(char* config_root, char* extension, char* result, int max_len);

/***
 * create a configuration based on the passed in parameters
 * @param config the configuration struct
 * @param num_bits_for_keypair number of bits for the key pair
 * @param swarm_port port for swarm
 * @param bootstrap_peers a vector of Multiaddress of fellow peers
 * @returns true(1) on success, otherwise 0
 */
int ipfs_repo_config_init(struct RepoConfig* config, unsigned int num_bits_for_keypair, const char* repo_path, int swarm_port, struct Libp2pVector *bootstrap_peers);

/***
 * Initialize memory for a RepoConfig struct
 * @param config the structure to initialize
 * @returns true(1) on success
 */
int ipfs_repo_config_new(struct RepoConfig** config);

/***
 * free all resources that were allocated to store config information
 * @param config the config
 * @returns true(1)
 */
int ipfs_repo_config_free(struct RepoConfig* config);

#endif