#!/bin/bash
export EVENT=DiVOC

TMP=/tmp/$RANDOM
BT="Intergalactic Registration Office - v0.1"

function diaBox() {
  h=8
  w=60
  if [ -n "$3" ]; then
    h=$3
  fi
  if [ -n "$4" ]; then
    w=$4
  fi
  dialog --title "$1" \
  --backtitle "$BT" \
  --msgbox "$2" $h $w
}

function ynBox() {
  h=8
  w=60
  if [ -n "$3" ]; then
    h=$3
  fi
  if [ -n "$4" ]; then
    w=$4
  fi

  dialog --title "$1" \
  --backtitle "$BT" \
  --yesno "$2" $h $w

  return $?
}

function askStr() {
  h=12
  w=60
  if [ -n "$5" ]; then
    h=$5
  fi
  if [ -n "$6" ]; then
    w=$6
  fi

  dialog --title "$2" \
  --backtitle "$BT" \
  --max-input $1 \
  --inputbox "$3" $h $w "$4" 2> $TMP
  return $?
}

function confirm() {
  h=12
  w=60
  if [ -n "$3" ]; then
    h=$3
  fi
  if [ -n "$4" ]; then
    w=$4
  fi

  dialog --title "Confirm: $1" \
  --backtitle "$BT" \
  --yesno "Please confirm those information:\n$2" $h $w
  return $?
}

function jhpAskForField() {
  text="$1: Please choose a free field on the passport.\n
  ------------------\n 
  | Archievements  |\n
  ==================\n
  | 0 | 1 || 6 | 7 |\n
  |---|---||---|---|\n
  | 2 | 3 || 8 | 9 |\n
  |---|---||---|---|\n
  | 4 | 5 || 10| 11|\n
  ==================\n
  "
  askStr 2 "Select a field" "$text" "" 18
  if [ $? -eq 1 ]; then
    return 1
  fi
  FIELD=$(cat $TMP)
  if ! [[ "$FIELD" =~ ^[0-9]+$ ]] || [ -z "$FIELD" ] || [ $FIELD -lt 0 ] || [ $FIELD -gt 11 ]; then
    jhpAskForField
  else 
    return 0
  fi
}

function jhpPrintGPG() {
  jhpAskForField "GPG fingerprint"
  if [ $? -eq 0 ]; then
    diaBox "Insert Passport" "Please insert passport (Archivements) into the printer."
    cd jhp
    ./gpgkey $FIELD $FP
    cd ..
    return 0
  else
    return 1
  fi
}

function jhpPrintReg() {
  diaBox "Insert Passport" "Please insert passport (First page, name, planet, date) into the printer."
  cd jhp
  ./reg "$FNAME" "$SNAME" "$PLANET"
  cd ..
  return 0
}

function jhpIROStamp() {
  jhpAskForField "IRO stamp"
  if [ $? -eq 0 ]; then
    diaBox "Insert Passport" "Please insert passport (Archivements) into the printer."
    cd jhp
    ./iro $FIELD
    cd ..
    return 0
  else
    return 1
  fi
}

function jhpGPG() {
  askStr 49 "GPG Fingerprint" "Enter GPG fingerprint WITH SPACES. E.g.:\n 1234 5678 9ABC DEF0 1234 5678 9ABC DEF0 1234 5678"
  if [ $? -eq 0 ]; then
    FP=$(cat $TMP)
    rm $TMP
    if ! [[ $FP =~ ^([[:xdigit:]]{4} ){9}[[:xdigit:]]{4}$ ]]; then
      diaBox "GPG Fingerprint" "This does not match the RegEx of a GPG fingerprint.\nPlease type in the whole fingerprint."
      jhpGPG
    fi
    FP=$(echo "$FP" | tr [a-f] [A-F])
  else
    return 1
  fi
  if [ "$1" == "no-confirm" ]; then
    return 0
  else
    confirm "GPG Fingerprint" "  GPG:\n    $FP"
    return $?
  fi
}


function jhpReg() {
  askStr 25 "Forename/Nickname" "Enter forename/nickname"
  if [ $? -eq 1 ]; then
    return 1
  fi
  FNAME=$(cat $TMP)

  askStr 25 "Surename" "Enter surename"
  if [ $? -eq 1 ]; then
    return 1
  fi
  SNAME=$(cat $TMP)

  askStr 25 "Planet" "Enter planet" "Earth, Chaospott"
  if [ $? -eq 1 ]; then
    return 1
  fi
  PLANET=$(cat $TMP)

  confirm="  Forename:  $FNAME\n  Surename:  $SNAME\n  Planet:    $PLANET"

  ynBox "IRO Stamp" "Does this being want to have a IRO stamp?"
  if [ $? -eq 0 ]; then
    STAMP=true
  else
    STAMP=false
  fi

  ynBox "GPG" "Does the being have a GPG key to register?"
  if [ $? -eq 0 ]; then
    jhpGPG no-confirm
    if [ $? -eq 0 ]; then
      confirm="$confirm\n  GPG:\n    $FP"
    fi
  fi

  confirm "Everything" "$confirm"
  return $?

}

