from ipaddress import ip_address, ip_interface


def get_a_records(metadata, internal=True, external=True):
    networks = metadata.get('network')

    if not internal:
        networks.pop('internal', None)

    if not external:
        networks.pop('external', None)

    return {
        'A': [
            str(ip_interface(network['ipv4']).ip)
                for network in networks.values()
                if 'ipv4' in network
        ],
        'AAAA': [
            str(ip_interface(network['ipv6']).ip)
                for network in networks.values()
                if 'ipv6' in network
        ],
    }


def get_all_ips(nodes):
    ips = set()

    for node in nodes:
        try:
            ip_address(node.hostname)
        except ValueError:
            pass
        else:
            ips.add(node.hostname)

        if node.has_bundle('network'):
            for network in node.metadata.get('network').values():
                if 'ipv4' in network:
                    ips.add(str(ip_interface(network['ipv4']).ip))
                if 'ipv6' in network:
                    ips.add(str(ip_interface(network['ipv6']).ip))

        if node.has_bundle('wireguard'):
            ips.add(str(ip_interface(node.metadata.get('wireguard/my_ip')).ip))

    return ips