#!/bin/bash

PROGRAM_GUIDE=/tmp/tv7pg.xspf
FILTER_LIST=$HOME/.config/tv7pg/filters.txt

which get_tv7_pg > /dev/null 2>&1 || { echo "get_tv7_pg not found"; exit 1; }

function get_pg() {
    get_tv7_pg > "$PROGRAM_GUIDE"

}


if [ ! -r "$PROGRAM_GUIDE" -o "$1" == "--refresh" ]; then
    get_pg
fi


function get_date_of() {
    echo "$(grep -m$1 '<date>' "$PROGRAM_GUIDE" | tail -n1 | cut -d\> -f 2 | cut -d\< -f 1)"

}


function flush_old() {
    NEWEST_DATETIME="$(get_date_of 1)"
    if [ -z "$NEWEST_DATETIME" ]; then
        get_pg
        flush_old
        return
    fi

    SECOND_NEWEST_DATETIME="$(get_date_of 2)"
    if [ -z "$SECOND_NEWEST_DATETIME" ]; then
        get_pg
        flush_old
        return
    fi

    EPOCH_NOW="$(date +%s)"
    SECOND_NEWEST_EPOCH="$(date -d "$SECOND_NEWEST_DATETIME" +%s)"

    if [ $SECOND_NEWEST_EPOCH -lt $EPOCH_NOW ]; then
        grep -q "<track><!-- $NEWEST_DATETIME -->$" "$PROGRAM_GUIDE" || { echo "track identifier $NEWEST_DATETIME not found"; exit 1; }
        sed -i "/<track><!-- $NEWEST_DATETIME -->$/,/<\/track>/d" "$PROGRAM_GUIDE"
        flush_old
        return
    fi

}


function get_epoch_of() {
    D="$(get_date_of $1)"
    echo "$(date -d $D +%s)"

}


function get_now_playing_title() {
    echo "$(grep -B1 "<date>$NOW_PLAYING</date>" "$PROGRAM_GUIDE" | head -n1 | cut -d\> -f 2 | cut -d\: -f 1 | cut -d\  -f 2-)"

}


function get_now_playing_description() {
    echo "$(grep -B1 "<date>$NOW_PLAYING</date>" "$PROGRAM_GUIDE" | head -n1 | cut -d\> -f 2 | cut -d\: -f 2 | cut -d\< -f 1)"

}


function notify() {
    kill -0 $TOTEM_PID > /dev/null 2>&1 || return
    SHOW="$(get_now_playing_title)"
    DESCRIPTION="$(get_now_playing_description)"
    notify-send -t 500 -i tv7pallo "$SHOW" "$DESCRIPTION"

}


function get_muted_status() {
    VOLUME=$(echo $(dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Volume' | tail -1 | cut -de -f 2))
    echo $VOLUME

}


function toggle_audio() {
    if [ ! -r "$FILTER_LIST" ]; then
        return
    fi

    VOLUME="$(get_muted_status)"
    echo "volume = $VOLUME"
    echo "previous volume = $PREVIOUS_VOLUME"
    if [ "$VOLUME" == "0" ] && [ "$VOLUME" != "$PREVIOUS_VOLUME" ]; then
        return
    fi

    NP_TITLE="$(get_now_playing_title)"
    while read blocked; do
        if [[ "$NP_TITLE" =~ "$blocked" ]]; then
            if [ "$VOLUME" == "0" ]; then
                echo "already muted $NP_TITLE"
            else
                echo "muting because $NP_TITLE"
                kill -0 $TOTEM_PID > /dev/null 2>&1 || return
                totem --mute
                PREVIOUS_VOLUME=0
            fi
            return
        fi
    done < $FILTER_LIST

    if [ "$VOLUME" == "0" ]; then
        echo "unmuting"
        kill -0 $TOTEM_PID > /dev/null 2>&1 || return
        totem --mute
        VOLUME="$(get_muted_status)"
        if [ "$VOLUME" == "0" ]; then
            if [ "$PREVIOUS_VOLUME" == "0" ]; then
                NEW_VOLUME=.5
            else
                NEW_VOLUME="$PREVIOUS_VOLUME"
            fi
            echo "work around brokenness"
            dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.totem /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Set string:'org.mpris.MediaPlayer2.Player' string:'Volume' variant:double:$NEW_VOLUME > /dev/null 2>&1
        fi
    fi

    PREVIOUS_VOLUME="$(get_muted_status)"

}


function skip_to_current_show() {
    kill -0 $TOTEM_PID > /dev/null 2>&1 || return 1
    now=$(date +%s)
    i=$(grep '<date>' "$PROGRAM_GUIDE" | grep -n -m1 "<date>$NOW_PLAYING</date>" | cut -d\: -f 1)
    NP_TITLE="$(get_now_playing_title)"
    echo "now playing $NP_TITLE ($i: $NOW_PLAYING)"
    i=$(($i + 1))
    last=$(grep  '<date>' "$PROGRAM_GUIDE" | wc -l)
    while [ $i -le $last ]; do
        echo -n "skip to $i?"
        e=$(get_epoch_of $i)
        if [ $e -ge $now ]; then
            echo " no"
            return 0;
        fi

        LAST_ACTIVE_WINDOW="$(xdotool getwindowfocus getwindowname)"
        echo " yeah"
        kill -0 $TOTEM_PID > /dev/null 2>&1 || return 1
        totem --next
        wmctrl -F -a "$LAST_ACTIVE_WINDOW"
        NOW_PLAYING="$(get_date_of $i)"
        notify
        i=$(($i + 1))
    done

    return 1


}

flush_old
pgrep -x totem && totem --quit
gsettings set org.gnome.totem shuffle false
trap "killall totem ; exit" SIGINT
totem "$PROGRAM_GUIDE" &
TOTEM_PID=$(jobs -p)
sleep 4
PREVIOUS_VOLUME="$(get_muted_status)"
echo "initial volume = $PREVIOUS_VOLUME"
NOW_PLAYING="$(get_date_of 1)"
sleep 3
notify
toggle_audio
LAST_ACTIVE_WINDOW="$(xdotool getwindowfocus getwindowname)"
kill -0 $TOTEM_PID > /dev/null 2>&1 || exit
totem --toggle-controls
sleep 1
WINDOW=$(wmctrl -lp | awk -vpid=$TOTEM_PID '$3==pid {print $1; exit}')
-b remove,maximized_vert
wmctrl -ir "$WINDOW" -b remove,maximized_vert,maximized_horz
wmctrl -ir "$WINDOW" -b add,above
wmctrl -ir "$WINDOW" -e 9,2560,1024,0,0
wmctrl -F -a "$LAST_ACTIVE_WINDOW"
S=$((60 - $(date +%S)))

sleep $S
while skip_to_current_show; do
    toggle_audio
    sleep 60
done