function jhpmenu() {
  dialog --backtitle "$BT" \
  --menu "Select ID type:" 14 40 3 \
  1 "Registration" \
  2 "IRO Stamp" \
  3 "GPG" \
  9 "Back" 2> $TMP
 
  choice=$(cat $TMP)

  case $choice in
    1)  jhpReg
        if [ $? -eq 0 ]; then
          jhpPrintReg
          if [ "$STAMP" == "true" ]; then
            jhpIROStamp
          fi
          if [ -n "$FP" ]; then
            jhpPrintGPG
          fi
        fi
        ;;
    2)  jhpIROStamp
        ;;
    3)  jhpGPG
        if [ $? -eq 0 ]; then
          jhpPrintGPG
        fi
        ;;
        
  esac
  unset FNAME
  unset SNAME
  unset PLANET
  unset FP
  unset FIELD
}


function adaAskForField() {
  text="$1: Please choose a free field on the passport.\n
  ------------------\n 
  | VISAS || VISAS |\n
  ==================\n
  | 0 | 1 || 4 | 5 |\n
  |---|---||---|---|\n
  | 2 | 3 || 6 | 7 |\n
  ==================\n
  "
  askStr 2 "Select a field" "$text" "" 18
  if [ $? -eq 1 ]; then
    return 1
  fi
  FIELD=$(cat $TMP)
  if ! [[ "$FIELD" =~ ^[0-9]+$ ]] || [ -z "$FIELD" ] || [ $FIELD -lt 0 ] || [ $FIELD -gt 7 ]; then
    adaAskForField
  else 
    return 0
  fi
}

function adaPrintGPG() {
  adaAskForField "GPG fingerprint"
  if [ $? -eq 0 ]; then
    diaBox "Insert Passport" "Please insert passport (Visas) into the printer."
    cd adafruit
    ./gpgkey $FIELD $FP
    cd ..
    return 0
  else
    return 1
  fi
}

function adaPrintReg() {
  diaBox "Insert Passport" "Please insert passport (First page, name, place) into the printer."
  cd adafruit
  ./reg "$FNAME" "$SNAME" "$PLANET"
  cd ..
  return 0
}

function adaIROStamp() {
  adaAskForField "IRO stamp"
  if [ $? -eq 0 ]; then
    diaBox "Insert Passport" "Please insert passport (Visas) into the printer."
    cd adafruit
    ./iro $FIELD
    cd ..
    return 0
  else
    return 1
  fi
}

function adaGPG() {
  askStr 49 "GPG Fingerprint" "Enter GPG fingerprint WITH SPACES. E.g.:\n 1234 5678 9ABC DEF0 1234 5678 9ABC DEF0 1234 5678"
  if [ $? -eq 0 ]; then
    FP=$(cat $TMP)
    rm $TMP
    if ! [[ $FP =~ ^([[:xdigit:]]{4} ){9}[[:xdigit:]]{4}$ ]]; then
      diaBox "GPG Fingerprint" "This does not match the RegEx of a GPG fingerprint.\nPlease type in the whole fingerprint."
      adaGPG
    fi
    FP=$(echo "$FP" | tr [a-f] [A-F])
  else
    return 1
  fi
  if [ "$1" == "no-confirm" ]; then
    return 0
  else
    confirm "GPG Fingerprint" "  GPG:\n    $FP"
    return $?
  fi
}


function adaReg() {
  askStr 25 "Forename/Nickname" "Enter forename/nickname"
  if [ $? -eq 1 ]; then
    return 1
  fi
  FNAME=$(cat $TMP)

  askStr 25 "Surename" "Enter surename"
  if [ $? -eq 1 ]; then
    return 1
  fi
  SNAME=$(cat $TMP)

  askStr 25 "Place" "Enter place" "Earth, Chaospott"
  if [ $? -eq 1 ]; then
    return 1
  fi
  PLANET=$(cat $TMP)

  confirm="  Forename:  $FNAME\n  Surename:  $SNAME\n  Place:    $PLANET"

  ynBox "IRO Stamp" "Does this being want to have a IRO stamp?"
  if [ $? -eq 0 ]; then
    STAMP=true
  else
    STAMP=false
  fi

  ynBox "GPG" "Does the being have a GPG key to register?"
  if [ $? -eq 0 ]; then
    adaGPG no-confirm
    if [ $? -eq 0 ]; then
      confirm="$confirm\n  GPG:\n    $FP"
    fi
  fi

  confirm "Everything" "$confirm"
  return $?

}

function adamenu() {
  dialog --backtitle "$BT" \
  --menu "Select ID type:" 14 40 3 \
  1 "Registration" \
  2 "IRO Stamp" \
  3 "GPG" \
  9 "Back" 2> $TMP
 
  choice=$(cat $TMP)

  case $choice in
    1)  adaReg
        if [ $? -eq 0 ]; then
          adaPrintReg
          if [ "$STAMP" == "true" ]; then
            adaIROStamp
          fi
          if [ -n "$FP" ]; then
            adaPrintGPG
          fi
        fi
        ;;
    2)  adaIROStamp
        ;;
    3)  adaGPG
        if [ $? -eq 0 ]; then
          adaPrintGPG
        fi
        ;;
        
  esac
  unset FNAME
  unset SNAME
  unset PLANET
  unset FP
  unset FIELD
}



while [ true ]; do

  dialog --backtitle "$BT" \
    --menu "Select ID type:" 10 40 3 \
    1 "Junghackerpass" \
    2 "New Adafruit passport" \
    9 "Usual" 2> $TMP

  if [ $? -eq 9 ]; then
    break
  fi
  
  TYPE=$(cat $TMP)


  case $TYPE in
    1)  jhpmenu
        ;;
    2)  adamenu
        ;;
    9)  exit 0
        ;;
  esac
done

rm $TMP
clear