#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>
#include <errno.h>
#include <string.h>

#include "util.h"
#include "logging.h"
#include "index.h"

static void write_index(const char *filename)
{
	struct index_node *index;
	char *line, *pos;
	FILE *cfile;
	unsigned int linenum = 0;
	
	cfile = fopen(filename, "w");
	if (!cfile)
		fatal("Could not open %s for writing: %s\n",
		      filename, strerror(errno));
	
	index = index_create();
	
	while((line = getline_wrapped(stdin, &linenum))) {
		pos = strchr(line, ' ');
		*pos++ = '\0';
		index_insert(index, line, pos, linenum);
		free(line);
	}
	
	index_write(index, cfile);
	index_destroy(index);
	fclose(cfile);
}

static struct index_file *open_index(const char *filename)
{
	struct index_file *index;

	index = index_file_open(filename);
	if (!index) {
		if (errno == EINVAL)
			fatal("%s has wrong magic or version number", filename);

		fatal("Could not open %s for reading: %s\n",
		      filename, strerror(errno));
	}

	return index;
}

static void dump_index(const char *filename)
{
	struct index_file *index = open_index(filename);

	index_dump(index, stdout, "");

	index_file_close(index);
}

static void search_index(const char *filename, char *key)
{
	struct index_file *index = open_index(filename);
	char *value;

	value = index_search(index, key);
	if (value)
		printf("Found value:\n%s\n", value);
	else
		printf("Not found.\n");
	
	free(value);
	index_file_close(index);
}

static void searchwild_index(const char *filename, char *key)
{
	struct index_file *index = open_index(filename);
	struct index_value *values, *v;

	values = index_searchwild(index, key);
	if (values)
		printf("Found value(s):\n");
	else
		printf("Not found.\n");	

	for (v = values; v; v = v->next)
		printf("%s\n", v->value);

	index_values_free(values);
	index_file_close(index);
}

static void print_usage(const char *progname)
{
	fprintf(stderr,
		"Usage: %s [MODE] [FILE] ...\n"
		" -o, --output <outfile>\n"
		" -d, --dump <infile>\n"
		" -s, --search <key> <infile>\n"
		" -w, --searchwild <key> <infile>\n"
		,progname);
	exit(1);
}

static struct option options[] = {
	{ "output", 0, NULL, 'o' },
	{ "dump", 0, NULL, 'd' },
	{ "search", 1, NULL, 's' },
	{ "searchwild", 1, NULL, 'w' },
};

int main(int argc, char *argv[])
{
	int opt;
	char mode = 0;
	char *filename = NULL;
	char *key = NULL;
	
	while ((opt = getopt_long(argc, argv, "ods:w:", options, NULL))
		       != -1) {
		switch (opt) {
			case 'o':
				mode = 'o';
				break;
			case 'd':
				mode = 'd';
				break;
			case 's':
				mode = 's';
				key = optarg;
				break;
			case 'w':
				mode = 'w';
				key = optarg;
				break;
			default:
				print_usage(argv[0]);
		}
	}
	if (!mode)
		print_usage(argv[0]);
	
	if (optind >= argc)
		print_usage(argv[0]);
	filename = argv[optind];
	
	switch(mode) {
		case 'o':
			write_index(filename);
			break;
		case 'd':
			dump_index(filename);
			break;
		case 's':
			search_index(filename, key);
			break;
		case 'w':
			searchwild_index(filename, key);
			break;
	}
	
	return 0;
}
