import ipaddress
import RNS.vendor.ifaddr
import socket

from typing import List

AF_INET6 = socket.AF_INET6.value
AF_INET = socket.AF_INET.value

def interfaces() -> List[str]:
    adapters = RNS.vendor.ifaddr.get_adapters(include_unconfigured=True)
    return [a.name for a in adapters]

def ifaddresses(ifname) -> dict:
    adapters = RNS.vendor.ifaddr.get_adapters(include_unconfigured=True)
    ifa = {}
    for a in adapters:
        if a.name == ifname:
            ipv4s = []
            ipv6s = []
            for ip in a.ips:
                t = {}
                if ip.is_IPv4:
                    net = ipaddress.ip_network(str(ip.ip)+"/"+str(ip.network_prefix), strict=False)
                    t["addr"] = ip.ip
                    t["prefix"] = ip.network_prefix
                    t["broadcast"] = str(net.broadcast_address)
                    ipv4s.append(t)
                if ip.is_IPv6:
                    t["addr"] = ip.ip[0]
                    ipv6s.append(t)

            if len(ipv4s) > 0:
                ifa[AF_INET] = ipv4s
            if len(ipv6s) > 0:
                ifa[AF_INET6] = ipv6s

    return ifa