#!/bin/bash

# Copyright 2015 Olivier van Helden <olivier@van-helden.net>
# Released under GNU Affero GPL v3.0 license
#    http://www.gnu.org/licenses/agpl-3.0.html

PID=$$
[ "$PGM" ] || PGM=`basename $0`
[ "$TMP" ] || TMP=/tmp/$PGM.$PID
[ "$LOCK" ] || LOCK=/tmp/.$PGM.lock

trap 'rm -f $TMP.* $LOCK' EXIT

SPC=$(echo "$PGM" | sed "s/./ /g")
LOG=$TMP.log
DATA="$HOME/.$PGM"

COLOR_HIGHLIGHT="[1;31;40m"
COLOR_NORMAL="[0;;m"
# red='\e[1;31m'
# green='\e[1;32m'
# yel='\e[1;33m'
# blu='\e[1;34m'
# mag='\e[1;35m'
# cyn='\e[1;36m'
# end='\e[0m'

[ ! "$ENDSUCCESS" ] && ENDSUCCESS="Succeed"
[ ! "$ENDFAILED" ] && ENDFAILED="Failed"

if [ "$USETTS" = "yes" ]
then
    SAY=$(which tts) || SAY=$(which say) || SAY=$(which espeak) || unset SAY
    echo "$SAY" | grep -q "/espeak$" && SAY="$SAY -v fr"
else
    SAY=echo
fi

echo "$0" | grep -q "^/" && BINDIR=$(dirname "$0") || BINDIR=$(dirname $(realpath "$0"))
BASEDIR=$(dirname "$BINDIR")
PATH=$BINDIR:$PATH

help() {
	[ "$HELP" ] && echo "$HELP" || usage
}

usage() {
  if [ ! "$USAGE" ]
  then
    PAR=`echo $OPTS|sed 's/.://g'|grep -v "^$"|sed "s/\([a-zA-Z0-9]*\)/[-\\1]/g" `
    PAROPT=`echo $OPTS | sed "s/-://" | sed 's/\(.\)/\\1\//g' \
        | sed 's/\(.\)\/:\//[-\\1 <value>] /g' \
        | sed "s/.\///g" `
    USAGE=$(echo $PGM $PAR $PAROPT "[...]" | sed "s/  / /g")
  fi
	echo "usage: $USAGE"
}

log() {
	[ "$1" ] || return
	if [ "$LOG" ]
		then
		ERRNUM=`echo "$@" |grep "^[0-9]* "|cut -d " " -f 1`
		ERR=`echo $ERRNUM | grep [0-9] |sed "s/\([0-9]*\)/<\\1\> /"`
		[ "$ERRNUM" ] && shift
		LOGMESSAGE=$@
		LOGLINE=`date +"%Y-%m-%d %H:%M:%S"`" $PGM[$$]: $ERR$LOGMESSAGE"
		[ "$LOGGING" = "yes" ] && (echo $LOGLINE >> $LOG)
		if [ "$ERRNUM" ]
			then
			echo "${COLOR_HIGHLIGHT}$PGM:${COLOR_NORMAL} $LOGMESSAGE" >&2
			[ "$USETTS" = "yes" ] && $SAY "Error $ERRNUM: $LOGMESSAGE" 2>/dev/null &
		elif [ "$DEBUG" = "yes"  ]
			then
			# [ "$USETTS" = "yes" ] && $SAY "$LOGMESSAGE" &
			echo "$PGM: $LOGMESSAGE" >&2
		fi
	else
		echo "LOG variable not set"
		exit 1
	fi
}

end() {
	if [ "$1" ]
		then
		expr $1 + 0 >/dev/null 2>/dev/null && ERRNUM=$(($1 + 0)) && shift || ERRNUM=0
	else
		ERRNUM=0
	fi

	if [ "$ERRNUM" -ne 0 ]
		then
		# ERRNUM=`expr $ERRNUM + 0`
		# shift
		[ "$#" -gt 0 ] && endMessage="$@" || endMessage=$ENDFAILED
		log $ERRNUM "$endMessage"
	else
		ERRNUM=0
		[ "$1" = "0" ] && shift
		[ "$#" -gt 0 ] && endMessage="$@" || endMessage=$ENDSUCCESS
		log "$endMessage"
		[ "$USETTS" = "yes" ] && $SAY "$endMessage" 2>/dev/null &
	fi

	rm -f $TMP $TMP.*
	rm -f $LOG.lock
	# [ -f $LOG ] && chmod -f 666 $LOG*

	exit $ERRNUM
}

