_cdemu()
{
    local cur prev prev2 cword words opts cmds parms
    COMPREPLY=()
    _get_comp_words_by_ref cur prev cword words
    prev2="${words[cword - 2]}"

    opts="-h --help -v --version -b --bus"
    cmds="load unload status device-mapping daemon-debug-mask library-debug-mask dpm-emulation tr-emulation device-id enum-parsers enum-fragments enum-file-filters enum-daemon-debug-masks enum-library-debug-masks version"
    parms="--password --encoding --dvd-report-css"

    case "${prev}" in
        "load" | "unload" | "daemon-debug-mask" | "library-debug-mask" | "dpm-emulation" | "tr-emulation" | "device-id")
            local devices=$(cdemu status | tail -n +3 | cut -d ' ' -f 1)
            test "${prev}" = "load" && devices="${devices} any"
            test "${prev}" = "unload" && devices="${devices} all"
            COMPREPLY=( $(compgen -W "${devices}" -- ${cur}) )
            return 0
            ;;
        "-b" | "--bus")
            local busses="session system"
            COMPREPLY=( $(compgen -W "${busses}" -- ${cur}) )
            return 0
            ;;
        "--encoding")
            local encodings=$(iconv --list | sed -e 's/\/\/$//')
            COMPREPLY=( $(compgen -W "${encodings}" -- ${cur}) )
            return 0
            ;;
        "--dvd-report-css")
            local value="true false"
            COMPREPLY=( $(compgen -W "${value}" -- ${cur}) )
            return 0
            ;;
    esac

    case "${prev2}" in
        "load")
            _filedir
            return 0
            ;;
    esac

    for word in ${words[@]}; do
        if [ "${word}" = "load" ]; then
            COMPREPLY=( $(compgen -W "${parms}" -- ${cur}) )
            return 0
        fi
    done

    COMPREPLY=( $(compgen -W "${opts} ${cmds}" -- ${cur}) )
    return 0
}
complete -F _cdemu cdemu

