module Rubella
  module Weighting


    # The Rubella::Weighting object processes the given input data to an valid
    # output processable Array. 
    # These arrays contain a subarray for every unit of time. And these Array
    # contain the buckets within the values for the output objects.
    # The Weighting of the print intensitiy is done here, so that the output
    # objects job is simply to print the stuff.
    #
    class Base
      attr_reader :buckets
      # :steps

      # Constructor
      # Creates a new Rubella::Weighting::xy object.
      #
      # @param buckets int must be one of 1, 2, 5, 10, 20, 50 default is 10
      # @return Rubella::Weighting::Base
      # @raise ArgumentError
      #
      def initialize buckets = 10
        self.buckets = buckets
      end

      # Sets the buckets, if the value is valid
      #
      # @param buckets int The amount of buckets
      # @raise ArgumentError
      #
      def buckets= buckets
        # Must be divideable by 100
        if [1, 2, 5, 10, 20, 50].index(buckets) == nil
          raise ArgumentError.new "Amount of buckets must be 1, 2, 5, 10, 20 "+
            "or 50"
        end
        
        @steps   = 100/buckets
        @buckets = buckets
      end

      # Creates a output readable list.
      # This list is Array within a subarrays, which contain the buckets for
      # every time value unit.
      #
      # @param input Rubella::Input An input object
      # @return Rubella::Storage
      #
      def parse input
        raise NotImplementedError.new "Please override 'parse' in your "+
          "concrete implementation"
      end

    end

  end
end
