# The Timer module allows timers to be set
module Timer
  
  # Timer class models a normal timer
  class Timer
    # Start time in ticks since Eruta engine start
    attr_reader :start
    # Delay of timer
    attr_reader :delay
    # Total time timer was running
    attr_reader :total
    # Current cycle start
    attr_reader :cycle_start
    # Current cycle stop
    attr_reader :cycle_stop
        
    # Initializes the timer.
    def initialize(delay, &to_call)
      @to_call      = to_call
      @delay        = delay
      @start        = Eruta.time
      @cycle_start  = @start
      @cycle_stop   = @cycle_start + delay
      @total        = 0
      @done         = false
    end
    
    # Updates the timer.
    def update()
      now      = Eruta.time
      @total   = now - @start
      if now  >= @cycle_stop
        @done  = @to_call.call(self)
        if !@done
          @cycle_start  = Eruta.time
          @cycle_stop   = @cycle_start + @delay
        end
      end
      return @done
    end
    
    # Checks if timer is done.
    def done?
      return @done
    end
    
    # Forces timer to done.
    def done!
      @done = true
    end
  end
  
  
  # Makes a new timer
  # If the callback terurns true, the timer will not be 
  # called again. If false it will be called again.
  def self.make(delay, &callback)
    @timers ||= []    
    timer = ::Timer::Timer.new(delay, &callback)
    @timers << timer
    return timer
  end
  
  # Updates all timers
  def self.update
    @timers ||= []
    done_timers = []
    @timers.each do | timer |
      if timer.update
        done_timers << timer
      end
    end
        
    done_timers.each do | timer |
      @timers.delete(timer)
    end
  end
end