# -*- coding: utf-8 -*-
import time
from six.moves import queue


class Timer(object):
    def __init__(self, now_ts, is_once, interval, callback, *args, **kwargs):
        self.interval = interval
        self.callback = callback
        self.is_once = is_once
        self.args = args
        self.kwargs = kwargs
        self.next_run_ts = now_ts + interval

    def __lt__(self, other):
        return self.next_run_ts < other.next_run_ts

    def run(self):
        self.callback(*self.args, **self.kwargs)
        self.next_run_ts += self.interval


class TimerManager(object):
    def __init__(self):
        self.timers = queue.PriorityQueue()

    def add_timer(self, is_once, interval, callback, *args, **kwargs):
        t = Timer(time.time(), is_once, interval, callback, *args, **kwargs)
        self.timers.put(t)

    def check_timer(self):
        now_ts = time.time()
        readd = []
        while not self.timers.empty():
            t = self.timers.queue[0]
            if now_ts < t.next_run_ts:
                break
            self.timers.get()
            t.run()
            if not t.is_once:
                readd.append(t)
        for t in readd:
            self.timers.put(t)