#!/bin/bash
#
# Utility to manage the userland program called RaspScreen by Systemec B.V.
#
# Where it should live: /opt/raspscreen/bin/manage.sh
#
# Examples:
# ./manage.sh (restart|stop|start) (presentation|video)
#
# systemctl must be reachable from the path of the executing user.

app_name="raspscreen"

runtime_id=$(id -u)
if [[ "$runtime_id" -eq 0 ]]; then
    echo "Do not run as root. Run as the graphical user."
    exit 1
fi

printf "Checking input..."

# Action performed
case "$1" in
    restart|stop|start|switch-state)
        printf "Valid command...";;
    *)
        echo "Invalid command!"
        exit 1;;
esac

# Type to select
case "$2" in
    presentation|video)
        echo "Valid service...";;
    *)
        echo "Invalid service!"
        exit 1;;
esac

# Foreground or operator mode
case "$3" in
    --foreground)
        echo "Gathering uptime data..."
        sys_uptime=$(cat /proc/uptime | awk '{print int($1)}')

        if [[ "$sys_uptime" -lt 60 ]]; then
            echo "Detected a recent restart - giving the operating system some time..."
            sleep 10s
        fi

        if [[ "$2" == "presentation" ]]; then
            echo "Finding and moving media..."
            media_file=$(find /opt/raspscreen/media \
                -path /opt/raspscreen/media/current -prune -o \
                -type f \( -iname "*.pptx" -o -iname "*.odp" \) \
                -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)

            media_file_ext="${media_file##*.}"
            echo "New media file: $media_file"

            old_file=$(find /opt/raspscreen/media/current -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" -o -iname "*.webm" -o -iname "*.pptx" -o -iname "*.odp" \))
            echo "Old file: $old_file"

            echo "Copying new media into staging area..."
            cp "$media_file" /opt/raspscreen/media/current

            current_media=$(find /opt/raspscreen/media/current -name "*.$media_file_ext")
            echo "Prepared media: $current_media"

            if [[ -z "$current_media" ]]; then
                echo "No compatible media file found. Wrong mode?"
                echo "Exiting in 20 seconds..."
                sleep 20s
                exit 1
            else
                echo "Starting LibreOffice Present..."
                /usr/bin/libreoffice --impress --show --norestore "$current_media"
            fi
        elif [[ "$2" == "video" ]]; then
            echo "Finding media..."
            media_file=$(find /opt/raspscreen/media \
                -path /opt/raspscreen/media/current -prune -o \
                -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" -o -iname "*.webm" \) \
                -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)

            media_file_ext="${media_file##*.}"
            echo "New media file: $media_file"

            old_file=$(find /opt/raspscreen/media/current -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.mov" -o -iname "*.webm" -o -iname "*.pptx" -o -iname "*.odp" \))
            echo "Old file: $old_file"

            echo "Copying new media into staging area..."
            cp "$media_file" /opt/raspscreen/media/current

            current_media=$(find /opt/raspscreen/media/current -name "*.$media_file_ext")
            echo "Prepared media: $current_media"

            if [[ -z "$current_media" ]]; then
                echo "No compatible media file found. Wrong mode?"
                echo "Exiting in 20 seconds..."
                sleep 20s
                exit 1
            else
                echo "Starting VLC..."
                /usr/bin/vlc --fullscreen --loop --no-video-title --video-on-top --no-qt-fs-controller --qt-continue=0 "$current_media"
            fi
        fi
        echo "Process exited..."
        exit 0
        ;;
    *)
        echo "Running in task mode...";;
esac

echo "Executing task..."
if [[ "$1" != "switch-state" ]]; then
    cmd_result=$(systemctl --user "$1" "$2" 2>&1)
    cmd_exit=$?
elif [[ "$1" == "switch-state" ]]; then
    last_state=$(cat /opt/raspscreen/currentstate.txt)

    if [[ "$2" == "video" ]]; then
        alt_serv="presentation"
    elif [[ "$2" == "presentation" ]]; then
        alt_serv="video"
    fi
    echo "alt_serv: $alt_serv"

    if [ "$last_state" != "$2" ] || [ -z "$last_state" ]; then
        systemctl --user disable "$alt_serv"
        systemctl --user enable "$2"
    fi
    systemctl --user restart "$2"

    echo "$2" > /opt/raspscreen/currentstate.txt
fi

if [[ "$cmd_exit" -eq 0 ]]; then
    echo "Succesfully exited!"
else
    echo "Something went wrong, see..."
    echo "    -> $cmd_result"
fi
exit 0
