require_relative './point'
require_relative './line'
require_relative './polygon'
require_relative './style'
require_relative '../definition'

module Carto::Styles
  class Geometry < Style
    def initialize
      super(nil)
    end

    def self.accepted_geometry_types
      ['geometry', 'st_geometry']
    end

    NAMES_CLASSES_MAP = {
      "layer['mapnik::geometry_type'=1]" => Carto::Styles::Point,
      "layer['mapnik::geometry_type'=2]" => Carto::Styles::Line,
      "layer['mapnik::geometry_type'=3]" => Carto::Styles::Polygon
    }.freeze

    def to_cartocss
      cartocss_classes = NAMES_CLASSES_MAP.keys.map do |class_name|
        cartocss_array = NAMES_CLASSES_MAP[class_name].new.to_cartocss_array
        Carto::Styles::Presenters::CartoCSS.new(cartocss_array: cartocss_array,
                                                class_name: class_name)
                                           .to_s
      end

      cartocss_classes.join("\n")
    end

    def default_definition
      definition_instance = Carto::Definition.instance
      definition = definition_instance
                   .load_from_file(CARTOGRAPHY_DEFINITION_LOCATION)

      definition[:simple][:point]
    end
  end
end
