require_relative "request_parser"

module Devops
  module API3
    module Parser
      class StackParser < RequestParser

        def create
          @body ||= create_object_from_json_body

          stack_attributes = @body.fetch('stack_attributes')
          check_string(stack_attributes['project'], "Parameter 'project' must be a not empty string")
          check_string(stack_attributes['environment'], "Parameter 'environment' must be a not empty string")
          check_string(stack_attributes['category'], "Parameter 'category' must be a not empty string")
          check_string(stack_attributes['name'], "Parameter 'name' must be a not empty string", true, false)
          list = check_array(stack_attributes['run_list'], "Parameter 'run_list' is invalid, it should be not empty array of strings", String, true, true)
          Validators::Helpers::RunList.new(list).validate! unless list.nil?
          @body
        end

        def run_list
          list = check_array(create_object_from_json_body(Array), "Body must contains not empty array of strings")
          Validators::Helpers::RunList.new(list).validate!
          list
        end

        def tags
          @body ||= create_object_from_json_body
          raise InvalidRecord.new("Request body should be an object") unless @body.is_a?(Hash)
          @body.each do |k, v|
            raise InvalidRecord.new("Invalid key '#{k}', it should be a String") unless k.is_a?(String)
            raise InvalidRecord.new("Invalid value '#{v}' for key '#{k}', it should be a String") unless v.is_a?(String)
          end
          @body
        end

        def deploy
          @body ||= create_object_from_json_body
          names = check_array(@body["names"], "Parameter 'names' should be a not empty array of strings", String, true)
          tags = check_array(@body["tags"], "Parameter 'tags' should be an array of strings", String, true)
          @body
        end

        def change_stack_template
          template_id = create_object_from_json_body['stack_template']
          check_string(template_id, "Parameter 'stack_template' must be a not empty string")
          template_id
        end

      end
    end
  end
end
