#!/bin/sh

set -xe

# depends on: awk, pactl, pacmd, notify-send

MAX_VOL=150
STEP=10

notify() {
    volume=$(get_vol_$TARGET)

    if is_muted_$TARGET; then
        s="Muted"
    else
        s="Volume"
    fi

    s=$(echo "${TARGET} ${s}" | sed 's/^\(.\)/\U\1/')

    notify-send "${s}" "${volume}%" \
        --app-name=volumesh \
        --hint=int:value:"$volume"

}

round() {
    awk '{
        print int($1/'$STEP')*'$STEP';
    }'
}

round_vol() {
    rounded=$(get_vol_$TARGET | round)
    newvol=$(min $MAX_VOL $rounded)
}

min() {
    printf '%i\n' ${@} | sort -n | head -n1
}

# Pulse{{{
get_vol_system() {
    pamixer --get-volume
}

is_muted_system() {
    pamixer --get-mute >/dev/null
}

change_vol_system() {
    pamixer "-$1" "$(min 120 $2)"
    round_vol
    pamixer --set-volume "${newvol}"
    if
        test -n "$VOLUME_CHANGE_SOUND"
    then
        paplay "$VOLUME_CHANGE_SOUND"
    fi
}

toggle_mute_system() {
    pactl set-sink-mute @DEFAULT_SINK@ toggle
}
#}}}
# Mpd {{{

get_vol_mpd() {
    env LC_ALL=C mpc vol |
        sed -e 's/^.*://g' -e 's/%.*$//g' -e 's/ //g'
}

is_muted_mpd() {
    env LC_ALL=C mpc status | grep '\[paused\]' 1>/dev/null
}
change_vol_mpd() {
    case $1 in
        d)
            op="-";;
        i)
            op="+";;
    esac
    mpc vol "${op}${2}" &>/dev/null
    round_vol
    mpc vol "${newvol}" &>/dev/null
}

toggle_mute_mpd() {
    mpc toggle
}
#}}}
usage() {
    local CNAME=$(basename $0)
    echo "${CNAME} [-m][-di <amount>]"
    echo "${CNAME} [-m][-t]"
    echo ""
    echo "Options:"
    echo "  -m --mpd          Target mpd instead of PulseAudio"
    echo "  -i --increase     <amount> of volume to increase"
    echo "  -d --decrease     <amount> of volume to decrease"
    echo "  -t --toggle       Mute/Unmute target"
    echo "  -h --help         Show This help message"

    exit "$1"
}
TARGET=system

while [ $# -gt 0 ]; do
    case $1 in
        -m | --mpd)
            TARGET=mpd
            shift
            ;;
        -i | --increase)
            shift
            change_vol_$TARGET i $1
            shift
            ;;
        -d | --decrease)
            shift
            change_vol_$TARGET d $1
            shift
            ;;
        -t | --toggle)
            toggle_mute_$TARGET
            shift
            ;;
        -h | --help)
            usage 0
            ;;
        *)
            usage 1
            ;;
    esac
done

notify

# vim: fdm=marker
