class Chef
  class Recipe
    def postgresql_primary
      postgresql_primary = search(:node, "role:postgresql_primary AND chef_environment:#{node.chef_environment}").first

      unless postgresql_primary.nil?
        primary_ip = ip_for(postgresql_primary)

        { hostname: postgresql_primary[:hostname], ipaddress: primary_ip }
      end
    end

    def postgresql_replicas
      postgresql_replicas = []

      search(:node, "role:postgresql_replica AND chef_environment:#{node.chef_environment}").each do |replica|
        replica_ip = ip_for(replica)

        postgresql_replicas << { hostname: replica[:hostname], ipaddress: replica_ip }
      end

      postgresql_replicas
    end

    def ip_for(server_node)
      if node.chef_environment == "development"
        server_node['network']['interfaces']['eth1']['routes'].first['src']
      else
        # If the server has a private Zerotier IP, use it
        if server_node['knife_zero'] && server_node['knife_zero']['host'] && \
            server_node['knife_zero']['host'].start_with?("10.1.1.")
          server_node['knife_zero']['host']
        else
          server_node['ipaddress']
        end
      end
    end

    def postgresql_service_name
      postgresql_version = "12"

      "postgresql@#{postgresql_version}-main"
    end
  end
end
