#!/bin/bash

let "local_port_mask = 0xffffff"

mcid=0
npu=0
loc="A"

usage()
{
	echo "mcid_show_with_sysport.sh -i <ingress_mcid> -e <egress_mcid> -l <location>  -n <npu>"
}

while getopts  "e:i:l:n:h" OPTION
do
	case $OPTION in
	h)
		usage
		exit 0
		;;
	l)
		loc=$OPTARG
		;;
	n)
        npu=$OPTARG
		;;
	i)
        mcid=$OPTARG
        dir="ingress"
        port_string="UC_Queue"
		;;
	e)
        mcid=$OPTARG
        dir="egress"
        port_string="Local_Port"
		;;
	?)
		usage
		exit
		;;
	esac
done

display_func()
{
    for i in `seq $start_npu $npu`
    do
        local_to_sys_map=$(fia_driver_show -c "diag cosq local_to_sys " -u 0x$i -n A)
        local_to_sys_map+='
        Node ID:'

        fia_driver_show -c "diag multicast $dir $mcid members" -u 0x$i -n $loc | while read line;
        do
            node_start=$(echo $line | grep "Node ID:" -c)
            if [ $node_start -eq 1 ] ; then
                node=$(echo $line | awk '{print $3}')
                pat1=$(echo $line | sed 's|/|\\/|g')
                pat2="Node ID:"
                node_vals=$(echo "$local_to_sys_map" | sed -n "/$pat1/,/$pat2/p")
            fi
            local_port_line=$(echo "$line" | grep $port_string)
            if [[ ! -z "$local_port_line" ]] ; then
                local_port=$(echo $line | awk '{print $3}' | cut -dx -f2)
                local_port_dec=$(printf "%d" $((16#$local_port)))
                local_port_dec=$(( $local_port_dec & $local_port_mask ))
                sys_port=$(echo "$node_vals" | grep -v Node | grep -m 1 -w $local_port_dec | awk '{print $3}')
                line=$(echo $line | awk -F'|' '{printf "pp_port:%secap1:%secap2:%s\n", $2,$4,$5}')

                if [ -n "$sys_port" ] ; then
                    ifh=$(dpa_qosea_voq_show -v x -i 0x10 -n $loc -t n -p 0x0 2>/dev/null | awk '{print $1,$6}' | grep -m 1 $sys_port | cut -d' ' -f1)
                    line+="sysport: $sys_port interface: $ifh"
                fi

                echo "$node npu: $i $line" | sed 's/: /:/g'
            fi
        done
    done
}

if [ "$loc" == "all" ] ; then
    if [ "$npu" == "all" ] ; then
        loc_var=$(show_platform_sysdb | grep '0/[0-9]/CPU0' | cut -d' ' -f1 | cut -d'/' -f2)
        for loc_temp in $loc_var
        do
            start_npu=0
            total_npu=$(show_platform_sysdb | grep -c "$loc_temp/NPU")
            npu=$total_npu
            loc=$(( $loc_temp * 256 ))
            display_func
        done
        #for 1 RU boxes
        if [ -z "$loc_var" ] ; then
            start_npu=0
            total_npu=$(show_platform_sysdb | grep -c "NPU")
            npu=$total_npu
            loc=0
            display_func
        fi
    else
        loc="A"
        start_npu=$npu
        display_func
    fi
else
    if [ "$npu" == "all" ] ; then
        start_npu=0
        loc_var=$(( $loc / 256 ))
        total_npu=$(show_platform_sysdb | grep -c "$loc_var/NPU")
        npu=$total_npu
        if [ "$npu" -eq 0 ] ; then
            echo "No NPUs are present at the location... Exiting"
            exit 1
        fi
    else
        start_npu=$npu
    fi
    display_func
fi
