# -*- coding: utf-8 -*-
"""Moduł odczytujący plik xml
"""
from lxml import etree
#from lxml.etree import XMLParser, ElementTree, _ElementUnicodeResult
import xml
from io import BytesIO, StringIO


"""Klasa odpowiedzialna za odczyt pliku xml
"""
class XmlConverter():
    def __init__(self):
        pass
           
    
    @property
    def root(self):
        """root pliku xml
        """
        try:
            return self.__tree.getroot()
        except Exception as e:
            raise e  
       

    def load(self,bytes):
        """Załadowanie pliku xml
        :param text; dane swdl w postaci ciągu bajtów
        """
        try:
            #self.__tree=etree.fromstring(text)
            io=BytesIO(bytes)
            self.__tree=etree.parse(io)
        except Exception as e:
            raise e
            
    def get_childs(self,element):
        """Lista dzieci elementu
        :param element; element drzewa
        """
        try:
            return [child for child in element]
        except Exception as e:
            raise e
        
    def get_child(self,element,name):
        """Zwaraca pierwsze dziecko z gałęzi o zadanej nazwie
        :param element; Drzewo xml
        :param name; nazwa dziecka
        """
        try:
            ret=[child for child in element if child.tag=='{https://www.bdl.lasy.gov.pl/portal/swdl}'+name]
            if len(ret)>0:
                return ret[0]
        except Exception as e:
            raise e
        
    def get_property(self,element,name):
        """własciwośc elementu
        :param element; element xml
        :param name; nazwa własciwości
        """
        try:
            return element.get(name)
        except Exception as e:
            raise e
        
    def get_value(self,element):
        """wartośc elementu
        :param element; element xml
        """
        try:
            if element is None:
                return None
            return element.text
        except Exception as e:
            raise e 
    
    def get_float(self,element):
        """Zwraca wartość double z drzewa xml
        Args:
            element (xml): element xml
        """
        try:
            if element is None:
                return 0
            return float(element.text)
        except Exception as e:
            raise e

    def get_element(self,element,name):
        """Zwraza pierwszy element potomny w elemencie (szuka także w poddrzewach)
        :param element; element rodzic
        :param name; nazwa elementu
        """
        try:
            return next(element.iter('{https://www.bdl.lasy.gov.pl/portal/swdl}'+name))  
        except Exception as e:
            #jezeli nie ma elementu to null
            if type(e) is StopIteration:
                return None
            raise e    
    
    def get_elements(self,element,name):
        """Zwraza listę elementów potomnych w elemencie (szuka także w poddrzewach)
        :param element; element rodzic
        :param name; nazwa lub lista nazw elementów
        """
        try:
            return [el for el in element.iter('{https://www.bdl.lasy.gov.pl/portal/swdl}'+name)]  
        except Exception as e:
            raise e
        
    def to_string(self,element):
        """Zamienia element xml na string
        :param element; element xml
        """
        try:
            return etree.tostring(element)#, pretty_print=True)
        except Exception as e:
            raise e
        
#     def test(self,element,name):
#         try:
#             
#             print(element.iter('{http://www.buligl.pl/swdl/2.0}subareaInfo'))
#             print(1)
#             return next(element.iter('{http://www.buligl.pl/swdl/2.0}'+name))  
#         except Exception as e:
#             #jezeli nie ma elementu to null
#             if type(e) is StopIteration:
#                 return None
#             print(type(e))
#             raise e    
        