#!/bin/bash
# -*- coding:utf-8 -*-
# file KLEIDER/web/src/localization/MySQLLookup_setup
# Übersetzungs-Datenbank einrichten
# 2016-07-20 Herbert Schiemann <h.schiemann@herbaer.de>
# 2020-04-01 --withcred, --users, --dbs

# Zähler, Variable, Aktionen
declare_vars ()
{
   # Zähler
   g_counters="  \
      verbose    \
      withcred   "

   # Variable
   g_variables=" \
      srcdir     \
      user       \
      password   \
      secrets    ";

   # Aktionen
   g_actions="   \
      users      \
      dbs        ";
} # declare_vars

# setzt Vorgabe-Werte
set_defaults ()
{
   local basedir=$(realpath $0) ;
   basedir=${basedir%/src/localization/MySQLLookup_setup};
   [[ -n "$verbose"       ]] || verbose=1 ;
   [[ -n "$withcred"      ]] || withcred=0 ;
   [[ -n "$user"          ]] || user=root ;
   [[ -n "$password"      ]] || password= ;
   [[ -n "$srcdir"        ]] || srcdir="$basedir/src/localization" ;
   [[ -n "$secrets"       ]] || secrets="$basedir/secrets" ;
} # set_defaults

# Zeigt eine kurze Hilfe an
show_help ()
{
   local cmd=${0#*/} ;
   set_defaults ;
   cat << .HELP ;
$cmd --version
$cmd --help
$cmd OPTION ..

Optionen
--[no_]verbose        Erhöht den Umfang der Ausgabe des Scripts ($verbose)
--[no_]withcred       Benutzername und Kennwort benutzen ($withcred)
--user     USER       MySQL-Root-User ($user)
--password PASSWORD   MySQL-Root-Kennwort
--srcdir   SRCDIR     Skript-Verzeichnis ($srcdir)
--secrets  SECRETS    Pfad der "Geheimnis"-Datei ($secrets)
--users               Datenbank-Nutzer anlegen
--dbs                 Datenbanken anlegen
.HELP
} # show_help

# Zeigt die Version an
show_version ()
{
   cat << .VERSION ;
web/src/localization/MySQLLookup_setup
Übersetzungsdatenbank einrichten
2020-04-01, Herbert Schiemann, h.schiemann@herbaer.de
GPL Version 2 oder neuer
siehe MySQLLookup.pm
.VERSION
} # show_version

# Variable und Zähler initialisieren
init_vars () {
   local v;
   declare_vars ;
   for v in $g_counters $g_variables $g_actions; do
      eval "$v=" ;
   done;
} # init_vars

# Argumente verarbeiten
read_args ()
{
   local wd ;
   local lastwd ;
   local var ;
   local ok ;

   has_actions=0 ;
   for wd in "$@"; do
      if [[ "$lastwd" = "--" ]]; then
          _argv="$_argv $wd";
      elif [[ -n "$lastwd" ]]; then
         if [[ "$wd" =~ ^[\ a-zA-Z0-9./_#-]+$ ]]; then
            ok=0 ;
            for var in $g_variables; do
               if [[ "$var" == "$lastwd" ]]; then
                  (( ++ok )) ;
                  eval "$var=\"$wd\"" ;
                  break ;
               fi ;
            done ;
            if (( ! ok )); then
               (( verbose )) && echo "Unbekannte Option --$lastwd $wd" ;
               exit 11 ;
            fi ;
         else
            (( verbose )) && echo "Ungültiger Optionswert --$lastwd $wd" ;
            exit 12;
         fi;
         lastwd= ;
      else
         case "$wd" in
            --version )
               show_version ;
               exit 0 ;
               ;;
            --help )
               show_version ;
               show_help ;
               exit 0 ;
               ;;
            -- )
               if [[ -n "$_argv" ]]; then
                  lastwd=--;
                  continue;
               else
                  (( verbose )) && echo "Ungültige Option $wd" ;
                  exit 13 ;
               fi ;
               ;;
            --* )
               if [[ "$wd" =~ ^--[a-z][a-z0-9_]*$ ]]; then
                  lastwd=${wd#--} ;
                  ok=0 ;
                  for var in $g_counters ; do
                     if   [[ "$lastwd" == $var    ]]; then
                        eval "(( ++$lastwd ))" ;
                     elif [[ "$lastwd" == "no_$var" ]]; then
                        eval "${lastwd#no_}=0" ;
                     else
                        continue;
                     fi;
                     (( ++ok )) ;
                     break ;
                  done;
                  if (( !ok )); then
                     for var in $g_actions; do
                        if [[ "$lastwd" == "$var" ]]; then
                           eval "(( ++$var ))" ;
                           (( ++ok ));
                           has_actions=1;
                           break;
                        elif [[ "$lastwd" == "no_$var" ]]; then
                           eval "(( ++no_$var ))" ;
                           (( ++ok ));
                           break;
                        fi;
                     done;
                  fi;
                  (( ok )) && lastwd=;
               else
                  (( verbose )) && echo "Ungültige Option $wd" ;
                  exit 14 ;
               fi ;
               ;;
            * )
               (( verbose )) && echo "Ungültige Option $wd" ;
               exit 15 ;
               ;;
         esac ;
      fi ;
   done ;
   if [[ -n $lastwd && "$lastwd" != "--" ]]; then
      (( verbose )) && echo "Unverarbeitete Option --$lastwd";
      exit 16 ;
   fi ;
} # read_args

