#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

set -e

function die {
  echo "ERROR: $1" && exit 1;
}

TIMINGS=()
DELIM="::"

function __assert_task_name {
  [[ $1 != *"$DELIM"* ]] || die "timer task name '$1' name must not contain ::"
}

function __secs_to_readable_date {
  if [ "`uname`" == "Darwin" ]; then
    echo `date -r $1 +'%Y-%m-%d %H:%M:%S'`
  else
    echo `date -d @$1 +'%Y-%m-%d %H:%M:%S'`
  fi
}

function __secs_to_duration {
  i=$1
  ((sec=i%60, i/=60, min=i%60, hrs=i/60))
  echo $(printf "%d:%02d:%02d" $hrs $min $sec)
}

# Call start_timer "some timer name" to start a timer with that name
function start_timer {
  __assert_task_name "$1"
  local start=`date +%s`
  TIMINGS+=("${1}${DELIM}start=${start}")
  echo "===> Starting $1 at `__secs_to_readable_date $start`"
}

# Call end_timer "some timer name" to end a timer with that name
function end_timer {
  __assert_task_name $1
  local end=`date +%s`
  for ((i = 0; i < ${#TIMINGS[@]}; i++)); do
    value="${TIMINGS[$i]}"
    if [[ $value == "${1}${DELIM}start="* ]]; then
      local start=`echo $value | sed "s|${1}${DELIM}start=||g"`
    fi
  done

  [ -n "$start" ] || die "end_timer called for task '$1' before calling start_timer"

  set +e # expr returns status 1 if evalutes to 0
  duration=`expr $end - $start`
  RESP=$?
  set -e
  [[ $RESP < 2 ]] || die "Couldn't compute $end - $start"

  TIMINGS+=("${1}${DELIM}end=${end}")
  TIMINGS+=("${1}${DELIM}duration=${duration}")
  echo "===> Finished $1 at `__secs_to_readable_date $end` (`__secs_to_duration $duration`)"
}

# Prints a summary of all completed timers
function print_timer_summary {
  echo "===> Task duration summary for `caller | cut -d ' ' -f 2`"
  echo "==========================================================="
  for ((i = 0; i < ${#TIMINGS[@]}; i++)); do
    value="${TIMINGS[$i]}"
    if [[ $value == *"${DELIM}duration="* ]]; then
      key_value=`echo $value | sed "s|${DELIM}duration=|:|g"`
      task=`echo ${key_value} | cut -d ':' -f 1`
      seconds=`echo ${key_value} | cut -d ':' -f 2`
      echo -e "${task}\t`__secs_to_duration ${seconds}`"
    fi
  done
}

# Discover the platform that we are running on
function discover_platform {
  discover=`python -mplatform`
  if [[ $discover =~ ^.*centos.*$ ]]; then
    echo "centos"
  elif [[ $discover =~ ^.*Ubuntu.*$ ]]; then
    echo "ubuntu"
  elif [[ $discover =~ ^Darwin.*$ ]]; then
    echo "darwin"
  else
    mysterious=`echo $discover | awk -F- '{print $6}'`
    echo "$mysterious platform not supported"
    exit 1
  fi
}

# Check the ci environment is valid
function ci_environ {
  environ=$1
  if [[ $environ =~ travis ]]; then
    echo "travis"
  elif [[ $environ =~ applatix ]]; then
    echo "applatix"
  else
    echo "$environ ci not supported"
    exit 1
  fi
}

# Uncomment below to test changes:
#T="task one"
#start_timer "$T"
#sleep 1
#end_timer "$T"
#print_timer_summary
