module Apipie
  class RoutesFormatter
    API_METHODS = %w{GET POST PUT PATCH OPTIONS DELETE}.freeze

    # The entry method called by Apipie to extract the array
    # representing the api dsl from the routes definition.
    def format_routes(rails_routes, args)
      rails_routes.map { |rails_route| format_route(rails_route, args) }
    end

    def format_route(rails_route, args)
      { :path => format_path(rails_route),
        :verb => format_verb(rails_route),
        :desc => args[:desc],
        :options => args[:options] }
    end

    def format_path(rails_route)
      File.join(rails_route.base_url, rails_route.path.spec.to_s.gsub('(.:format)', ''))
    end

    def format_verb(rails_route)
      verb = API_METHODS.select{|defined_verb| defined_verb =~ /\A#{rails_route.verb}\z/}
      if verb.count != 1
        verb = API_METHODS.select{|defined_verb| defined_verb == rails_route.constraints[:method]}
        if verb.blank?
          raise "Unknown verb #{rails_route.path.spec.to_s}"
        end
      end
      verb.first
    end
  end
end
