#!/bin/sh
#
# koha-translate -- Manage Koha translations.
# Copyright 2013 Tomás Cohen Arazi
#                Universidad Nacional de Córdoba
#
# 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 <https://www.gnu.org/licenses/>.

# Read configuration variable file if it is present
[ -r /etc/default/koha-common ] && . /etc/default/koha-common

set -e

# include helper functions
if [ -f "/usr/share/koha/bin/koha-functions.sh" ]; then
    . "/usr/share/koha/bin/koha-functions.sh"
else
    echo "Error: /usr/share/koha/bin/koha-functions.sh not present." 1>&2
    exit 1
fi

usage()
{
    local scriptname=$(basename $0)

    cat <<EOF
$scriptname

This script lets you manage your Koha templates translations.

Usage:
$scriptname --list|-l [--available|-a]  [-d|--dev instance]
$scriptname --check|-c language_code]   [-d|--dev instance]
$scriptname --install|-i language_code] [-d|--dev instance]
$scriptname --update|-u language_code]  [-d|--dev instance]
$scriptname --remove|-r language_code]  [-d|--dev instance]
$scriptname --help|-h

    -l | --list           List the installed or available (combined with -a)
                          language translations
    -a | --available      Used in conjunction with -l to show all languages
    -c | --check          Check that the language .PO files are present
    -i | --install        Install the specified language translations
    -u | --update         Update the specified language translations
    -r | --remove         Remove the specified language translations
    -v | --verbose        Be more verbose on the translation process
    -h | --help           Display this help message
    -d | --dev            Limit actions to a specific dev instance

EOF
}

list()
{
    all=$1

    if [ "$all" != "" ]; then
        print_available
    else
        print_installed
    fi
}

print_available()
{
    # Loop over only one opac theme
    for i in $( ls $PO_DIR | grep opac-bootstrap ); do
        echo `basename $i -opac-bootstrap.po` | \
            grep -v -x -e en
    done
}

print_installed()
{
    ( ls -1 $KOHA_HOME/$OPAC_TMPL/bootstrap/ ; \
        ls -1 $KOHA_HOME/$OPAC_TMPL/prog/ 2> /dev/null ) | \
        sort | uniq | \
        grep -v -e images -e itemtypeimg -x -e en -e css -e js -e less -e lib -e sound
}

install_lang()
{
    local lang=$1
    local translate_opts=""

    if [ "$verbose" = "yes" ]; then
        translate_opts="--verbose"
    fi

    if [ "$lang" != "" ]; then

        if [ "$lang" = "en" ]; then
            die "Error: the default language (en) is already installed."
        fi

        if print_available | grep -q $lang; then
            if print_installed | grep -q $lang; then
                die "Error: the selected language is already installed. Try --update if you want to re-install it."
            else
                # Check po files are present
                check_lang_po_files $lang
                env PERL5LIB="$PERL5LIB:$TRANSLATE_DIR" \
                    KOHA_CONF="$KOHA_CONF" \
                    $PERL_CMD $TRANSLATE_DIR/translate install $translate_opts $lang
            fi
        else
            die "Error: the selected language is not currently available."
        fi

    else
        die "Error: no language code supplied."
    fi
}

update_lang()
{
    lang=$1

    if [ "$lang" != "" ]; then

        if [ "$lang" = "en" ]; then
            die "Error: the default language (en) cannot be updated."
        fi

        if print_installed | grep -q $lang; then
            # Check po files are present
            check_lang_po_files $lang
            remove_lang $lang
            install_lang $lang
        else
            die "Error: the selected language is not currently installed. Try --install."
        fi
    else
        die "Error: no language code supplied."
    fi
}

