# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

import time


class Timer:
    '''A timer to keep track of how long jobs have been running

    This has a notion of start time (the time when the object was constructed),
    together with a time when the results should next be printed.

    '''

    print_interval = 5

    def __init__(self):
        self.start = time.monotonic()
        self.next_print = self.start + Timer.print_interval

    def period(self):
        '''Return the float time in seconds since start'''
        return time.monotonic() - self.start

    def hms(self):
        '''Get the time since start in hh:mm:ss'''
        period = self.period()
        secs = int(period + 0.5)
        mins = secs // 60
        hours = mins // 60
        return '{:02}:{:02}:{:02}'.format(hours, mins % 60, secs % 60)

    def check_time(self):
        '''Return true if we have passed next_print.

        If so, increment next_print by print_interval unless the result would
        be in the past, in which case set it to the current time plus
        print_interval.

        '''
        now = time.monotonic()
        if now < self.next_print:
            return False

        self.next_print += Timer.print_interval
        if self.next_print <= now:
            self.next_print = now + Timer.print_interval

        return True
