#!/bin/bash

# stdbuf -o0 -e0 ./20.sh >20.out 2>&1

demo=in.demo
punch=tyves.flx

rm -f fromgier.asc

declare -A questions
declare -A questionno
declare -A questionja
declare -A questionnej
spmnr=0
lastq=0
lasta=0
spmno=0

export questions questionno questionja questionnej spmnr lastq lasta demo

dumptable()
{
  echo " ------------------- Dump ------------------"
# echo "${!questions[@]}"
  for key in `printf "%s\n" "${!questions[@]}" | sort -t = -k 1 -n`
  do
    echo " "
    echo Question $key: ${questions[$key]}
    if [[ questionja[$key] -gt 0 ]]; then
      echo ja: ${questionja[$key]} ${questions[${questionja[$key]}]}
    elif [[ questionja[$key] -lt 0 ]]; then
      echo ja: Svar: ${questionja[$key]} ${lande[$((-${questionja[$key]}))]}
    fi
    if [[ questionnej[$key] -gt 0 ]]; then
      echo nej: ${questionnej[$key]} ${questions[${questionnej[$key]}]}
    elif [[ questionnej[$key] -lt 0 ]]; then
      echo nej: Svar: ${questionnej[$key]} ${lande[$((-${questionnej[$key]}))]}
    fi
  done
  echo " -------------------------------------------"
}

tailpid=0
gierpid=0
punchpid=0

lande[1]="Afghanistan "
lande[2]="Albanien "
lande[3]="Algerie "
lande[4]="Andorra "
lande[5]="Argentina "
lande[6]="Australien"
lande[7]="Belgien "
lande[8]="Bhutan "
lande[9]="Bolivia "
lande[10]="Brasilien "
lande[11]="Bulgarien "
lande[12]="Burma "
lande[13]="Cambodge "
lande[14]="Cameroun "
lande[15]="Canada "
lande[16]="Centralafrikanske Føderation "
lande[17]="Centralafrikanske Republik "
lande[18]="Ceylon "
lande[19]="Chile "
lande[20]="Colombia "
lande[21]="Congo "
lande[22]="Costa Rica "
lande[23]="Cuba "
lande[24]="Danmark "
lande[25]="Ecuador "
lande[26]="Eire "
lande[27]="Elfenbenskysten "
lande[28]="England "
lande[29]="Etiopien "
lande[30]="Filippinerne "
lande[31]="Finland "
lande[32]="Frankrig "
lande[33]="Gabon "
lande[34]="Ghana "
lande[35]="Grækenland "
lande[36]="Guinea "
lande[37]="Guatemala "
lande[38]="Haiti "
lande[39]="Holland "
lande[40]="Honduras "
lande[41]="India "
lande[42]="Iran(Persien) "
lande[43]="Iraq "
lande[44]="Island "
lande[45]="Israel "
lande[46]="Italien "
lande[47]="Japan "
lande[48]="Jordan "
lande[49]="Jugoslavien "
lande[50]="Kina "
lande[51]="Kuwait "
lande[52]="Kypern "
lande[53]="Laos "
lande[54]="Libanon "
lande[55]="Liberia "
lande[56]="Libia "
lande[57]="Lichtenstein "
lande[58]="Luxemburg "
lande[59]="Madagascar "
lande[60]="Malaya "
lande[61]="Mali "
lande[62]="Marokko "
lande[63]="Mauretanien "
lande[64]="Mexico "
lande[65]="Monaco "
lande[66]="Mongoliet "
lande[67]="Nepal "
lande[68]="New Zealand "
lande[69]="Nicaragua "
lande[70]="Niger "
lande[71]="Nigeria "
lande[72]="Nord Korea "
lande[73]="Nord Vietnam "
lande[74]="Norge "
lande[75]="Oman "
lande[76]="Pakistan/Bangla Desh"
lande[77]="Panama "
lande[78]="Paraguay "
lande[79]="Peru "
lande[80]="Polen "
lande[81]="Portugal "
lande[82]="Rep.Congo "
lande[83]="Rep.Dominicana "
lande[84]="Rep.Volta "
lande[85]="Rumænien "
lande[86]="San Marino "
lande[87]="San Salvador "
lande[88]="Saudi Arabien "
lande[89]="Schweiz "
lande[90]="Senegal "
lande[91]="Sierre Leone "
lande[92]="Singapore "
lande[93]="Somali "
lande[94]="Spanien "
lande[95]="Sudan "
lande[96]="Sverige "
lande[97]="Sydafrikanske Union "
lande[98]="Syd Korea "
lande[99]="Syd Vietnam "
lande[100]="Syrien "
lande[101]="Taiwan(Formosa) "
lande[102]="Tchad "
lande[103]="Thailand "
lande[104]="Tibet "
lande[105]="Tjekkoslovakiet "
lande[106]="Tunis "
lande[107]="Tyrkiet "
lande[108]="Ungarn "
lande[109]="Uruguay "
lande[110]="USA "
lande[111]="USSR "
lande[112]="Vatikanet "
lande[113]="Venezuela "
lande[114]="Vest Tyskland "
lande[115]="Yemen "
lande[116]="Ægypten "
lande[117]="Østrig "
lande[118]="Øst Tyskland "
lande[119]="Indonesien "

