#include "config.h"
#include "config_test.h"
#include <common/amount.h>
#include <common/bigsize.h>
#include <common/channel_id.h>
#include <common/configvar.h>
#include <common/daemon.h>
#include <common/json_stream.h>
#include <common/node_id.h>
#include <common/setup.h>
#include <common/wireaddr.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/socket.h>

int test_main(int argc, char *argv[]);
ssize_t test_read(int fd, void *buf, size_t len);
int test_socket(int domain, int type, int protocol);
int test_connect(int sockfd, const struct sockaddr *addr,
		 socklen_t addrlen);
int test_getpid(void);
int test_printf(const char *format, ...);
int test_fputc(int c, FILE *stream);
int test_chdir(const char *path);

#define main test_main
#define cli_read test_read
#define socket test_socket
#define connect test_connect
#define getpid test_getpid
#define printf test_printf
#define fputc test_fputc
#define chdir test_chdir

  #include "../lightning-cli.c"
#undef main

/* AUTOGENERATED MOCKS START */
/* AUTOGENERATED MOCKS END */

int test_socket(int domain UNUSED, int type UNUSED, int protocol UNUSED)
{
	/* We give a real fd, as it writes to it */
	return open("/dev/null", O_WRONLY);
}

int test_connect(int sockfd UNUSED, const struct sockaddr *addr UNUSED,
		 socklen_t addrlen UNUSED)
{
	return 0;
}

int test_getpid(void)
{
	return 9999;
}

static char *response = "{\"id\": \"cli:test#9999\", \"jsonrpc\": \"2.0\", \"result\": {\"channels\": [\"\n\", \"├477308sat    OUT/OURS ┼ IN/THEIRS   477308sat┤ SCID           FLAG ALIAS\", \"├──────────────────────┼──────────────────────┤ 580612x1826x0  [__] BLUEIRON-v0.7.2rc1\"], \"my_address\": \"02b78caed0f45120acc48efe867aa506e8ea60f0712a23303178471da0ca2213f5@hdco6sxkbisc7s5t.onion\", \"format-hint\": \"simple\", \"avail_in\": \"0.00477308500btc (USD $54.37)\", \"num_utxos\": 0, \"num_gossipers\": 1, \"channels_flags\": \"P:private O:offline\", \"avail_out\": \"0.00477308500btc (USD $54.37)\", \"utxo_amount\": \"0.00000000btc (USD $0.00)\", \"num_channels\": 1, \"num_connected\": 1}}\n\n";
static size_t response_off;

ssize_t test_read(int fd UNUSED, void *buf, size_t len)
{
	if (len > strlen(response + response_off))
		len = strlen(response + response_off);
	memcpy(buf, response + response_off, len);
	return len;
}

static char *output;

int test_printf(const char *fmt, ...)
{
	va_list ap;

	va_start(ap, fmt);
	tal_append_vfmt(&output, fmt, ap);
	va_end(ap);
	return 1;
}

int test_fputc(int c, FILE *stream)
{
	tal_append_fmt(&output, "%c", c);
	return (unsigned)c;
}

int test_chdir(const char *path)
{
	return 0;
}

int main(int argc UNUSED, char *argv[])
{
	common_setup(argv[0]);

	char *fake_argv[] = { argv[0], "--lightning-dir=/tmp/", "test", "-N", "none", NULL };

	output = tal_strdup(NULL, "");
	assert(test_main(5, fake_argv) == 0);

	assert(streq(output, "channels=\n"
		     "\n"
		     "├477308sat    OUT/OURS ┼ IN/THEIRS   477308sat┤ SCID           FLAG ALIAS\n"
		     "├──────────────────────┼──────────────────────┤ 580612x1826x0  [__] BLUEIRON-v0.7.2rc1\n"
		     "my_address=02b78caed0f45120acc48efe867aa506e8ea60f0712a23303178471da0ca2213f5@hdco6sxkbisc7s5t.onion\n"
		     "avail_in=0.00477308500btc (USD $54.37)\n"
		     "num_utxos=0\n"
		     "num_gossipers=1\n"
		     "channels_flags=P:private O:offline\n"
		     "avail_out=0.00477308500btc (USD $54.37)\n"
		     "utxo_amount=0.00000000btc (USD $0.00)\n"
		     "num_channels=1\n"
		     "num_connected=1\n"));
	tal_free(output);
	assert(!taken_any());
	common_shutdown();
	return 0;
}
