# encoding: utf-8
require 'json'
###
# @author Dan Oberg <dan@cs1.com>
# @class Clock
###
class Clock
  ###
  # @method add_minute
  ###
  def self.add_minute
    if @min_track.length < 4
      @min_track << @current_que.shift
    elsif @five_min_track.length < 11
      @five_min_track << @current_que.shift
      reverse_track = @min_track.reverse
      @current_que.concat(reverse_track)
      @min_track = []
    elsif @hour_track.length < 11
      @hour_track << @current_que.shift
      reverse_track = @min_track.reverse
      @current_que.concat(reverse_track)
      @min_track = []
      reverse_five_min_track = @five_min_track.reverse
      @current_que.concat(reverse_five_min_track)
      @five_min_track = []
    else
      que_ball = @current_que.shift
      reverse_track = @min_track.reverse
      @current_que.concat(reverse_track)
      @min_track = []
      reverse_five_min_track = @five_min_track.reverse
      @current_que.concat(reverse_five_min_track)
      @five_min_track = []
      reverse_hour_track = @hour_track.reverse
      @current_que.concat(reverse_hour_track)
      @current_que << que_ball
      @hour_track = []
      @hours_passed += 12
      @cycle_days = @hours_passed / 24
      if @current_que == @start_order
        @repeat = true
      end
    end 
  end

  ###
  # @param [Fixnum, Fixnum] runs clock with number of balls and optionally a runtime.
  # @return [Json] json hash for min, five_min, hour and main queues. If no runtime
  #   is provided will calculate days tell que repeats.
  ###
  def self.run_ball_clock(balls, run_time)
    @min = []
    @five_min = []
    @hour = []
    @main = []
    @result = []
    @current_que = []
    @hours_passed = '0'.to_i
    @repeat = false
    min_left = run_time.to_i
    @start_order = Array.new(balls.to_i) { |i| i + 1 }
    @start_order.freeze
    @min_track = []
    @five_min_track = []
    @hour_track = []
    que_balls = @start_order.clone
    que_balls.each do |ball|
      @current_que << ball
    end
    if run_time.to_i == 0 || nil
      until @repeat == true
        add_minute
      end
      result = puts "Clock cycles in: #{@cycle_days} day\(s\)\."
    else
      until min_left == 0
        add_minute
        min_left -= 1
      end
      json_clock = { min: @min_track, fiveMin: @five_min_track, hour: @hour_track, main: @current_que}
      result = JSON.generate(json_clock)
    end
    result
  end
end