#!/usr/bin/env

import datetime, threading, thread

class CheckPerf:
    writelock = threading.Lock()
    def __init__(self):
        self.begintime = datetime.datetime.now()
        self.endtime = None
        self.mintime = 0.0
        self.maxtime = 0.0
        self.successcount = 0
        self.failedcount = 0
        self.totaltime = 0.0
        self.reportmsg = ''
        self.prechktime = None
        
    def startchk(self):
        self.begintime = datetime.datetime.now()
        self.endtime = None
        self.mintime = 99999999.0
        self.maxtime = 0.0
        self.checkcount = 0
        self.totaltime = 0.0
        self.reportmsg = ''
        self.prechktime = self.begintime
    
    def setchkpoint(self, success=True):
        self.endtime = datetime.datetime.now()
        delta = self.endtime - self.prechktime
        t = delta.seconds + delta.microseconds / 1000000.0
        if t < self.mintime: self.mintime = t
        if t > self.maxtime: self.maxtime = t
        if success:
            self.successcount += 1
        else:
            self.failedcount += 1
        self.totaltime += t
        self.prechktime = self.endtime
        
    def _output_file(self, out_file):
        handler = open(out_file, 'a+b')
        handler.write("thrd[%d]" % thread.get_ident())
        handler.write(' - ' + self.reportmsg + '\n')
        handler.close()
        
    def _reportToFile(self, out_file):
        CheckPerf.writelock.acquire()
        try:
            self._output_file(out_file)
            print "generate report file " , out_file
        except Exception, ex:
            print "generator report file ", out_file , " Error ", ex
        CheckPerf.writelock.release()
        
    def report_msg(self):
        totalcheckcount = self.successcount + self.failedcount
        if totalcheckcount > 2:
            avg = (self.totaltime - self.mintime - self.maxtime) / (totalcheckcount - 2)
        elif totalcheckcount == 0:
            rpt = "No check point has been set"
            return rpt
        else:
            avg = self.totaltime / totalcheckcount
        rpt = 'execute[%d]count cost(s) [%.4f]max[%.4f]min[%.4f]avg[%.4f] success[%d] failed[%d]' \
            % (totalcheckcount, self.totaltime, self.maxtime, self.mintime, avg, \
            self.successcount, self.failedcount)
        return rpt
        
    def report(self, out_file=None):
        self.reportmsg = self.report_msg()
        if out_file:
            self._reportToFile(out_file)
        return self.reportmsg
        
