# Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
#     http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.

require 'aws/base_client'
require 'aws/configured_xml_grammars'

module AWS
  class EC2
    class Client < BaseClient
      module XML

        include ConfiguredXmlGrammars

        BaseError = XmlGrammar.customize do
          element "Errors" do
            ignore
            element("Error") { ignore }
          end
        end

        define_configured_grammars

        CustomizedDescribeSecurityGroups = DescribeSecurityGroups.customize do
          element "securityGroupInfo" do
            element "item" do
              index(:security_group_index) { |i| i.group_id }

              element "ipPermissions" do
                list "item"
                element "item" do
                  element("ipProtocol") { symbol_value }
                  element("fromPort") { integer_value }
                  element("toPort") { integer_value }
                  element("groups") { list "item" }
                  element("ipRanges") { list "item" }
                end
              end
            end
          end
        end

        CustomizedDescribeInstances = DescribeInstances.customize do
          element "reservationSet" do
            element "item" do
              index :reservation_index do |r|
                r.instances_set.map { |i| i.instance_id }
              end

              element "instancesSet" do
                element "item" do
                  index(:instance_index) { |i| i.instance_id }
                end
              end
            end
          end
        end

        CustomizedDescribeImages = DescribeImages.customize do
          element "imagesSet" do
            element "item" do
              index(:image_index) { |i| i.image_id }
            end
          end
        end

        CustomizedDescribeVolumes = DescribeVolumes.customize do
          element "volumeSet" do
            element "item" do
              index(:volume_index) { |v| v.volume_id }
            end
          end
        end

        CustomizedDescribeSnapshots = DescribeSnapshots.customize do
          element "snapshotSet" do
            element "item" do
              index(:snapshot_index) { |s| s.snapshot_id }
            end
          end
        end

        CustomizedDescribeAddresses = DescribeAddresses.customize do
          element "addressesSet" do
            element "item" do
              index(:address_index) { |a| a.public_ip }
              element "instanceId" do
                force
              end
            end
          end
        end

        CustomizedDescribeKeyPairs = DescribeKeyPairs.customize do
          element "keySet" do
            element "item" do
              index(:key_index) { |k| k.key_name }
            end
          end
        end

        CustomizedDescribeTags = DescribeTags.customize do
          element "tagSet" do
            element "item" do
              element("resourceType") { force }
              element("resourceId") { force }
              element("key") { force }
              index(:tag_index) do |t|
                "#{t.resource_type}:#{t.resource_id}:#{t.key}"
              end
            end
          end
        end

      end

    end
  end
end