#!/bin/bash

# Aby włączyć śledzenie wykonania, usuń znak # z początku kolejnego wiersza
# set -o xtrace

#==================
function initialize ()
{
trap 'summarize ; exit 0' INT     # Obsługa przerwania użytkownika
num_ques=0                        # Liczba zadanych do tej pory pytań
num_correct=0                     # Liczba poprawnych odpowiedzi
first_time=true                   # Prawda, dopóki nie zostanie zadane pierwsze pytanie
cd ${QUIZDIR:=~/quiz} || exit 2
}

#==================
function choose_subj ()
{
subjects=($(ls))
PS3="Wybierz temat quizu z powyższej listy: "
select Subject in ${subjects[*]}; do
    if [[ -z "$Subject" ]]; then
        echo "Nie wybrałeś żadnego tematu. Cześć!" >&2
        exit 1
    fi
    echo $Subject
    return 0
done
}

#==================
function exchange ()
{
temp_value=${questions[$1]}
questions[$1]=${questions[$2]}
questions[$2]=$temp_value
}

#==================
function scramble ()
{
declare -i index quescount
questions=($(ls))
quescount=${#questions[*]}        # Liczba elementów
((index=quescount-1))
while [[ $index > 0 ]]; do
    ((target=RANDOM % index))
    exchange $target $index
    ((index -= 1))
done
}

#==================
function ask ()
{
exec 3<$1
read -u3 ques || exit 2
read -u3 num_opts || exit 2

index=0
choices=()
while (( index < num_opts )) ; do
    read -u3 next_choice || exit 2
    choices=("${choices[@]}" "$next_choice")
    ((index += 1))
done
read -u3 correct_answer || exit 2
exec 3<&-

if [[ $first_time = true ]]; then
    first_time=false
    echo -e "Aby zakończyć quiz w dowolnym momencie, naciśnij klawisz przerwania.\n"
fi

PS3=$ques"  "                     # Ustawia wartość zmiennej $ques  jako  znak zachęty wyświetlany przez polecenie select
                                  # i dodaje nieco miejsca dla zwiększenia czytelności
select answer in "${choices[@]}"; do
    if [[ -z "$answer" ]]; then
            echo  Niepoprawna opcja. Wybierz jeszcze raz.
        elif [[ "$answer" = "$correct_answer" ]]; then
            echo "Dobra odpowiedź!"
            return 1
        else
            echo "Niestety, prawidłowa odpowiedź to $correct_answer."
            return 0
    fi
done
}

#==================
function summarize ()
{
echo                              # Pomiń wiersz
if (( num_ques == 0 )); then
    echo "Nie odpowiedziałeś na żadne pytanie"
    exit 0
fi

(( percent=num_correct*100/num_ques ))
echo "Odpowiedziałeś prawidłowo na $num_correct pytań z ogólnej liczby  \
$num_ques pytań."
echo "Odpowiedziałeś prawidłowo na $percent procent pytań."
}

#==================
# Program główny
initialize                        # Etap 1 w naszym projekcie

subject=$(choose_subj)            # Etap 2
[[ $? -eq 0 ]] || exit 2          # Jeżeli plik pytania jest niepoprawny, zakończ z kodem 2

cd $subject || exit 2             # Etap 3
echo                              # Pomiń wiersz
scramble                          # Etap 4

for ques in ${questions[*]}; do   # Etap 5
    ask $ques
    result=$?
    (( num_ques=num_ques+1 ))
    if [[ $result == 1 ]]; then
        (( num_correct += 1 ))
    fi
    echo                          # Pomiń wiersz pomiędzy pytaniami
    sleep ${QUIZDELAY:=1}
done

summarize                         # Etap 6 
exit 0
