
class RoverTime

  attr_accessor :warp, :warpThresh
  
  def initialize
    @warp = false
    @warpAmount = 0
    @warpThresh = 2  # Warp only if sleep time is greater than threshold
  end
  
  def config(cObj)
    return unless cObj
    @warp = cObj.warpTime? if cObj.respond_to?(:warpTime?)
    @warpThresh = configObj.warpThresh if @warp && cObj.respond_to?(:warpThresh)
  end
  
  def rTime
    return (Time.new + @warpAmount)
  end
  
  def rSleep(seconds)
    unless(seconds) && (seconds.is_a?(Integer) || seconds.is_a?(Float))
      puts "RoverTime: rSleep requires an Integer or Float parameter"
      return 0
    end
    
    if (warp && seconds > @warpThresh)
      sleep(@warpThresh)
      @warpAmount += seconds - @warpThresh
    else
      sleep(seconds)
    end
  end
  
  def testMe(seconds=300) # 5 minutes
    return unless seconds

    oldWarp = @warp
    oldWarpAmount = @warpAmount
    @warp = true

    # Initial conditions
    puts "RoverTime: System time before warp:  " + Time.new.to_s
    puts "RoverTime: Sim time before warp:     " + rTime.to_s
    puts ""

    # Perform the warped time
    puts "RoverTime: simulating #{seconds} second sleep"
    puts ""
    seconds = @warpThresh + 10 if seconds < @warpThresh
    rSleep(seconds)

    # Spew results
    puts "RoverTime: System time after warp:  " + Time.new.to_s
    puts "RoverTime: Sim time after warp:     " + rTime.to_s
    puts "RoverTime: System time before warp: " + Time.new.to_s

    effect = @warpAmount - oldWarpAmount
    puts "RoverTime: System was warped #{effect} seconds"

    @warp = oldWarp
  end

end