# Aktionen ausführen
run_actions ()
{
   local act ;
   for act in $g_actions; do
     eval "(( ! has_actions && ! no_$act || $act )) && process_$act";
   done;
} # run_actions

# show_variables VARNAME1 VARNAME2
# Werte der Variablen anzeigen
show_variables ()
{
   local v ;
   for v in $g_counters $g_variables $1; do
      eval "echo \"$v = \$$v\"" ;
   done;
} # show_variables

# Können die Eingabedateien gelesen werden?
# check_infiles first/path/to/file path/to/second_file ;
check_infiles ()
{
   local f ;
   for f in "$@"; do
      if [[ ! -f "$f" ]]; then
         (( verbose )) && echo "\"$f\" ist keine gewöhnliche Datei";
         return 1;
      fi;
      if [[ ! -s "$f" ]]; then
         (( verbose )) && echo "\"$f\" ist leer";
         return 1;
      fi;
      if [[ ! -r "$f" ]]; then
         (( verbose )) && echo "Kann Datei \"$f\" nicht lesen";
         return 1;
      fi;
   done;
   return 0;
} # check_infiles

# Sind die Dateien ausführbar?
# check_executeable first/path/to/script path/to/second_srcipt ;
check_executeable ()
{
   local f ;
   for f in "$@"; do
      if [[ ! -f "$f" ]]; then
         (( verbose )) && echo "$f\" ist keine gewöhnliche Datei";
         return 1;
      fi;
      if [[ ! -x "$f" ]]; then
         (( verbose )) && echo "$f\" ist keine ausführbare Datei";
         return 1;
      fi;
   done;
   return 0;
} # check_executeable

# run_sql name (users, dbs)
run_sql ()
{
   sql=$srcdir/MySQLLookup_$1.sql ;
   check_infiles $sql || return 1;
   (( verbose )) && echo $sql;
   cat $sql | $rpl --val $secrets | mysql $cre ;
} # run_sql

# Datenbanknutzer anlegen
process_users ()
{
   run_sql users ;
} # process_users

# Datenbanken anlegen
process_dbs ()
{
   run_sql dbs ;
} # process_dbs

# Sicherheit
export PATH=/bin:/usr/bin ;
IFS=$' \t\n' ;
init_vars ;
set -o noclobber ;   # existierende Dateien werden nicht überschrieben
shopt -s extglob nullglob ;
read_args "$@" ;
set_defaults ;
cre= ;
if (( withcred )); then
   if [[ -z "$password" ]]; then
      echo "PASSWORD nicht angegeben";
      show_help;
      exit 101;
   fi;
   if [[ -z "$user" ]]; then
      echo "USER nicht angegeben";
      show_help;
      exit 102;
   fi;
   cre="-u $user --password=$password" ;
fi;

(( verbose > 1 )) && show_variables;
rpl=$srcdir/replace.pl ;
check_executeable $rpl  || exit 103;
check_infiles  $secrets || exit 104;

run_actions;
exit 0;

# end of file KLEIDER/web/src/localization/MySQLLookup_setup
