#!/bin/bash
#
# set -u



source /usr/share/Landscape/LandscapeCore/bin/get_values
export PATH="$PATH:$LandscapeIn/bin"

set +u

buildALL=( "AY" "KVM" )
buildSpecific=( "" )

theGROUP="all"
theSYSTEM="all"
# TODO: nodeNr/node currently does not work -> use system name (VM) instead?
# TODO: should we name the "group" "GROUP" or "OWNER" ?
while [ $# -gt 0 ]; do
    case "$1" in
        --LandscapeSUSE_MEDIA )
                     LandscapeSUSE_MEDIA="$2"
                     shift
                     ;;
        --kvm )
                     buildALL=( "" )
                     buildSpecific="${buildSpecific[@]} KVM"
                     ;;

        --ay )
                     buildALL=( "" )
                     buildSpecific="${buildSpecific[@]} AY"
                     ;;
        --group=* ) theGROUP=${1#--group=}
                   ;;
#        --nodeNr=* ) nodeNr=${1#--nodeNr=}
#                   ;;
        --system=* ) theSYSTEM=${1#--system=}
                   ;;
    esac
    shift
done

function getTheNetworkMaskFromNetworkDefinition()
{
    # input switch network-definition
    # output netmask (TODO: in /X)
    local switch="$1"
    local network="$2"
    local netKV nKey nValue
    for netKV in ${network}; do
        nKey="${netKV%=*}"; nKey=${nKey^^}
        nValue=${netKV#*=}
        local NET_$nKey=$nValue
    done
    if [ $NET_NAME = "$switch" ]; then
        echo $NET_MASK
    fi
}

function getNetworkMask()
{
    # input switch-name
    # output netmask (TODO: in /X)
    local switch="$1"
    local network=""
    for network in "${LandscapeNetworks[@]}"; do
        getTheNetworkMaskFromNetworkDefinition "$switch" "$network"
    done
}

function getOneInterface()
{
    local system="$1" interface="$2"
    local ifKV iKey iValue
    local IF_MASK=""
    local ifVar=""
    for ifKV in ${interface}; do
        iKey="${ifKV%=*}"; iKey=${iKey^^}
        iValue=${ifKV#*=}
        local IF_$iKey=$iValue
    done
    if [ "$IF_SYSTEM" = "$system" ]; then
        if [ -z "$IF_MASK" ]; then
            IF_MASK=$(getNetworkMask "$IF_SWITCH")
        fi
        for ifVar in ${!IF_*}; do
            printf "%s=%s " $ifVar ${!ifVar}
        done
    fi
}

function getInterfaces()
{
     local system="$1" number="$2"
     local interface=""
     local count=1
     local filteredInterface=""
     for interface in "${LandscapeInterfaces[@]}"; do
         filteredInterface=$(getOneInterface "$system" "$interface")
         if [ -n "$filteredInterface" ]; then
             if [ "$number" -eq "$count" ]; then
                 echo "$filteredInterface"
             fi
             (( count++ ))
         fi
     done
}

function createOneSystem()
{
    local SYSTEM_MEM="" SYSTEM_CPU="" SYSTEM_AY_TEMPLATE="" SYSTEM_KVM_TEMPLATE=""
    local interface=""
    local ifList=""
    for systemKV in ${system}; do
        # name=xxxx  ===> export NET_NAME=xxxx
        cmd=$(awk -F= '{ printf( "export NET_%s=%s\n",toupper($1),$2) }' <<< $systemKV)
        sKey="${systemKV%=*}"; sKey=${sKey^^}
        sValue=${systemKV#*=}
        #echo "cmd: $cmd"
        #echo "Key: $sKey, Value: $sValue"
        #set $sKey=$Value
        local SYSTEM_$sKey=$sValue
    done
    #echo SYSTEM_STAR: ${!SYSTEM_*}
    # NETWORK0 comes directly from the SYSTEM table
    #
    # NETWORK 1
    #    SYSTEM_IFx SYSTEM_IPx SYSTEM_MACx SYSTEM_SWITCHx SYSTEM_NETMASKx
    #
    ifList=$(getInterfaces $SYSTEM_SYSTEM 1)
    eval $ifList
    SYSTEM_IF1=$IF_IF; SYSTEM_IP1=$IF_IP; SYSTEM_MAC1=$IF_MAC; SYSTEM_SWITCH1=$IF_SWITCH; SYSTEM_NETMASK1=$IF_MASK SYSTEM_BRIDGE1=$IF_BRIDGE
    SYSTEM_SWITCH1="${SYSTEM_SWITCH1:-${LandscapeDefaultSwitch1}}"
    unset ${!IF_*}
    #
    # NETWORK 2
    #    SYSTEM_IFx SYSTEM_IPx SYSTEM_MACx SYSTEM_SWITCHx SYSTEM_NETMASKx
    #
    ifList=$(getInterfaces $SYSTEM_SYSTEM 2)
    eval $ifList
    SYSTEM_IF2=$IF_IF; SYSTEM_IP2=$IF_IP; SYSTEM_MAC2=$IF_MAC; SYSTEM_SWITCH2=$IF_SWITCH; SYSTEM_NETMASK2=$IF_MASK SYSTEM_BRIDGE2=$IF_BRIDGE
    SYSTEM_SWITCH2="${SYSTEM_SWITCH2:-${LandscapeDefaultSwitch2}}"
    unset ${!IF_*}
    #
    # NETWORK 3
    #    SYSTEM_IFx SYSTEM_IPx SYSTEM_MACx SYSTEM_SWITCHx SYSTEM_NETMASKx
    #
    ifList=$(getInterfaces $SYSTEM_SYSTEM 3)
    eval $ifList
    SYSTEM_IF3=$IF_IF; SYSTEM_IP3=$IF_IP; SYSTEM_MAC3=$IF_MAC; SYSTEM_SWITCH3=$IF_SWITCH; SYSTEM_NETMASK3=$IF_MASK SYSTEM_BRIDGE3=$IF_BRIDGE
    SYSTEM_SWITCH3="${SYSTEM_SWITCH3:-${LandscapeDefaultSwitch3}}"
    unset ${!IF_*}


    #
    # GET DISK INFO
    #
    ### createDisks --list SYSTEM
    #
    local -a SYSTEM_DISKS=( $(createDisks --list $SYSTEM_SYSTEM) )
    create=0
    if [ $theGROUP = "all" -a $theSYSTEM = "all" ]; then
        create=1;
    elif [ $theGROUP = "$SYSTEM_OWNER" -a $theSYSTEM = "all" ]; then
        create=1;
    elif [ $theGROUP = "all" -a $theSYSTEM = "$SYSTEM_SYSTEM" ]; then
        create=1;
    elif [ $theGROUP = "$SYSTEM_OWNER" -a $theSYSTEM = "$SYSTEM_SYSTEM" ]; then
        create=1;
    fi

    if [ $create -eq 1 ]; then
        echo "$system"
        UUID=$(uuidgen)
        #
        # figure out memory
        #
        if [ -z "$SYSTEM_MEM" ]; then
            ptr="LandscapeMemory_$SYSTEM_TYPE"
            if [ -n "${!ptr}" ]; then
                SYSTEM_MEM=${!ptr}
            else
                SYSTEM_MEM=${LandscapeMemory}
            fi
        fi
        #
        # figure out cpus
        #
        if [ -z "$SYSTEM_CPU" ]; then
            ptr="LandscapeCPU_$SYSTEM_TYPE"
            if [ -n "${!ptr}" ]; then
                SYSTEM_CPU=${!ptr}
            else
                SYSTEM_CPU=${LandscapeCPU}
            fi
        fi
        #
        # figure out ay template
        #
        if [ -z "$SYSTEM_AY_TEMPLATE" ]; then
            ptr="LandscapeAYInFile_$SYSTEM_TYPE"
            if [ -n "${!ptr}" ]; then
                 SYSTEM_AY_TEMPLATE=${!ptr}
            else
                 SYSTEM_AY_TEMPLATE=$LandscapeAYInFile
            fi
        fi
        #
        # figure out kvm template
        #
        if [ -z "$SYSTEM_KVM_TEMPLATE" ]; then
            ptr="LandscapeKVMInFile_$SYSTEM_TYPE"
            if [ -n "${!ptr}" ]; then
                 SYSTEM_KVM_TEMPLATE=${!ptr}
            else
                 SYSTEM_KVM_TEMPLATE=$LandscapeKVMInFile
            fi
        fi
        #
        # figure out system title
        #
        if [ -z "$SYSTEM_TITLE" ]; then
            ptr="LandscapeTitle_$SYSTEM_TYPE"
            if [ -n "${!ptr}" ]; then
                 SYSTEM_TITLE=${!ptr}
            else
                 SYSTEM_TITLE=$LandscapeTitle
            fi
        fi
        # now post processing system title for place holders
        SYSTEM_TITLE_STR=$(echo $SYSTEM_TITLE | sed  \
                        -e "s|@@SYSTEM_NAME@@|$SYSTEM_SYSTEM|g"\
                        -e "s|@@LandscapeSLES@@|$LandscapeSLES|g"
                      )
        echo "SYSTEM_TITLE_STR=$SYSTEM_TITLE_STR"
 
        for build in ${buildALL[@]} ${buildSpecific[@]}; do
            case "$build" in
                AY )
                     inFile="$LandscapeAYInDirectory/$SYSTEM_AY_TEMPLATE"
                     outFile="$LandscapeAYDirectory/$SYSTEM_SYSTEM-ay.xml"
                    ;;
                KVM )
                     inFile="$LandscapeKVMInDirectory/$SYSTEM_KVM_TEMPLATE"
                     outFile="$LandscapeKVMDirectory/$SYSTEM_SYSTEM-kvm.xml"
                    ;;
            esac
            echo "$inFile -> $outFile"
            sed -e "s|@@HOST@@|$SYSTEM_SYSTEM|g"\
               -e "s|@@TITLE@@|$SYSTEM_TITLE_STR|g"\
               -e "s|@@DESCRIPTION@@|$SYSTEM_DESCRIPTION|g"\
               -e "s|@@VMDISKS@@|$LandscapeVMDiskDirectory|g"\
               -e "s|@@SUSE_MEDIA@@|$LandscapeSUSE_MEDIA|g"\
               -e "s|@@DOMAIN@@|$LandscapeDOMAIN|g"\
               -e "s|@@GATEWAY@@|$LandscapeGATEWAY|g"\
               -e "s|@@NETMASK@@|$LandscapeNETMASK|g"\
               -e "s|@@NETMASK1@@|$SYSTEM_NETMASK1|g"\
               -e "s|@@NETMASK2@@|$SYSTEM_NETMASK2|g"\
               -e "s|@@NETMASK3@@|$SYSTEM_NETMASK3|g"\
               -e "s|@@NFSSERVER@@|$LandscapeNFSSERVER|g"\
               -e "s|@@NAMESERVER@@|$LandscapeNAMESERVER|g"\
               -e "s|@@LANDSCAPEROOT@@|$LandscapeRoot|g"\
               -e "s|@@LANDSCAPESMTSERVER@@|$LandscapeSMTServer|g"\
               -e "s|@@LANDSCAPESMTFINGERPRINT@@|$LandscapeSMTFingerPrint|g"\
               -e "s|@@LANDSCAPEUSECASE@@|$LandscapeUseCase|g"\
               -e "s|@@NETDEVICE@@|$SYSTEM_IF|g"\
               -e "s|@@NETDEVICE1@@|$SYSTEM_IF1|g"\
               -e "s|@@NETDEVICE2@@|$SYSTEM_IF2|g"\
               -e "s|@@NETDEVICE3@@|$SYSTEM_IF3|g"\
               -e "s|@@IPADDR@@|$SYSTEM_IP|g"\
               -e "s|@@IPADDR1@@|$SYSTEM_IP1|g"\
               -e "s|@@IPADDR2@@|$SYSTEM_IP2|g"\
               -e "s|@@IPADDR3@@|$SYSTEM_IP3|g"\
               -e "s|@@MACADDR@@|$SYSTEM_MAC|g"\
               -e "s|@@MACADDR1@@|$SYSTEM_MAC1|g"\
               -e "s|@@MACADDR2@@|$SYSTEM_MAC2|g"\
               -e "s|@@MACADDR3@@|$SYSTEM_MAC3|g"\
               -e "s|@@UUID@@|$UUID|g"\
               -e "s|@@GROUPNR@@|$SYSTEM_OWNER|g"\
               -e "s|@@MEM@@|$SYSTEM_MEM|g"\
               -e "s|@@CPU@@|$SYSTEM_CPU|g"\
               -e "s|@@SWITCH@@|$LandscapeDefaultSwitch|g"\
               -e "s|@@SWITCH1@@|$SYSTEM_SWITCH1|g"\
               -e "s|@@SWITCH2@@|$SYSTEM_SWITCH2|g"\
               -e "s|@@SWITCH3@@|$SYSTEM_SWITCH3|g"\
               -e "s|@@BRIDGE@@|$SYSTEM_BRIDGE|g"\
               -e "s|@@BRIDGE1@@|$SYSTEM_BRIDGE1|g"\
               -e "s|@@BRIDGE2@@|$SYSTEM_BRIDGE2|g"\
               -e "s|@@BRIDGE3@@|$SYSTEM_BRIDGE3|g"\
               -e "s|@@DISK@@|${SYSTEM_DISKS[0]}|g"\
               -e "s|@@DISK1@@|${SYSTEM_DISKS[1]}|g"\
               -e "s|@@DISK2@@|${SYSTEM_DISKS[2]}|g"\
               -e "s|@@DISK3@@|${SYSTEM_DISKS[3]}|g"\
               -e "s|@@DISK4@@|${SYSTEM_DISKS[4]}|g"\
               -e "s|@@DISK5@@|${SYSTEM_DISKS[5]}|g"\
               -e "s|@@DISK6@@|${SYSTEM_DISKS[6]}|g"\
               -e "s|@@DISK7@@|${SYSTEM_DISKS[7]}|g"\
               -e "s|@@DISKTYPE@@|${SYSTEM_DISKS[0]##*.}|g"\
               -e "s|@@DISKTYPE1@@|${SYSTEM_DISKS[1]##*.}|g"\
               -e "s|@@DISKTYPE2@@|${SYSTEM_DISKS[2]##*.}|g"\
               -e "s|@@DISKTYPE3@@|${SYSTEM_DISKS[3]##*.}|g"\
               -e "s|@@DISKTYPE4@@|${SYSTEM_DISKS[4]##*.}|g"\
               -e "s|@@DISKTYPE5@@|${SYSTEM_DISKS[5]##*.}|g"\
               -e "s|@@DISKTYPE6@@|${SYSTEM_DISKS[6]##*.}|g"\
               -e "s|@@DISKTYPE7@@|${SYSTEM_DISKS[7]##*.}|g"\
               $inFile >$outFile
        done
    fi
}

for system in "${LandscapeSystems[@]}"
do
    createOneSystem "$system"
done
