#!/bin/bash
# Repository : https://github.com/cdown/mpdmenu


all_name='[ALL]'
mode=playlist

launcher='dmenu -x 300 -y 220 -w 800 -fn "Iosevka-11" -i -l 10'

d_artist() {
    mpc list artist | sort -f | $launcher -p artist "${dmenu_args[@]}"
}

d_album() {
    local artist="$1"
    local albums

    mapfile -t albums < <(mpc list album artist "$artist")
    if (( ${#albums[@]} > 1 )) ; then
        {
            printf '%s\n' "$all_name"
            printf '%s\n' "${albums[@]}" | sort -f
        } | $launcher -p album "${dmenu_args[@]}"
    else
        # We only have one album, so just use that.
        printf '%s\n' "${albums[0]}"
    fi
}

d_playlist() {
    # local format="%position% - %title% - %album% - %artist%"
    local format="%position% %artist% - %title%"
    local track

    track=$(mpc playlist -f "$format" | $launcher -p Playlist "${dmenu_args[@]}")
    printf '%s' "${track%% *}"
}

i=2

for arg do
    if [[ $arg == :: ]]; then
        dmenu_args=( "${@:$i}" )
        break
    fi

    case "$arg" in
        -l) mode=library ;;
        -p) mode=playlist ;;
    esac

    let i++
done

case "$mode" in
    library)
        artist=$(d_artist)
        [[ $artist ]] || exit 1

        album=$(d_album "$artist")
        [[ $album ]] || exit 2

        mpc clear
        if [[ $album == "$all_name" ]]; then
            mpc find artist "$artist" | sort | mpc add
        else
            mpc find artist "$artist" album "$album" | sort | mpc add
        fi

        mpc play >/dev/null 2>&1
    ;;
    playlist)
        mpc play "$(d_playlist)"
    ;;
esac
