# Bash completion support for oggz.
# Conrad Parker, Aug 3 2008

# Copyright (C) 2008 Annodex Association
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# - Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# - Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# - Neither the name of the Annodex Association nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE ASSOCIATION OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

OGGZ_COMMANDS="chop codecs comment diff dump help info known-codecs merge rip scan sort validate"

__oggzcomp ()
{
    COMPREPLY=( $( compgen -W '$*' -- $cur ))

    return
}

__oggz_commands ()
{
    __oggzcomp $OGGZ_COMMANDS
}

__oggz_known_codecs ()
{
    local cur=$1

    cur_LOWERCASE=$(echo $cur | tr '[:upper:]' '[:lower:]')

    KNOWN=$(oggz-known-codecs)
    KNOWN_LOWERCASE=$(echo $KNOWN | tr '[:upper:]' '[:lower:]')

    # If the user has typed nothing, or lowercase, complete on lowercased
    # codec names
    if [ -z $cur -o $cur = $cur_LOWERCASE ] ; then
      __oggzcomp "$KNOWN_LOWERCASE"
    else
      __oggzcomp "$KNOWN"
    fi
}

# See http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
_oggz_filedir ()
{
    _filedir '@(ogx|ogv|oga|ogg|spx|anx|axv|axa)'
}

_oggz_ctype_cmd ()
{
    local cur="${COMP_WORDS[COMP_CWORD]}"
    local prev="${COMP_WORDS[COMP_CWORD-1]}"

    local command=$1

    case "$prev" in
    -c|--content-type)
        __oggz_known_codecs $cur
        return ;;
    esac

    case "$cur" in
    -*)
        __oggzcomp $($command -?)
        return ;;
    *)  _oggz_filedir
        return ;;
    esac
}

_oggz_basic_cmd ()
{
    local cur="${COMP_WORDS[COMP_CWORD]}"

    local command=$1

    case "$cur" in
    -*)
        __oggzcomp $($command -?)
        return ;;
    *)  _oggz_filedir
        return ;;
    esac
}

_oggz_chop ()
{
    _oggz_basic_cmd oggz-chop
}

_oggz_comment ()
{
    _oggz_ctype_cmd oggz-comment
}

_oggz_diff ()
{
    _oggz_ctype_cmd oggz-diff
}

_oggz_dump ()
{
    _oggz_ctype_cmd oggz-dump
}

_oggz_info ()
{
    _oggz_basic_cmd oggz-info
}

_oggz_known_codecs ()
{
    _oggz_basic_cmd oggz-known-codecs
}

_oggz_merge ()
{
    _oggz_basic_cmd oggz-merge
}

_oggz_rip ()
{
    _oggz_ctype_cmd oggz-rip
}

_oggz_scan ()
{
    _oggz_basic_cmd oggz-scan
}

_oggz_sort ()
{
    _oggz_basic_cmd oggz-sort
}

_oggz_validate ()
{
    _oggz_basic_cmd oggz-validate
}

_oggz_codecs ()
{
    _oggz_basic_cmd oggz-codecs
}

_oggz_help ()
{
    __oggz_commands
}

_oggz ()
{
    local cur="${COMP_WORDS[COMP_CWORD]}"
    local prev="${COMP_WORDS[COMP_CWORD-1]}"
    local i c=1 command

    while [ $c -lt $COMP_CWORD ]; do
        i="${COMP_WORDS[c]}"
        case "$i" in
        --version|--help) ;;
        *) command="$i"; break ;;
        esac
        c=$((++c))
    done

    if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
        case "${COMP_WORDS[COMP_CWORD]}" in
        --*) COMPREPLY=() ;;
        *) __oggz_commands ;;
        esac
        return
    fi

    case "$command" in
    chop)	_oggz_chop ;;
    comment)	_oggz_comment ;;
    diff)	_oggz_diff ;;
    dump)	_oggz_dump ;;
    help)	_oggz_help ;;
    info)	_oggz_info ;;
    known-codecs)	_oggz_known-codecs ;;
    merge)	_oggz_merge ;;
    rip)	_oggz_rip ;;
    scan)	_oggz_scan ;;
    sort)	_oggz_sort ;;
    validate)	_oggz_validate ;;
    codecs)	_oggz_codecs ;;
    *)		COMPREPLY=() ;;
    esac
}

# Completion for wrapper oggz tool
complete -o filenames -F _oggz oggz

# Completions for commands
complete -o filenames -F _oggz_chop oggz-chop
complete -o filenames -F _oggz_comment oggz-comment
complete -o filenames -F _oggz_diff oggz-diff
complete -o filenames -F _oggz_dump oggz-dump
complete -o filenames -F _oggz_info oggz-info
complete -o default -F _oggz_known-codecs oggz-known-codecs
complete -o filenames -F _oggz_merge oggz-merge
complete -o filenames -F _oggz_rip oggz-rip
complete -o filenames -F _oggz_scan oggz-scan
complete -o filenames -F _oggz_sort oggz-sort
complete -o filenames -F _oggz_validate oggz-validate
complete -o filenames -F _oggz_codecs oggz-codecs