readvar() {
    for var in $@
    do
	varname=$(echo $var | sed "s/\([a-z]\)\([A-Z]\)/\\1 \\2/g")
	if [ "$AUTOMATIC" = "yes" ]
	then
	    echo "$varname: ${!var}"
	else
	    read -e -p "$varname: " -i "${!var}" $var
	fi
    done
}

yesno() {
    default=n
    choice="y/N"
    [ "$1" = "y" ] && default=y && choice="Y/n" && shift
    [ "$1" = "-y" ] && default=y && choice="Y/n" && shift
    [ "$@" ] && message="$@" || message="Answer"
    message="$message ($choice) "
    read -u1 -p "$message" answer
    [ "$answer" = "" ] && answer=$default
    answer=$(echo "$answer" | tr "[:upper:]" "[:lower:]")
    [ "$answer" = "y" ] && return 0
    [ "$answer" = "yes" ] && return 0
    return 1
}

istrue() {
  answer=$(echo $1 | tr "[:upper:]" "[:lower:]")
  case $answer in
    y|yes|o|oui|t|true)
    # log "answer $1 is true"
    return
    ;;
  esac
  # log "answer $1 is false"
  return -1
}

ucfirst() {
    upper=$(echo $@ | cut -c 1 | tr "[:lower:]" "[:upper:]")
    lower=$(echo $@ | cut -c 2- | tr "[:upper:]" "[:lower:]")
    echo "$upper$lower"
}

convertsecs() {
  d=$(($1/86400))
  [ $d = 1 ] && days="$d day "
  [ $d -gt 1 ] && days="$d days "
  h=$(($1%86400/3600))
  m=$(($1%3600/60))
  s=$(($1%60))
  printf "$days%02d:%02d:%02d\n" $h $m $s | sed -e "s/^00://g" -e "s/^00:0*\([0-9][0-9]*\)/\\1 seconds/g" -e "s/^[01] seconds/1 second/" -e "s/ 00:00:00$//"
}

countdown() {
  [ "$1" ] && secs=$1 && shift || secs=5
  [ "$1" ] && msg=$@ || msg=Countdown
  while [ $secs -gt 0 ]
  do
    time=$(convertsecs $secs)
    printf "\r\033[K$msg $time"
    secs=$(($secs - 1))
    read -t 1 && return
  done
  printf "\r\033[K"
}

[ ! "$OPTS" ]  && OPTS="hvq"
PAR=`echo $OPTS|sed 's/.://g'|grep -v "^$"|sed "s/\([a-zA-Z0-9]*\)/[-\\1]/g" `
PAROPT=`echo $OPTS | sed "s/-://" | sed 's/\(.\)/\\1\//g' \
    | sed 's/\(.\)\/:\//[-\\1 <value>] /g' \
    | sed "s/.\///g" `
[ ! "$USAGE" ] && USAGE=$(echo $PGM $PAR $PAROPT "[<args>]" | sed "s/  / /g")
[ ! "$HELP" ] && HELP="
  -h, --help  help
  -q  quiet
  -v  verbose
"
echo "$HELP" | grep -q "[Uu]sage:" || HELP="$(usage)

$HELP"

if [ "$OPTSINHELPER" = "yes" ]
then

while getopts $OPTS PARAM
  do
    case $PARAM in
    "?")
      ERROR=1
      ;;
    -)
      case $OPTARG in
      help)
        help; end
        ;;
      quiet)
        STDOUT="/dev/null"
        QUIET=yes
        DEBUG=no
        ;;
      verbose)
        STDERR="&1"
        DEBUG=yes
        ;;
      esac
      ;;
    h)
      help; end
      ;;
    v)
      STDERR="&1"
      DEBUG=yes
      ;;
    q)
      STDOUT="/dev/null"
      QUIET=yes
      DEBUG=no
      ;;
  esac
done 2>/dev/null

  [ $ERROR ] && end $ERROR "$(usage)
  type '$PGM --help' for more info"
fi
OPTPROCESSED=$OPTIND
OPTIND=1
