#!/bin/sh
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.

conf="`dirname $0`/query.conf"

query="https://bugzilla.mozilla.org/buglist.cgi?ctype=csv"

chart=0
and=0
while test "X$1" != "X"; do
    arg="$1"
    shift
    if test 0 != `expr "X$arg" : 'X--[^=]*\$'`; then
        # long option: --name val (without '=')
        name=`expr "X$arg" : 'X--\(.*\)'`
        val="$1"
        shift
    elif test 0 != `expr "X$arg" : 'X--[^=][^=]*='`; then
        # long option: --name=val
        name=`expr "X$arg" : 'X--\([^=]*\)'`
        val=`expr "X$arg" : 'X--[^=]*=\(.*\)'`
    elif test 0 != `expr "X$arg" : 'X-[a-zA-Z]\$'`; then
        # short option like -X foo (with space in between)
        name=`expr "X$arg" : 'X-\(.\)'`
        val="$1"
        shift
    elif test 0 != `expr "X$arg" : 'X-[a-zA-Z]='`; then
	# reject things like -X=foo
        echo "Unrecognized option $arg" 1>&2
        echo "Use -Xfoo or -X foo instead of -X=foo" 1>&2
        exit 1
    elif test 0 != `expr "X$arg" : 'X-[a-zA-Z]'`; then
        # short option like -Xfoo (without space)
        name=`expr "X$arg" : 'X-\(.\)'`
        val=`expr "X$arg" : 'X-.\(.*\)'`
    else
        name="default"
        val="$arg"
        #echo "Unrecognized option $arg" 1>&2
        #exit 1
    fi

    # plausibility check: val must not be empty, nor start with '-'
    if test "X$val" = "X"; then
        echo "No value found for '$name'!" 1>&2
        exit 1
    elif test 0 != `expr "X$val" : "X-"` && \
         test 0 = `expr "X$val" : "X---"`; then
        echo "Suspicious value for '$name': '$val' looks like an option!" 1>&2
        exit 1
    fi

    # find field and comparison type for option ${name}
    field=`grep "\"$name\"" "$conf" | awk '{printf $1}'`
    type=`grep "\"$name\"" "$conf" | awk '{printf $2}'`
    if test "X$field" = "X"  || test "X$type" = "X"; then
        if test "X$name" = "Xdefault"; then
            echo 1>&2 "Error: unexpected argument '$arg'"
            cat 1>&2 <<EOF
Use short options like -P1 or long options like  --priority=1 ,  
or enable the 'default' behaviour in the 'query.conf' file.
EOF
        else
            echo "Unknown field name '$name'." 1>&2
        fi
        exit 1
    fi

    # split val into comma-separated alternative values
    or=0
    while test "X$val" != "X"; do
        # val1 gets everything before the first comma; val gets the rest
        if test 0 != `expr "X$val" : 'X[^,]*,'`; then
            val1=`expr "X$val" : 'X\([^,]*\),'`
	    val=`expr "X$val" : 'X[^,]*,\(.*\)'`
        else
            val1="$val"
            val=""
        fi
        # append to query
        query="${query}&field${chart}-${and}-${or}=${field}"
        query="${query}&type${chart}-${and}-${or}=${type}"
        query="${query}&value${chart}-${and}-${or}=${val1}"
        #echo "----- ${name} : ${field} : ${type} : ${val1} -----" 1>&2
        or=`expr ${or} + 1`
    done
    chart=`expr ${chart} + 1`
done

echo "${query}"
