#!/bin/bash

#
# Based on code from: http://bash.org.ru/quote/323695
#
# $Id: kukushka-clock,v 1.11 2007/06/16 10:45:52 andy Exp $
#

# This program is free software. It comes without any warranty, to the extent
# permitted by applicable law. You can redistribute it and/or modify it under
# the terms of the Do What The Fuck You Want To Public License, Version 2, as
# published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more
# details.

CFGFILE=/etc/sysconfig/kukushka-clock
PKGDATADIR=/usr/share/kukushka-clock
TEMP_DIR=/var/run/kukushka-clock
TEMP_FILE=`basename "$0"`
whoiam=`whoami`
[ "$whoiam" != root ] && TEMP_FILE="$TEMP_FILE.$whoiam"
unset whoiam

# For debugging
#TEST='echo'
TEST=

# Read the configuration
ALLOW='no'
SCHEME="RoundRobin"
EJECT="yes"
DEVICE=/dev/cdrom
SND_PLAYER='aplay'
SND_DEVICE='default'
SND_OPTS='-q'
SND_FILE=
if [ -f "$CFGFILE" ]; then
    source "$CFGFILE"
fi

while [ $# -gt 0 ]; do
    case $1 in
	--force)
	    ALLOW='yes'
	    ;;

	--scheme*)
            if [ "$1" != "${1##--scheme=}" ]; then
                SCHEME=${1##--scheme=}
            else
                SCHEME=$2
                shift
            fi
	    ;;

	--eject)
	    EJECT='yes'
	    ;;

	--no-eject)
	    EJECT='no'
	    ;;

	--device*)
            if [ "$1" != "${1##--device=}" ]; then
                DEVICE=${1##--device=}
            else
                DEVICE=$2
                shift
            fi
	    ;;

	--snd-player*)
            if [ "$1" != "${1##--snd-player=}" ]; then
                SND_PLAYER=${1##--snd-player=}
            else
                SND_PLAYER=$2
                shift
            fi
	    ;;

	--snd-device*)
            if [ "$1" != "${1##--snd-device=}" ]; then
                SND_DEVICE=${1##--snd-device=}
            else
                SND_DEVICE=$2
                shift
            fi
	    ;;

	--snd-file*)
            if [ "$1" != "${1##--snd-file=}" ]; then
                SND_FILE=${1##--snd-file=}
            else
                SND_FILE=$2
                shift
            fi
	    ;;

	*)
	    REST="$REST $1"
	    ;;
    esac
    shift
done

[ "$ALLOW" = 'no' ] && exit 0

# Canonize given device path
DEVICE=`readlink -f "$DEVICE"`

# Don't try to eject with broken device
if [ "$EJECT" = "yes" ]; then
    [ -z "$DEVICE" -o ! -b "$DEVICE" ] && EJECT='no'
fi

function eject_disc()
{
    if [ "$EJECT" = "yes" ]; then
	[ "$1" = "open" ] && $TEST eject "$DEVICE"
	[ "$1" = "close" ] && $TEST eject -t "$DEVICE"
    fi
}

function save_sound()
{
    mkdir -p "$TEMP_DIR"
    echo "$1" > "$TEMP_DIR/$TEMP_FILE"
}

function find_wav()
{
    find "$PKGDATADIR" -iname "*.wav" -o -iname "*.au" -type f -o -type l | LC_ALL=C sort
}

function search_file_by_num()
{
    counter=$1
    find_wav | while read file; do
	[ "$counter" = 0 ] && {
	    echo "$file"
	    break
	}
	counter=$((counter-1))
    done
    unset counter
}

function search_file_by_name()
{
    flag='false'
    find_wav | while read file; do
	[ "$flag" = 'true' ] && {
	    echo "$file"
	    break
	}
	[ "$file" = "$1" ] && flag='true'
    done
    unset flag
}

function get_next_sound_rr()
{
    [ -f "$TEMP_DIR/$TEMP_FILE" ] && LAST_FILE=`cat "$TEMP_DIR/$TEMP_FILE"` || LAST_FILE=''

    file=`search_file_by_name "$LAST_FILE"`
    if [ -n "$file" -a -r "$file" ]; then
	echo "$file"
    else
	echo `find_wav | head -n1`
    fi

    unset file
    unset LAST_FILE
    unset FILES
}

function get_next_sound_rnd()
{
    count=`find_wav | wc -l`
    number=$((RANDOM*$count/32768))

    file=`search_file_by_num $number`
    if [ -n "$file" -a -r "$file" ]; then
	echo "$file"
    else
	echo `find_wav | head -n1`
    fi

    unset file
    unset number
    unset count
}

function play_and_save()
{
    $TEST $SND_PLAYER -D "$SND_DEVICE" $SND_OPTS "$1" || echo "Can't play sound file '$1'."
    save_sound "$1"
}

function play_sound()
{
    case $SCHEME in
	'RoundRobin')
	    file=`get_next_sound_rr`
	    [ -n "$file" ] && play_and_save "$file"
	    unset file
	    ;;
	'Random')
	    file=`get_next_sound_rnd`
	    [ -n "$file" ] && play_and_save "$file"
	    unset file
	    ;;
	'File')
	    [ -n "$SND_FILE" -a -r "$SND_FILE" ] && play_and_save "$SND_FILE"
	    ;;
	*)
	    echo "Unknown scheme '$SCHEME'!"
	    exit 1
	    ;;
    esac
}

KUKU=`/bin/date '+%l'`

while [ $KUKU -gt 0 ]; do
    eject_disc 'open'
    play_sound
    eject_disc 'close'
    KUKU=$((KUKU-1))
done
