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

