#!/bin/bash

# 20110731 new with RandOperator and calculated average note

export OPERATION="$1"
export MIN_LIMIT="$2"
export MAX_LIMIT="$3"

  if [ ! $XTERM_VERSION ]; then
   # für Sonstige
   xterm -bg skyblue2 -fg white -fn -*-*-*-r-*-*-24-*-*-*-m-*-iso8859-* -sl 1000 -e "$0 $OPERATION $MIN_LIMIT $MAX_LIMIT"

  else
   # für xterm

Help () {
   # todo: als man-page schreiben
   clear
   echo -e "    \033[1mNOM\033[0m
   `basename $0` :
   Apprendre ¿ calculer. Un jeu interactif.

   \033[1mUTILISATION\033[0m
   `basename $0` avec une seule option pour le type d'op¿ration
   et deux arguments en chiffre r¿el pour les valeurs minimales
   et maximals des chiffres ¿ calculer (default: -10 et 10).
   Une fois dans le jeu, on peut afficher le resultat en appuyant
   la touche \"m\" (montrer). Pour quitter, appuyer \"q\" ou \"Ctrl-C\".

   \033[1mOPTIONS\033[0m
   -a   addition
   -s   substration
   -m   multiplication
   -d   division
   -h   aide

   \033[1mEXEMPLE\033[0m
   \"`basename $0` -a -12 15\" peut donner des calculations entre
   minimal -12 + -12 et maximal 15 + 15 et tous qui est entre les deux."
   sleep 15
   exit
}

Option=$1
Min=${2:--10}
Max=${3:-10}
[[ Min -gt Max ]] && x=$Min Min=$Max Max=$x

RandOperator  () {
Operators=("+" "-" "*" "/")
printf -v Rand %.0f $(date "+%N")
export Operator="${Operators[$(($Rand%${#Operators[@]}))]}"
}

# take options
case $Option in
   -a ) Operator=+ ;; # for additions
   -s ) Operator=- ;; # for substractions
   -m ) Operator=* ;; # for multiplications
   -d ) Operator=/ ;; # for divisions
   -x ) Operator="RandOperator" ;; # for random operator
   -h ) Help ;; # for help
   *  ) Help ;; # for help
esac

Calc () {
   # set two random-numbers:
   Number_1=$(( RANDOM % ( Max - Min + 1 ) +  Min ))
   Number_2=$(( RANDOM % ( Max - Min + 1 ) +  Min ))

   [ $Option == "-x" ] && RandOperator

   # special cases - division:
   if [ "$Operator" = "/" ]; then
      # don't accept zero as divisor ($Number_2):
      [ $Number_2 -eq 0  ] && Calc
      # only outputs integers as results:
      Number_1=$(( $Number_1 * $Number_2 ))
   fi

   # calculate
   Result=$(( $Number_1 $Operator $Number_2 )) 2>/dev/null
}

questions=1
points=0
errors=0

Check () {
   printf "%$((5-${#Number_1}))s %s %+4s %$((5-${#Number_2}))s %s   =   "\
   "" "$Number_1" "$Operator" "" "$Number_2"
   read Answer

   # quit:
   case ${Answer:-e} in
      q ) echo -e "\033[0m" && exit
      ;;
      
      # show result:
      m ) printf "%$((5-${#Number_1}))s %s %+4s %$((5-${#Number_2}))s %s   =   %s\n\n"\
      "" "$Number_1" "$Operator" "" "$Number_2" "$Result"
      Calc # new
      Check
      ;;

      # answer correct:
      $Result ) points=$(( points + 1 ))
      note="$(awk -v POINTS=$points -v QUESTIONS=$questions 'BEGIN { OFMT="%.2f"; print 6/QUESTIONS*POINTS; exit}')"
      #note=$(( 6000 / questions * points ))
      printf "\033[32mbravo !\033[0m %s %s %s %s\n\n"\
      "$questions questions," "$points points," "$errors fautes," "note: $note"
      questions=$(( questions + 1 ))
      Calc # new
      Check
      ;;

      # answer  not correct:
      * ) errors=$(( errors + 1 ))
      note="$(awk -v POINTS=$points -v QUESTIONS=$questions 'BEGIN { OFMT="%.2f"; print 6/QUESTIONS*POINTS; exit}')"
      #note=$(( 6000 / questions * points ))
      printf "\033[31maiioh !\033[0m %s %s %s %s\n\n"\
      "$questions questions," "$points points," "$errors fautes," "note: $note"
      questions=$(( questions + 1 ))
      # again:
      Check
      ;;
   esac
}
Calc
Check

fi