"""
Copyright 2019 Glen Harmon



"""


from io import StringIO
import ipaddress
from xml.etree import ElementTree


from .objects import Ipv4Record, Ipv6Record


def _strip_namespaces(xml):
    it = ElementTree.iterparse(StringIO(xml))
    for _, el in it:
        if '}' in el.tag:
            el.tag = el.tag.split('}', 1)[1]  # strip all namespaces
    return it.root


def _clean_ipv4_prefix(prefix):
    ip, prefix_length = prefix.split('/')
    octets = ip.split('.')
    for _ in (range(4 - len(octets))):
        octets.append('0')
    octets = [str(int(i)) for i in octets]
    return ipaddress.ip_network('{}/{}'.format(
            '.'.join(octets),
            prefix_length
        ))


class Parse:

    @classmethod
    def ipv4(cls, content):
        tree = _strip_namespaces(content)
        reservations = list()
        for record in tree.findall("./record"):
            instance = Ipv4Record()

            for item in record.iter():
                if hasattr(instance, item.tag):
                    value = item.text
                    if item.tag == 'prefix':
                        value = _clean_ipv4_prefix(value)
                    setattr(instance, item.tag, value)                    
            reservations.append(instance)
        return reservations

    @classmethod
    def ipv6(cls, content):
        tree = _strip_namespaces(content)
        reservations = list()
        for record in tree.findall("./record"):
            instance = Ipv6Record()
            for item in record.iter():
                if hasattr(instance, item.tag):
                    value = item.text
                    if item.tag == 'prefix':
                        value = ipaddress.ip_network(value)
                    setattr(instance, item.tag, value)                    
            reservations.append(instance)
        return reservations