#!/bin/bash

if ! which jq >/dev/null 2>/dev/null; then
    omgilidgetchannels $@
    exit $?
fi

usage() {
    echo "Usage: ${0##*/} [-a | --all] [-d | --dchannels] [-b | --bchannels] [-j | --jobcontrol] [-m | --meta] [-q | --quiet] [-s | --channelnumber] [-v | --valid] [-c | --channelstring] [-?|--help]"
}

#defaults
ALL=0
DCHANNELS=0
BCHANNELS=0
JOBCONTROL=0
unset META
QUIET=0
unset CHANNEL

ORGARGS=$@
DLINES=0
BLINES=0
LINES=0
JJQSTRING1=""
JJQSTRING2=""
FILTER=" | select(.string_IlidType == \"TRUNK\")"

ILIDPARS=""

ARGS=$(getopt -o adbjmqs:c:vV? --long all,dchannels,bchannels,jobcontrol,meta,quiet,channelnumber,channelstring,valid,invalid,help -n "${0##*/}" -- "$@")
if [ $? != 0 ] ; then usage >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$ARGS"
while true ; do
    case "$1" in
        -a|--all) ALL=1
            shift 1
            ;;
        -d|--dchannels) DCHANNELS=1
            shift 1
            ;;
        -b|--bchannels) BCHANNELS=1
            shift 1
            ;;
        -j|--jobcontrol) JOBCONTROL=1
            shift 1
            ;;
        -m|--meta) META=1
            shift 1
            ;;
        -q|--quiet) QUIET=1
            shift 1
            ;;
        -s|--channelnumber) CHANNEL=$2
            ILIDPARS="${ILIDPARS} -s $CHANNEL"             
            shift 2
            ;;
        -c|--channelstring) CHANNEL=$2
            ILIDPARS="${ILIDPARS} -c $CHANNEL"             
            shift 2
            ;;
        -v|--valid) FILTER="${FILTER} | select(.bool_CfgValid == true)"
            shift 1
            ;;
        -V|--invalid) FILTER="${FILTER} | select(.bool_CfgValid == false)"
            shift 1
            ;;
        --help)
            usage
            exit
            ;;
        --) shift
            break
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done

if [ ! -z ${META} ]; then
    META="/0/0/nil"
fi

if [ "$JOBCONTROL" == "1" ] ; then
    JJQSTRING1=':if --channel_name=\"'
    JJQSTRING2='\"'
fi

if [ ! -z "$CHANNEL" ] ; then
    FILTER="${FILTER} | select(.string_IlidSlot == \"${CHANNEL}\")"
fi

DJQSTRING=".struct_Box.struct_DChannel[]${FILTER} | \"${JJQSTRING1}\" + .string_IlidSlot + \".\"  + .string_IlidIndex + \"/D/\" + .string_IlidType + \"/loop\" + \"${META}\" + \"${JJQSTRING2}\""
DLINES=$(omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r "${DJQSTRING}" 2>/dev/null | wc -l)

if [ "${DLINES}" != "0" ]; then
    BLINES=0
    for CHANNELS in $(omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r ".struct_Box.struct_DChannel[]${FILTER} | .ushort_UseChannels"); do
        let BLINES=$((BLINES+CHANNELS))
    done

    if [ "${ALL}" = "1" -o "${DCHANNELS}" = "1" ]; then
        if [ "${QUIET}" == 0 ] ; then
            omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r "${DJQSTRING}"
        fi
        LINES=$((LINES+DLINES))
    fi

    if [ "${ALL}" = "1" -o "${BCHANNELS}" = "1" ]; then
        if [ "${QUIET}" == 0 ] ; then
            for ILIDSLOT in $(omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r ".struct_Box.struct_DChannel[]${FILTER} | .string_IlidSlot"); do
                for ILIDINDEX in $(omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r ".struct_Box.struct_DChannel[]${FILTER} | select(.string_IlidSlot == \"${ILIDSLOT}\") | .string_IlidIndex"); do
                    FILTER2=" | select(.string_IlidSlot == \"${ILIDSLOT}\") | select(.string_IlidIndex == \"${ILIDINDEX}\")"
                    CHANNELS=$(omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r ".struct_Box.struct_DChannel[]${FILTER2} | .ushort_UseChannels")
                    for i in $(seq 1 ${CHANNELS}); do
                        BJQSTRING=".struct_Box.struct_DChannel[]${FILTER2} | \"${JJQSTRING1}\" + .string_IlidSlot + \".\"  + .string_IlidIndex + \"/B${i}/\" + .string_IlidType + \"/loop\" + \"${JJQSTRING2}\""
                        omgconfiginfo --json | iconv -f iso-8859-1 -t utf-8 | jq -r "${BJQSTRING}"
                    done
                done
            done
        fi
        LINES=$((LINES+BLINES))
    fi
fi

if [ -e /dev/ilid -a -x /usr/bin/omgilidgetchannels ] ; then
    /usr/bin/omgilidgetchannels ${ORGARGS} 2>&1 | grep -v "no line interfaces found" | sed '$d'
    ILIDDLINES=$(/usr/bin/omgilidgetchannels -q -d $ILIDPARS 2>/dev/null)
    ILIDBLINES=$(/usr/bin/omgilidgetchannels -q -b $ILIDPARS 2>/dev/null)
    DLINES=$((DLINES+ILIDDLINES))
    BLINES=$((BLINES+ILIDBLINES))
    if [ "${ALL}" = "1" -o "${DCHANNELS}" = "1" ]; then
        LINES=$((LINES+ILIDDLINES))
    fi
    if [ "${ALL}" = "1" -o "${BCHANNELS}" = "1" ]; then
        LINES=$((LINES+ILIDBLINES))
    fi
fi

if [ "${JOBCONTROL}" == "1" ] ; then
    echo ":if --channel_count=${LINES}"
else
    if [ "${QUIET}" == 1 ] ; then
        echo "${LINES}"
    else
        echo "${BLINES} B-Channels and ${DLINES} D-Channels found"
    fi
fi


