#!/usr/bin/env bash
#
# liblouis Braille Translation and Back-Translation Library
#
# Copyright (C) 2017 Bert Frees
#
# This file is part of liblouis.
#
# liblouis is free software: you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 2.1 of the License, or
# (at your option) any later version.
#
# liblouis 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with liblouis. If not, see <http://www.gnu.org/licenses/>.
#

if ! make --version 2>/dev/null | grep 'GNU Make' >/dev/null; then
    echo "ERROR: GNU make is required to run this program" >&2
    exit 1
fi
if ! which patgen >/dev/null; then
    echo "ERROR: patgen is required to run this program" >&2
    exit 1
fi
if ! which python3 >/dev/null; then
    echo "ERROR: python3 is required to run this program" >&2
    exit 1
fi

if ! python3 -c "from louis import liblouis" 2>/dev/null; then
    echo "ERROR: the Liblouis python bindings must be installed to run this program" >&2
    exit 1
fi

function print_help {
    echo "Usage: $0 [OPTIONS] [COMMAND]" >&2
    echo "" >&2
    echo "Commands:" >&2
    echo "  clean               clean up generated files" >&2
    echo "" >&2
    echo "Options:" >&2
    echo "  --config=FILE       read configuration options from FILE (required)"
    echo "  -h, --help          display this help and exit" >&2
    echo "  -v, --version       display version information and exit" >&2
    echo "" >&2
    echo "Configuration options:" >&2
    echo "  CONTRACTIONS_TABLE  location of file where contraction rules are moved to" >&2
    echo "                      from the working file" >&2
    echo "  PATTERNS_TABLE      location of file where generated hyphenation patterns" >&2
    echo "                      are stored" >&2
    echo "  BASE_TABLE          base translation table that is augmented with the" >&2
    echo "                      generated contractions and patterns tables in order to" >&2
    echo "                      get the final result" >&2
    echo "  DICTIONARY          location of SQLite database that contains the certified" >&2
    echo "                      braille translations of words and where chunk data will" >&2
    echo "                      be stored" >&2
    echo "  WORKING_FILE        location of file where suggestions for new contraction" >&2
    echo "                      rules are written and from which changes to contraction" >&2
    echo "                      table and dictionary are read" >&2
    echo "" >&2
    echo "Environment variables:" >&2
    echo "  LOUIS_TABLEPATH     colon-separated list of directories that is searched" >&2
    echo "                      to resolve the base table" >&2
    echo "  EDITOR              program that is used to open the working file" >&2
    echo "" >&2
    echo "Report bugs to @PACKAGE_BUGREPORT@." >&2
    echo "@PACKAGE_NAME@ home page: <@PACKAGE_URL@>" >&2
}

HELP=false
VERSION=false
VERBOSE=false

function unexpected_argument {
    echo "ERROR: Unexpected argument: $1" >&2
    echo "" >&2
    print_help
    exit 1
}

while [ $# -gt 0 ]; do
    if [[ -n ${CMD+x} ]]; then
        unexpected_argument
    fi
    case $1 in
        -h|--help)
            if $HELP; then
                unexpected_argument
            fi
            HELP=true
            ;;
        -v|--version)
            if $VERSION; then
                unexpected_argument
            fi
            VERSION=true
            ;;
        --verbose)
            if $VERBOSE; then
                unexpected_argument
            fi
            VERBOSE=true
            ;;
        --config=*)
            if [[ -n ${CONFIG_FILE+x} ]]; then
                unexpected_argument
            fi
            CONFIG_FILE=${1#--config=}
            ;;
        clean)
            CMD=clean
            ;;
        *)
            unexpected_argument
            ;;
    esac
    shift
done

if $HELP; then
    print_help
    exit 0
fi

if $VERSION; then
    echo "lou_maketable (Liblouis) @VERSION@" >&2
    echo "Copyright (C) 2017 Bert Frees." >&2
    echo "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>." >&2
    echo "This is free software: you are free to change and redistribute it." >&2
    echo "There is NO WARRANTY, to the extent permitted by law." >&2
    echo "" >&2
    echo "Written by Bert Frees." >&2
    exit 0
fi

if [[ -n ${CONFIG_FILE+x} ]]; then
    if ! [ -e "$CONFIG_FILE" ]; then
        echo "ERROR: Unexisting file: $CONFIG_FILE" >&2
        exit 1
    fi
else
    echo "ERROR: Please specify a configuration file" >&2
    echo "" >&2
    print_help
    exit 1
fi

if ! [[ -n ${CMD+x} ]]; then
    CMD=suggestions
fi


# This file is installed in the parent directory of the lou_maketable.d directory. When run from
# within the source code it is sourced from a file within the parent directory. In both cases the
# relative path to the lou_maketable.mk file should be "lou_maketable.d/lou_maketable.mk".

CURDIR=$(cd $(dirname "$0") && pwd)

make -f $CURDIR/lou_maketable.d/lou_maketable.mk VERBOSE=$VERBOSE CONFIG_FILE=$CONFIG_FILE $CMD