checkslut ()
{
  svar="$1"
  for((l=1;l<=119;l++))
  do
    svar2="Er det ${lande[$l]}"
    if [[ "$svar" == "$svar2" ]]
    then
      return $l
    fi
  done
  return 0
}

checkaandsvag ()
{
  svar="$1"
  hit=0
  if [[ "$svar" == "Er  nationalsporten vandpolo." ]]; then
    hit=1
  elif [[ "$svar" == "Er møntfoden gysser." ]]; then
    hit=1
  elif [[ "$svar" == "Er landets ideal tøffelhelten." ]]; then
    hit=1
  elif [[ "$svar" == "Er nationaldragten mamelukker og træsko." ]]; then
    hit=1
  elif [[ "$svar" == "Løber Gudenåen igennem." ]]; then
    hit=1
  elif [[ "$svar" == "Er vest den vej -----> " ]]; then
    hit=1
  elif [[ "$svar" == "Er det her en kone koster 7 spyd, 3 lerkrukker og 12 grise." ]]; then
    hit=1
  elif [[ "$svar" == "Findes der makaronimarker her." ]]; then
    hit=1
  elif [[ "$svar" == "Har De parkeret Deres vogn korrekt." ]]; then
    hit=1
  elif [[ "$svar" == "Er hovednæringsmidlet tyggegummi." ]]; then
    hit=1
  elif [[ "$svar" == "Har De nogensinde været der." ]]; then
    hit=1
  elif [[ "$svar" == "sp|&n<1>q:i-+789 - Undskyld skrev jeg forkert.                                              _G_I_E_R." ]]; then
    hit=1
  elif [[ "$svar" == "Kendes landet på sine store dværge." ]]; then
    hit=1
  elif [[ "$svar" == "Lever der tamme moskusdrager." ]]; then
    hit=1
  elif [[ "$svar" == "Har dronning Margrethe været dronning for dette land." ]]; then
    hit=1
  elif [[ "$svar" == "Findes der i landets flag en blå struds." ]]; then
    hit=1
  elif [[ "$svar" == "Er det tømmermændenes hjemland." ]]; then
    hit=1
  elif [[ "$svar" == "Tror befolkningen på onde ånder." ]]; then
    hit=1
  elif [[ "$svar" == "sta- sta- stammer be- be- befolkningen." ]]; then
    hit=1
  elif [[ "$svar" == "Elsker befolkningen Sauerkraut." ]]; then
    hit=1
  elif [[ "$svar" == "Lever indbyggerne i snehytter." ]]; then
    hit=1
  fi
  echo aandsvag: $hit >&2
  return $hit 
}

