#!/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.


set -euo pipefail

xml_report_generation="$(dirname $0)/coverage.py"
xsl_report_formator="$(dirname $0)/coverage.xsl"

help () {
    echo "Usage: $0: [OPTION]... [LOGS_FILE]..."
    echo "Generate domain coverage report from aplogs."
    echo
    echo "Supported options:
  -h, --help            Display this help
  -d, --domains         The domain xml file
  -o, --ouput           Output the report to a file instead of stdout
  -e, --regexp          A regex to filter (egrep) logs in order to keep only the PFW log lines
  -f, --force           Force log parser to continue on ignorable errors
  -p, --parser_option   Options to apply to the log parser"
    echo
    echo 'FIXME: Having more than one dot (".") in aplog paths is not supported.'
    echo " - OK: log/aplog.12"
    echo " - KO: ../aplog.12"
}

# Default values
outputFile="-"
coverage_report_generator_ignorable_errors="\
--ignore-unknown-criterion \
--ignore-incoherent-criterion-state \
--ignore-ineligible-configuration-application"
coverage_report_generator_options=""

# Parse command line arguments
ARGS="$(getopt --options "hd:o:e:p:f" \
               --longoptions "help,domains:,ouput:,regexp:,parser_option:,force" \
               --name "$0" -- "$@" )"

eval set -- "$ARGS"


while true;
do
    case "$1" in
        -h|--help)
            shift
            help
            exit 0
            ;;
        -d|--domains)
            shift
            domainsFile="$1"
            shift
            ;;
        -o|--output)
            shift
            outputFile="$1"
            shift
            ;;
        -e|--regex)
            shift
            filterRegex="$1"
            shift
            ;;
        -p|--parser_option)
            shift
            coverage_report_generator_options+="$1 "
            shift
            ;;
        -f|--force)
            shift
            coverage_report_generator_options+="$coverage_report_generator_ignorable_errors "
            ;;
        --)
            shift
            break
            ;;
    esac
done

if ! test "${domainsFile:-}"
then
    echo "Please provide a xml domain file."
    exit 2
fi

if ! test "${filterRegex:-}"
then
    echo "Please provide a regex to filter log."
    echo "Other PFW instances log lines must not be matched by this regex."
    exit 3
fi

printf "%s\0" "$@" |
    # Sort aplogs in chronological order
    sort --key=2 --field-separator=. --numeric-sort --zero-terminated --reverse |
    # Filter log to leave only PFW log lines
    xargs --null grep --extended-regexp "$filterRegex" |
    # Generate the xml report
    $xml_report_generation --xml $coverage_report_generator_options "$domainsFile" |
    # Generate the html report
    xsltproc --output "$outputFile" $xsl_report_formator -