#!/bin/bash
# This file is meant to be SOURCED
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#

function track(){
# Tracks events by sending HTTP GET requests with query strings to a web server
# - First argument: event name
# - Rest of arguments (if they exist): tuples of operation-value-comment-tags
#   - operation: particular operation in an event (if it is not provided, the operation will be named after the event)
#   - value: particular value for an operation
#   - comment
#     - none will be passed when empty
#     - will be parsed to replace spaces by underscores
#   - tags
#     - none will be passed when empty
#     - will be parsed to replace spaces by ~

    if [ $# -lt 1 ]; then
        echo "Unexpected error in track function. At least 1 arg is expected: event"
        return 1
    fi

    osm_track_event_name=$1

    ctime=`date +%s`

    query_string=""
    query_string="${query_string}&installation_id=${OSM_TRACK_INSTALLATION_ID}"
    query_string="${query_string}&local_ts=${ctime}"
    query_string="${query_string}&event=${osm_track_event_name}"

    shift 1
    if [ $# -eq 0 ]; then
        operation="${osm_track_event_name}"
        value=""
        comment=""
        tags=""
        final_query_string="${query_string}"
        final_query_string="${final_query_string}&operation=${operation}"
        final_query_string="${final_query_string}&value=${value}"
        final_query_string="${final_query_string}&comment=${comment}"
        final_query_string="${final_query_string}&tags=${tags}"
        url="https://osm.etsi.org/InstallLog.php?${final_query_string}"
        echo "Track $osm_track_event_name $operation: ${url}"
        wget -q -O /dev/null $url
    else
        while (( "$#" > 0 )); do
            operation="${1:-${osm_track_event_name}}"
            shift 1
            value="${1:-}"
            value="${value// /_}"
            shift 1
            comment="${1:-}"
            comment="${comment// /_}"
            shift 1
            tags="${1:-}"
            tags="${tags//,/\~}"
            shift 1
            [ "$value" == "none" ] && value=""
            [ "$comment" == "none" ] && comment=""
            [ "$tags" == "none" ] && tags=""
            final_query_string="${query_string}"
            final_query_string="${final_query_string}&operation=${operation}"
            final_query_string="${final_query_string}&value=${value}"
            final_query_string="${final_query_string}&comment=${comment}"
            final_query_string="${final_query_string}&tags=${tags}"
            url="https://osm.etsi.org/InstallLog.php?${final_query_string}"
            echo "Track $osm_track_event_name $operation: ${url}"
            wget -q -O /dev/null $url
        done
    fi
    return 0
}