remove_lang()
{
    lang=$1

    if [ "$lang" != "" ]; then

        if [ "$lang" = "en" ]; then
            die "Error: the default language (en) cannot be removed."
        fi

        if print_installed | grep -q $lang; then
            rm -rf $KOHA_HOME/$OPAC_TMPL/bootstrap/$lang
            rm -rf $KOHA_HOME/$INTRANET_TMPL/prog/$lang
        else
            die "Error: the selected language is not installed."
        fi
    else
        die "Error: no language code supplied."
    fi
}

check_lang_po_files()
{
    lang=$1

    po_files="$PO_DIR/$lang-marc-MARC21.po
              $PO_DIR/$lang-marc-UNIMARC.po
              $PO_DIR/$lang-opac-bootstrap.po
              $PO_DIR/$lang-pref.po
              $PO_DIR/$lang-staff-prog.po"

    if [ "$lang" != "" ]; then

        for po_file in $po_files; do
            if [ ! -f $po_file ]; then
                die "Error: $po_file not found."
            fi
        done
    else
        die "Error: no language code supplied."
    fi
}

set_action()
{
    if [ "$op" = "" ]; then
        op=$1
    else
        die "Error: only one action can be specified."
    fi
}

set_dev()
{
    if is_instance $1; then
        dev=$1
    else
        die "Error: Invalid instance name $1"
    fi
}

check_koha_conf()
{
    if [ "$dev" != "" ]; then
        KOHA_CONF=/etc/koha/sites/$dev/koha-conf.xml
    elif [ -z $KOHA_CONF ]; then
        KOHA_CONF=/etc/koha/koha-conf-site.xml.in
    fi
}

init_template_paths()
{
    # Template paths
    if [ "$dev" = "" ]; then
        OPAC_TMPL=opac/htdocs/opac-tmpl
        INTRANET_TMPL=intranet/htdocs/intranet-tmpl
    else
        OPAC_TMPL=koha-tmpl/opac-tmpl
        INTRANET_TMPL=koha-tmpl/intranet-tmpl
    fi
    TRANSLATE_DIR="$KOHA_HOME/misc/translator"
    PO_DIR="$TRANSLATE_DIR/po"
}

flush_cache()
{
    if [ "$dev" = "" ]; then
        koha-foreach --enabled "$KOHA_HOME/bin/clear_cache.pl"
    else
        koha-shell $dev -c "$KOHA_HOME/misc/bin/clear_cache.pl"
    fi
}

# Control variables
list_all=""
op=""
language=""
verbose="no"
dev=""

# We accept at most 4 parameters
[ $# -ge 1 ] && [ $# -le 4 ] || ( usage ; die "Error: wrong parameters" )

# Read parameters
while [ $# -gt 0 ]; do

    case "$1" in
        -h|--help)
            op="help"
            break ;;
        -c|--check)
            set_action "check"
            shift ;;
        -i|--install)
            set_action "install"
            shift ;;
        -u|--update)
            set_action "update"
            shift ;;
        -r|--remove)
            set_action "remove"
            shift ;;
        -l|--list)
            set_action "list"
            shift ;;
        -a|--available)
            list_all=1
            shift ;;
        -v|--verbose)
            verbose="yes"
            shift ;;
        -d|--dev)
            if [ $# -lt 2 ]; then
                die "Error: dev parameter without instance"
            fi
            shift
            set_dev $1
            shift ;;
        -*)
            usage
            die "Error: unknown parameter $1." ;;
        *)
            language=$1
            shift ;;
    esac

done

if [ "$dev" != "" ]; then adjust_paths_git_install $dev; fi
check_koha_conf
init_template_paths
PERL_CMD=`which perl`

# Process the requested actions
case $op in
    "help")
        usage ;;
    "list")
        list $list_all ;;
    "install")
        install_lang $language
        flush_cache
        ;;
    "update")
        update_lang $language ;;
    "remove")
        remove_lang $language
        flush_cache
        ;;
    "check")
        check_lang_po_files $language ;;
    *)
        usage
        die "Error: wrong parameters..." ;;
esac

exit 0
