# encoding: utf-8

module LeapCli
  module Macro

    ##
    ## IPs
    ##

    #
    # returns a simple array of all the IPs for the specified node list
    #
    def host_ips(node_list)
      if self.vagrant?
        node_list = node_list['environment' => 'local']
      else
        node_list = node_list['environment' => '!local']
      end
      node_list.map {|name, n|
        [n.ip_address, (manager.facts[name]||{})['ec2_public_ipv4']]
      }.flatten.compact.uniq
    end

    ##
    ## HOSTS
    ##

    #
    # records the list of hosts that are encountered for this node
    #
    def hostnames(nodes)
      @referenced_nodes ||= Config::ObjectList.new
      nodes = listify(nodes)
      nodes.each_node do |node|
        @referenced_nodes[node.name] ||= node
      end
      return nodes.values.collect {|node| node.domain.name}
    end

    #
    # Generates entries needed for updating /etc/hosts on a node (as a hash).
    #
    # Argument `nodes` can be nil or a list of nodes. If nil, only include the
    # IPs of the other nodes this @node as has encountered (plus all mx nodes).
    #
    # Also, for virtual machines, we use the local address if this @node is in
    # the same location as the node in question.
    #
    # We include the ssh public key for each host, so that the hash can also
    # be used to generate the /etc/ssh/known_hosts
    #
    def hosts_file(nodes=nil)
      if nodes.nil?
        if @referenced_nodes && @referenced_nodes.any?
          nodes = @referenced_nodes
          nodes = nodes.merge(nodes_like_me[:services => 'mx'])  # all nodes always need to communicate with mx nodes.
        end
      end
      return {} unless nodes
      hosts = {}
      my_location = @node['location'] ? @node['location']['name'] : nil
      nodes.each_node do |node|
        hosts[node.name] = {
          'ip_address' => node.ip_address,
          'domain_internal' => node.domain.internal,
          'domain_full' => node.domain.full,
          'port' => node.ssh.port
        }
        if node.dns['aliases'] && node.dns['aliases'].any?
          # include aliases, but without domain.full
          hosts[node.name]['aliases'] = node.dns['aliases'] - [node.domain.full]
        end
        node_location = node['location'] ? node['location']['name'] : nil
        if my_location == node_location
          if facts = @node.manager.facts[node.name]
            if facts['ec2_public_ipv4']
              hosts[node.name]['ip_address'] = facts['ec2_public_ipv4']
            end
          end
        end
        host_pub_key   = Util::read_file([:node_ssh_pub_key,node.name])
        if host_pub_key
          hosts[node.name]['host_pub_key'] = host_pub_key
        end
      end
      hosts
    end

  end
end