#ifndef COUNTERPART_ENV_NAME
#define COUNTERPART_ENV_NAME "GIT_SSH_UPLOAD"
#endif
#ifndef COUNTERPART_PROGRAM_NAME
#define COUNTERPART_PROGRAM_NAME "git-ssh-upload"
#endif
#ifndef MY_PROGRAM_NAME
#define MY_PROGRAM_NAME "git-ssh-fetch"
#endif

#include "cache.h"
#include "commit.h"
#include "rsh.h"
#include "fetch.h"
#include "refs.h"

static int fd_in;
static int fd_out;

static unsigned char remote_version = 0;
static unsigned char local_version = 1;

static ssize_t force_write(int fd, void *buffer, size_t length)
{
	ssize_t ret = 0;
	while (ret < length) {
		ssize_t size = write(fd, buffer + ret, length - ret);
		if (size < 0) {
			return size;
		}
		if (size == 0) {
			return ret;
		}
		ret += size;
	}
	return ret;
}

static int prefetches = 0;

static struct object_list *in_transit = NULL;
static struct object_list **end_of_transit = &in_transit;

void prefetch(unsigned char *sha1)
{
	char type = 'o';
	struct object_list *node;
	if (prefetches > 100) {
		fetch(in_transit->item->sha1);
	}
	node = xmalloc(sizeof(struct object_list));
	node->next = NULL;
	node->item = lookup_unknown_object(sha1);
	*end_of_transit = node;
	end_of_transit = &node->next;
	force_write(fd_out, &type, 1);
	force_write(fd_out, sha1, 20);
	prefetches++;
}

static char conn_buf[4096];
static size_t conn_buf_posn = 0;

int fetch(unsigned char *sha1)
{
	int ret;
	signed char remote;
	struct object_list *temp;

	if (memcmp(sha1, in_transit->item->sha1, 20)) {
		// we must have already fetched it to clean the queue
		return has_sha1_file(sha1) ? 0 : -1;
	}
	prefetches--;
	temp = in_transit;
	in_transit = in_transit->next;
	if (!in_transit)
		end_of_transit = &in_transit;
	free(temp);

	if (conn_buf_posn) {
		remote = conn_buf[0];
		memmove(conn_buf, conn_buf + 1, --conn_buf_posn);
	} else {
		if (read(fd_in, &remote, 1) < 1)
			return -1;
	}
	//fprintf(stderr, "Got %d\n", remote);
	if (remote < 0)
		return remote;
	ret = write_sha1_from_fd(sha1, fd_in, conn_buf, 4096, &conn_buf_posn);
	if (!ret)
		pull_say("got %s\n", sha1_to_hex(sha1));
	return ret;
}

static int get_version(void)
{
	char type = 'v';
	write(fd_out, &type, 1);
	write(fd_out, &local_version, 1);
	if (read(fd_in, &remote_version, 1) < 1) {
		return error("Couldn't read version from remote end");
	}
	return 0;
}

int fetch_ref(char *ref, unsigned char *sha1)
{
	signed char remote;
	char type = 'r';
	write(fd_out, &type, 1);
	write(fd_out, ref, strlen(ref) + 1);
	read(fd_in, &remote, 1);
	if (remote < 0)
		return remote;
	read(fd_in, sha1, 20);
	return 0;
}

static const char ssh_fetch_usage[] =
  MY_PROGRAM_NAME
  " [-c] [-t] [-a] [-v] [-d] [--recover] [-w ref] commit-id url";
int main(int argc, char **argv)
{
	char *commit_id;
	char *url;
	int arg = 1;
	const char *prog;

	prog = getenv("GIT_SSH_PUSH");
	if (!prog) prog = "git-ssh-upload";

	while (arg < argc && argv[arg][0] == '-') {
		if (argv[arg][1] == 't') {
			get_tree = 1;
		} else if (argv[arg][1] == 'c') {
			get_history = 1;
		} else if (argv[arg][1] == 'a') {
			get_all = 1;
			get_tree = 1;
			get_history = 1;
		} else if (argv[arg][1] == 'v') {
			get_verbosely = 1;
		} else if (argv[arg][1] == 'w') {
			write_ref = argv[arg + 1];
			arg++;
		} else if (!strcmp(argv[arg], "--recover")) {
			get_recover = 1;
		}
		arg++;
	}
	if (argc < arg + 2) {
		usage(ssh_fetch_usage);
		return 1;
	}
	commit_id = argv[arg];
	url = argv[arg + 1];

	if (setup_connection(&fd_in, &fd_out, prog, url, arg, argv + 1))
		return 1;

	if (get_version())
		return 1;

	if (pull(commit_id))
		return 1;

	return 0;
}