cleanup ()
{
  echo cleanup called
  if [ $tailpid -ne 0 ]
  then
    echo kill tail
    kill $tailpid
    tailpid=0
  fi
  if [ $punchpid -ne 0 ]
  then
    echo kill punch
    kill $punchpid
    punchpid=0
  fi
  if [ $gierpid -ne 0 ]
  then
    echo kill gier
    kill $gierpid
    gierpid=0
  fi
  rm in.demo in2.demo tyves.flx
  exit 0
}

looseends()
{
  local qno="$1"
  local st=0
  echo looseends $qno >&2
  if [[ questionja[$qno] -eq 0 ]]; then
    echo looseends $qno ja fri>&2
    return 1
  fi
  if [[ questionnej[$qno] -eq 0 ]]; then
    echo looseends $qno nej fri>&2
    return 1
  fi
  if [[ questionja[$qno] -gt 0 ]]; then
    echo looseends $qno ja er ${questionja[$qno]} >&2
    looseends ${questionja[$qno]}
    st=$?
    return $st
  fi
  if [[ questionnej[$qno] -gt 0 ]]; then
    echo looseends $qno nej er ${questionnej[$qno]} >&2
    looseends ${questionnej[$qno]}
    st=$?
    return $st
  fi
  echo looseends falde igennem >&2
  return 0
}

findsvar()
{
  local qno="$1"
  local qno2=0

  echo findsvar $qno ${questions[$qno]} >&2

  if [[ questionja[$qno] -eq 0 ]]; then
    echo findsvar: ja er ikke valgt >&2
    echo "ja"
  elif [[ questionnej[$qno] -eq 0 ]]; then
    echo findsvar: nej er ikke valgt >&2
    echo "nej"
  else
    echo findsvar: både ja og nej er valgt >&2
    qno2=${questionja[$qno]}
    if [[ $qno2 -gt 0 ]]
    then
      looseends $qno2
      if [[ $? -ne 0 ]]
      then
	echo "ja"
	return
      fi
    fi
    qno2=${questionnej[$qno]}
    if [[ $qno2 -gt 0 ]]
    then
      looseends $qno2
      if [[ $? -ne 0 ]]
      then
	echo "nej"
	return
      fi
    fi
    echo "Er vi færdige?" >&2
  fi
}

