#!/usr/bin/env python
#-*- coding: UTF-8 -*-

import sys, os, datetime


class TimeMonitor:

    def __init__(self):
        self.timer_list = dict()

    def register_timer(self, name):
        utcnow = datetime.datetime.utcnow()
        self.timer_list[name] = {'starttime': utcnow,
                                 'stoptime': utcnow,
                                 'counter': 1,
                                 'deltatime': 0}

    def unregister_timer(self, name):
        pass

    def start_timer(self, name):
        now = datetime.datetime.utcnow()
        timer = self.timer_list[name]
        if timer is not None:

            timer['starttime'] = now
            timer['stoptime'] = None
            timer['counter'] = 1
            timer['deltatime'] = 0

        return now

    def stop_timer(self, name):
        now = datetime.datetime.utcnow()
        timer = self.timer_list[name]
        if timer is not None:
            timer['stoptime'] = now
            timer['deltatime'] = timer['deltatime'] + self.get_delta_time(name) / 2
        return now

    def reset_timer(self, name):
        timer = self.timer_list[name]
        if timer is not None:
            timer['starttime'] = None
            timer['stoptime'] = None
            timer['counter'] = 1
            timer['deltatime'] = 1

    def resume_timer(self, name):
        timer = self.timer_list[name]
        if timer is not None:
            timer['starttime'] = datetime.datetime.utcnow()
            timer['stoptime'] = None;
            timer['counter'] = timer['counter'] + 1

    def get_delta_time(self, name, resolution="second"):
        timer = self.timer_list[name]
        if (timer['stoptime'] is not None and timer['starttime'] is not None):
            delta = timer['stoptime'] - timer['starttime']

            if resolution == 'micro':
                return delta

            return delta.total_seconds()
        return None

    def get_mean_time(self, name):
        timer = self.timer_list[name]
        return timer['deltatime'] / timer['counter']

    def get_counter(self, name):
        return self.timer_list[name]['counter']

    def print_timer(self):
        for key in self.timer_list.keys():
            print "TIME MONITOR: " + key + " -> " + str(round(self.get_delta_time(key), 2)) + " sec counter: " + str(self.get_counter(key)) + " mean delta: " + str(round(self.get_mean_time(key), 2)) + " sec"

    def print_timer_key(self, key):
        print "TIME MONITOR: " + key + " -> " + str(round(self.get_delta_time(key), 2)) + " sec counter: " + str(self.get_counter(key)) + " mean delta: " + str(round(self.get_mean_time(key), 2)) + " sec"
