require 'aws-sdk'
require 'contracts'

module Audit53
  module EC2
    include Contracts

    Contract ({ region: String }) => Aws::EC2::Client
    def self.client(region:)
      Aws::EC2::Client.new region: region
    end

    Contract ({ region: String }) => ArrayOf[Aws::EC2::Types::Instance]
    def self.instances(region:)
      client(region: region).describe_instances.each_page
        .flat_map(&:reservations)
        .flat_map(&:instances)
    end

    Contract None => Hash
    def self.ips
      @ips ||= %w(us-east-1 us-west-1 us-west-2 eu-west-1)
                     .flat_map { |r| instances region: r }
                     .map { |i| { i.public_ip_address => i.instance_id } }
                     .reduce({}, :update)
    end
  end
end