dopunch()
{
  uc=0
  linebuffer=""
  while true
  do
    read -n1 -t 0.3 ch
    ok=$?
    if [ $ok -gt 128 ]
    then
      while [ "${linebuffer:0:1}" == " " -o "${linebuffer:0:1}" == "" ]
      do
	linebuffer="${linebuffer:1}"
      done
      q="$linebuffer"
      linebuffer=""
      echo timeout "$q"
      checkaandsvag "$q"
      if [[ $? -ne 0 ]]
      then
	echo send ja to GIER
	./maketext.sh ja >>$demo
	/bin/echo -n "ja" >>fromgier.asc
	echo "WAITINPUT" >>$demo
        continue
      fi
      if [[ "${q:0:8}" == "Det var " ]]
      then
	echo start forfra
	dumptable
	echo send ja to GIER
	./maketext.sh ja >>$demo
	/bin/echo -n "ja" >>fromgier.asc
	echo "WAITINPUT" >>$demo
	continue
      fi
      spmno=$((spmno+1))
      checkslut "$q"
      svarland=$?
      if [[ $svarland -eq 0 ]]
      then
	if [[ -v "questionno[$q]" ]]; then
	  echo gammel
	  qno="${questionno[$q]}"
	  echo set qno 1: $qno
	else
	  echo ny
	  spmnr=$((spmnr+1))
	  qno="$spmnr"
	  echo set qno 2: $qno
	  questionja[$qno]=0
	  questionnej[$qno]=0
	  questionno["$q"]=$spmnr
	  questions["$spmnr"]="$q"
	fi
      else
	if [[ $spmno -eq 1 ]]
	then
	  echo send nej to GIER
	  ./maketext.sh nej >>$demo
	  /bin/echo -n "nej" >>fromgier.asc
	  echo "WAITINPUT" >>$demo
	  continue
	else
	  echo send ja to GIER
	  ./maketext.sh ja >>$demo
	  /bin/echo -n "ja" >>fromgier.asc
	  echo "WAITINPUT" >>$demo
	fi
	qno="-$svarland"
	echo set qno 3: $qno
      fi
      echo lastq is: $lastq
      if [[ $lastq -ne 0 ]]
      then
	if [[ "$lasta" == "ja" ]]
	then
	  qno2=${questionja[$lastq]}
          if [ $qno2 -ne 0 -a $qno2 -ne $qno ]
	  then
	    echo MISMATCH ja lastq: $lastq $qno2 $qno >&2
	    exit 0
	  fi
	  questionja[$lastq]="$qno"
	else
	  qno2=${questionnej[$lastq]}
          if [ $qno2 -ne 0 -a $qno2 -ne $qno ]
	  then
	    echo MISMATCH nej lastq: $lastq $qno2 $qno >&2
	    exit 0
	  fi
	  questionnej[$lastq]="$qno"
	fi
      fi
      echo qno: $qno
      if [[ $qno -lt 0 ]]
      then
	continue
      fi
      lasta=$(findsvar "$qno")
      lastq="$qno"
      echo set lastq: $lastq
      echo send $lasta to GIER
      ./maketext.sh $lasta >>$demo
      /bin/echo -n "$lasta" >>fromgier.asc
      echo "WAITINPUT" >>$demo
      continue
    fi
    printf -v c "%d" "'$ch"
    c=$(((c&0xe0)>>1 | (c&0x0f)))
    if [ $uc -eq 0 ]
    then
      case $c in
      0)
        asc=" "
	;;
      1)
	asc="1"
	;;
      2)
	asc="2"
	;;
      3)
	asc="3"
	;;
      4)
	asc="4"
	;;
      5)
	asc="5"
	;;
      6)
	asc="6"
	;;
      7)
	asc="7"
	;;
      8)
	asc="8"
	;;
      9)
	asc="9"
	;;
      10)
	asc=""
	;;
      11)
	asc=""
	;;
      12)
	asc=""
	;;
      13)
	asc="å"
	;;
      14)
	asc="_"
	;;
      15)
	asc=""
	;;
      16)
	asc="0"
	;;
      17)
	asc="<"
	;;
      18)
	asc="s"
	;;
      19)
	asc="t"
	;;
      20)
	asc="u"
	;;
      21)
	asc="v"
	;;
      22)
	asc="w"
	;;
      23)
	asc="x"
	;;
      24)
	asc="y"
	;;
      25)
	asc="z"
	;;
      26)
	asc=""
	;;
      27)
	asc=","
	;;
      28)
	asc=""
	;;
      29)
	asc=""
	;;
      30)
	asc="	"
	;;
      31)
	asc=""
	;;
      32)
	asc="-"
	;;
      33)
	asc="j"
	;;
      34)
	asc="k"
	;;
      35)
	asc="l"
	;;
      36)
	asc="m"
	;;
      37)
	asc="n"
	;;
      38)
	asc="o"
	;;
      39)
	asc="p"
	;;
      40)
	asc="q"
	;;
      41)
	asc="r"
	;;
      42)
	asc=""
	;;
      43)
	asc="ø"
	;;
      44)
	asc=""
	;;
      45)
	asc=""
	;;
      46)
	asc=""
	;;
      47)
	asc=""
	;;
      48)
	asc="æ"
	;;
      49)
	asc="a"
	;;
      50)
	asc="b"
	;;
      51)
	asc="c"
	;;
      52)
	asc="d"
	;;
      53)
	asc="e"
	;;
      54)
	asc="f"
	;;
      55)
	asc="g"
	;;
      56)
	asc="h"
	;;
      57)
	asc="i"
	;;
      58)
	asc=""
	uc=0
	;;
      59)
	asc="."
	;;
      60)
	asc=""
	uc=1
	;;
      61)
	asc=""
	;;
      62)
	asc=""
	;;
      63)
	asc=""
	;;
      64)
	asc=""
	;;
      *)
	echo unknown character
      esac
    else
      case $c in
      0)
        asc=" "
	;;
      1)
	asc="£"
	;;
      2)
	asc="*"
	;;
      3)
	asc="/"
	;;
      4)
	asc="="
	;;
      5)
	asc=";"
	;;
      6)
	asc="["
	;;
      7)
	asc="]"
	;;
      8)
	asc="("
	;;
      9)
	asc=")"
	;;
      10)
	asc=""
	;;
      11)
	asc=""
	;;
      12)
	asc=""
	;;
      13)
	asc="Å"
	;;
      14)
	asc="|"
	;;
      15)
	asc=""
	;;
      16)
	asc="&"
	;;
      17)
	asc=">"
	;;
      18)
	asc="S"
	;;
      19)
	asc="T"
	;;
      20)
	asc="U"
	;;
      21)
	asc="V"
	;;
      22)
	asc="W"
	;;
      23)
	asc="X"
	;;
      24)
	asc="Y"
	;;
      25)
	asc="Z"
	;;
      26)
	asc=""
	;;
      27)
	asc="'"
	;;
      28)
	asc=""
	;;
      29)
	asc=""
	;;
      30)
	asc="	"
	;;
      31)
	asc=""
	;;
      32)
	asc="+"
	;;
      33)
	asc="J"
	;;
      34)
	asc="K"
	;;
      35)
	asc="L"
	;;
      36)
	asc="M"
	;;
      37)
	asc="N"
	;;
      38)
	asc="O"
	;;
      39)
	asc="P"
	;;
      40)
	asc="Q"
	;;
      41)
	asc="R"
	;;
      42)
	asc=""
	;;
      43)
	asc="Ø"
	;;
      44)
	asc=""
	;;
      45)
	asc=""
	;;
      46)
	asc=""
	;;
      47)
	asc=""
	;;
      48)
	asc="Æ"
	;;
      49)
	asc="A"
	;;
      50)
	asc="B"
	;;
      51)
	asc="C"
	;;
      52)
	asc="D"
	;;
      53)
	asc="E"
	;;
      54)
	asc="F"
	;;
      55)
	asc="G"
	;;
      56)
	asc="H"
	;;
      57)
	asc="I"
	;;
      58)
	asc=""
	uc=0
	;;
      59)
	asc=":"
	;;
      60)
	asc=""
	uc=1
	;;
      61)
	asc=""
	;;
      62)
	asc=""
	;;
      63)
	asc=""
	;;
      64)
	asc=""
	;;
      *)
	echo unknown character
      esac
    fi
#   echo got $ch $c $asc
    if [[ "$asc" == "" ]]
    then
      echo >>fromgier.asc
    else
      /bin/echo -n "$asc" >>fromgier.asc
    fi
    linebuffer="$linebuffer$asc"
#   echo linebuffer: $linebuffer
    if [ "${linebuffer:(-5):5}" == "KLAR." ]
    then
      spmno=0
      linebuffer=""
      lastq=0
      echo set lastq: $lastq
      echo send ja to GIER
      ./maketext.sh ja >>$demo
      /bin/echo -n "ja" >>fromgier.asc
      echo "WAITINPUT" >>$demo
    fi
  done
}

rm -rf $demo tyves.flx

cp configs/ht.gier default.gier
echo "Select3	00000010" >>default.gier
#echo "Select2	00000000" >>default.gier

trap "cleanup" INT

mkfifo in.demo
mkfifo in2.demo
mkfifo tyves.flx

dopunch <tyves.flx &
punchpid=$!

tail -1f in.demo | tee in.demo.tee >in2.demo &
tailpid=$!
./GIER in2.demo &
gierpid=$!

echo "LOADPUNCH $punch" >>$demo
./maketext.sh "run,tyves<" >>$demo
echo "WAITINPUT" >>$demo
wait

