#!/bin/bash

# Copyright (c) 2011-2014, Intel Corporation
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. 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.
#
# 3. Neither the name of the copyright holder 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 COPYRIGHT HOLDER 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.


# This script generate an xml from a .pfw in an easy and fast way
# It only works if you have an parameter running with criterion compatible
# with the .pfw

set -eu -o pipefail

adbShell="adb shell"
parameterCommandAccess="eval remote-process localhost 5000"
parameter="$adbShell $parameterCommandAccess"

tmpfile="/tmp/pfw_commands"
target_tmpfile="/data/pfw_commands"


adbShellForward () {

    echo 'echo $?; exit' >> "$1"

    # Send commands
    adb push "$1" "$target_tmpfile"
    $adbShell chmod 700 "$target_tmpfile"

    $adbShell "$target_tmpfile" |
        # keep only the -2 line, the output of "echo $?"
        tee /dev/stderr | tail -2 | sed '1{s/\r//;q}' |
        # stop if $? != 0 (as of set -e)
        xargs test 0 -eq 2> /dev/null

}

function parameterExecute ()
{
    echo "   \$ $parameter $@"
    result="$($parameter $@ | sed 's/\r$//')"

    if [[ "$result" != "Done"* ]]; then
         echo "$result"
         return 2
    fi
    return 0
}

function log ()
{
    echo "$@" >&2
}

# Clean tmp file
echo > "${tmpfile}"

#################
# Configure PFW #
#################

echo "setTuningMode on" >> "${tmpfile}"
echo "setAutoSync off"  >> "${tmpfile}"


log "Delete routing domains"
for domain in $(parameterExecute listDomains |grep -io '^Routing.[^ ]*')
do
    log "Will delete domain $domain"
    echo "deleteDomain $domain" >> "${tmpfile}"
done

#########################
# Generate PFW commands #
#########################

log "Generate domain commands from file(s): $*"
m4 "$@" \
    | $(dirname $0)/PFWScriptGenerator.py --output-kind pfw  >> "${tmpfile}"


echo "setAutoSync off" >> "${tmpfile}"
echo "setTuningMode off" >> "${tmpfile}"

sed -i -e':a
      # look for line finishing with \
      /\\$/{
        # Delete the last char (\)
        s/\\$//;
        # Append the next line and delete the \n separator
        N;
        s/\n/ /;
        # Jump back to the expression beginning
        ta;
      };
      # delete empty lines;
      /^$/d
      # delete leading space
      s/^ *//
      # delete multiple spaces
      s/  */ /g;
      # Prefix each line with "$parameterCommandAccess
      '"s/^/$parameterCommandAccess /" \
  "${tmpfile}"

echo "set -xeu" > "${tmpfile}2"
cat "${tmpfile}" >> "${tmpfile}2"

log "Execute commands"
adbShellForward "${tmpfile}2"


#####################
# Generate xml file #
#####################

outputFilePath="domains.xml"

if test $# -ne 0
then
    # Output file is the input file with the xml extension
    outputFilePath="${1%.*}.xml"
    if test "$outputFilePath" == "$1"
    then
        # There is a conflict
        outputFilePath="${1}.xml"
    fi
fi

log "Output file: $outputFilePath"

parameter_execute_if_exist () {
    $parameter help | grep --quiet --word $1 || return $?
    $parameter $1 | sed 's/\r//'
}

parameter_execute_if_exist getDomainsWithSettingsXML > "$outputFilePath" ||
    # Fall back on old command
    parameter_execute_if_exist getDomainsXML > "$outputFilePath"


log "The media server PFW domains have been change, please restart it to restore old domains"