/* liblouis Braille Translation and Back-Translation Library

   Based on the Linux screenreader BRLTTY, copyright (C) 1999-2006 by
   The BRLTTY Team

   Copyright (C) 2004, 2005, 2006, 2009
   ViewPlus Technologies, Inc. www.viewplus.com and
   JJB Software, Inc. www.jjb-software.com

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <config.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "liblouis.h"
#include "internal.h"
#include <getopt.h>
#include "progname.h"
#include "version-etc.h"

static const struct option longopts[] = {
	{ "help", no_argument, NULL, 'h' },
	{ "version", no_argument, NULL, 'v' },
	{ NULL, 0, NULL, 0 },
};

const char version_etc_copyright[] =
		"Copyright %s %d ViewPlus Technologies, Inc. and JJB Software, Inc.";

#define AUTHORS "John J. Boyer"

static void
print_help(void) {
	printf("\
Usage: %s [OPTIONS]\n",
			program_name);

	fputs("\
Check the accuracy of hyphenation in Braille translation for both\n\
translated and untranslated words.\n\n",
			stdout);

	fputs("\
  -h, --help          display this help and exit\n\
  -v, --version       display version information and exit\n",
			stdout);

	printf("\n");
	printf("Report bugs to %s.\n", PACKAGE_BUGREPORT);

#ifdef PACKAGE_PACKAGER_BUG_REPORTS
	printf("Report %s bugs to: %s\n", PACKAGE_PACKAGER, PACKAGE_PACKAGER_BUG_REPORTS);
#endif
#ifdef PACKAGE_URL
	printf("%s home page: <%s>\n", PACKAGE_NAME, PACKAGE_URL);
#endif
}

#define BUFSIZE 256

static char inputBuffer[BUFSIZE];
static const TranslationTableHeader *validTable = NULL;
static unsigned int mode;
static char table[BUFSIZE];

static int
getInput(void) {
	int inputLength;
	inputBuffer[0] = 0;
	if (!fgets(inputBuffer, sizeof(inputBuffer), stdin)) exit(EXIT_FAILURE);
	inputLength = strlen(inputBuffer) - 1;
	if (inputLength < 0) /* EOF on script */
		exit(0);
	inputBuffer[inputLength] = 0;
	return inputLength;
}

static void
paramLetters(void) {
	printf("Press one of the letters in parentheses, then enter.\n");
	printf("(t)able, tr(a)nslated, (u)ntranslated, (r)un, (h)elp, (q)uit\n");
}

static int
getCommands(void) {
	paramLetters();
	do {
		printf("Command: ");
		getInput();
		switch (inputBuffer[0]) {
		case 0:
			break;
		case 't':
			do {
				printf("Enter the name of a table or a list: ");
				getInput();
				strcpy(table, inputBuffer);
				validTable = lou_getTable(table);
				if (validTable != NULL && validTable->hyphenStatesArray == 0) {
					printf("No hyphenation table.\n");
					validTable = NULL;
				}
			} while (validTable == NULL);
			break;
		case 'a':
			mode = 1;
			break;
		case 'u':
			mode = 0;
			break;
		case 'r':
			if (validTable == NULL) {
				printf("You must enter a valid table name or list.\n");
				inputBuffer[0] = 0;
			}
			break;
		case 'h':
			printf("Commands: action\n");
			printf("(t)able: Enter a table name or list\n");
			printf("(r)un: run the hyphenation test loop\n");
			printf("tr(a)nslated: translated input\n");
			printf("(u)ntranslated: untranslated input\n");
			printf("(h)elp: print this page\n");
			printf("(q)uit: leave the program\n");
			printf("\n");
			paramLetters();
			break;
		case 'q':
			exit(0);
		default:
			printf("Bad choice.\n");
			break;
		}
	} while (inputBuffer[0] != 'r');
	return 1;
}

int
main(int argc, char **argv) {
	widechar inbuf[BUFSIZE];
	char hyphens[BUFSIZE];
	int inlen;
	int k;
	int optc;

	set_program_name(argv[0]);

	while ((optc = getopt_long(argc, argv, "hv", longopts, NULL)) != -1) switch (optc) {
		/* --help and --version exit immediately, per GNU coding standards. */
		case 'v':
			version_etc(
					stdout, program_name, PACKAGE_NAME, VERSION, AUTHORS, (char *)NULL);
			exit(EXIT_SUCCESS);
			break;
		case 'h':
			print_help();
			exit(EXIT_SUCCESS);
			break;
		default:
			fprintf(stderr, "Try `%s --help' for more information.\n", program_name);
			exit(EXIT_FAILURE);
			break;
		}

	if (optind < argc) {
		/* Print error message and exit. */
		fprintf(stderr, "%s: extra operand: %s\n", program_name, argv[optind]);
		fprintf(stderr, "Try `%s --help' for more information.\n", program_name);
		exit(EXIT_FAILURE);
	}

	validTable = NULL;
	mode = 0;

	while (1) {
		getCommands();
		printf("Type something, press enter, and view the results.\n");
		printf("A blank line returns to command entry.\n");
		while (1) {
			inlen = getInput();
			if (inlen == 0) break;
			for (k = 0; k < inlen; k++) inbuf[k] = inputBuffer[k];
			if (!lou_hyphenate(table, inbuf, inlen, hyphens, mode)) {
				printf("Hyphenation error\n");
				continue;
			}
			printf("Hyphenation mask: %s\n", hyphens);
			printf("Hyphenated word: ");
			for (k = 0; k < inlen; k++) {
				if (hyphens[k] == '1') printf("-");
				printf("%c", inbuf[k]);
			}
			printf("\n");
		}
	}
	lou_free();
	return 0;
}
