require 'whirled_peas/template/box_element'
require 'whirled_peas/template/container'
require 'whirled_peas/template/grid_element'
require 'whirled_peas/template/text_element'

require_relative 'box_painter'
require_relative 'canvas'
require_relative 'grid_painter'
require_relative 'text_painter'

module WhirledPeas
  module Graphics
    class Renderer
      PAINTERS = {
        Template::BoxElement => BoxPainter,
        Template::GridElement => GridPainter,
        Template::TextElement => TextPainter
      }
      def initialize(template, width, height)
        @template = template
        @width = width
        @height = height
      end

      def paint(&block)
        painter.paint(Canvas.new(0, 0, width, height, 0, 0), &block)
      end

      def painter
        build(template)
      end

      private

      attr_reader :template, :width, :height

      def build(element)
        unless PAINTERS.key?(element.class)
          raise ArgumentError, "Unable to render #{element.class}"
        end
        painter = PAINTERS[element.class].new(element, element.settings, element.name)
        if element.is_a?(Template::Container)
          element.each_child { |child| painter.add_child(build(child)) }
        end
        painter
      end
    end
  end
end