#!/usr/bin/env bash

REPO=fat0troll/lorchess
TOURNEY=2014/1-tabiyas

# Variables
date="[0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{4\}"
result="\(0\|1\|0\.5\):\(0\|1\|0\.5\)"

# Colors
restore="\033[00m"
red="\033[01;31m"
green="\033[01;32m"
yellow="\033[01;33m"
cyan="\033[01;36m"

# Highlight output
highlight () {
    line=$1

    # Highlight the tour heading
    line=$(sed "s/Тур/\\${green}\0\\${restore}/g" <<< "$line")
    line=$(sed "s/№[0-9]\+/\\${cyan}\0\\${restore}/g" <<< "$line")
    line=$(sed "s/^=*$/\\${green}\0\\${restore}/g" <<< "$line")

    # Highlight the tour duration
    line=$(sed "s/\(^.*\):/\\${green}\1\\${restore}:/g" <<< "$line")

    # Highlight date
    line=$(sed "s/${date}/\\${cyan}\0\\${restore}/g" <<< "$line")

    echo -e "$line"
}

# Note that we use '"$@"' to let each command-line parameter expand to a
# separate word. The quotes around '$@' are essential!
# We need 'opts' as the 'eval set --' would nuke the return value of getopt
opts=$(getopt --options p: --longoptions player: -- "$@")

# Note the quotes around '$opts': they are essential!
eval set -- "$opts"

name=""
if [[ $1 == -p || $1 == --player ]]; then
    name=$2
    shift 2
fi
shift

# Generate the sequence of tours to search in
if [[ -z "$@" ]]; then
    seq=$(seq -f "%02g" 1 99)
else
    # Change tour numbers: '1' -> '01', '2' -> '02', and so on
    seq=$(for i in "$@"; do printf "%02g " "$i"; done)
fi

for i in $seq; do

    url="https://raw.github.com/${REPO}/master/${TOURNEY}/tours/${i}/tour_info"

    # Store 'tour_info' in an array of lines.
    # *NOTE* The incorporation of newline at the end of 'tour_info'
    # (--write-out '\n') is important and allows one to read the last
    # line without trailing '\n'
    lines=()
    while read line; do
        lines+=("$line")
    done <<< "$(curl --fail -q --silent --write-out '\n' $url)"

    # Produce output only if 'tour_info' exists
    if [[ -n $lines ]]; then

        # Decide to skip the tour or not
        unskip=""; player=""
        for ((j=5; j<${#lines[@]}; ++j)); do
            line="${lines[$j]}"

            # Don't skip if an unfinished game exists
            if [[ -z $(grep "$result" <<< "$line") ]]; then
                if [[ -z "$name" ]]; then
                    unskip="yes"

                # In addition, if the player was passed as an
                # argument, check if this is his game or not
                elif [[ -n $(grep -o "$name" <<< "$line") ]]; then
                    unskip="yes"
                    # Complete player's name
                    player=$(grep -o "[^ ]*${name}[^ ]*" <<< "$line")
                fi
            fi
        done

        if [[ -n "$unskip" ]]; then

            # The separator between tours
            echo -en "$yellow"
            for j in {1..41}; do echo -n "-"; done
            echo -e "$restore"

            # Output the tour heading as is
            for ((j=0; j<5; ++j)); do highlight "${lines[$j]}"; done

            # Lines with game info
            for ((j=5; j<${#lines[@]}; ++j)); do
                line="${lines[$j]}"

                # Output only unfinished games
                if [[ -z $(grep "$result" <<< "$line") ]]; then
                    if [[ -z "$player" ]]; then
                        highlight "$line"

                    # If the player was passed as an argument,
                    # highlight his name
                    elif [[ -n $(grep -o "${player}" <<< "$line") ]]; then
                        line=$(sed "s/${player}/\\${red}\0\\${restore}/g" <<< "$line")
                        highlight "$line"
                    fi
                fi
            done
       fi
    else
        # If the tour numbers were not passed as arguments, exit once
        # the first non-existing 'tour_info' is reached
        [[ -z "$@" ]] && break
    fi
done

exit 0