'''
Created on 26.03.2021

@author: antix19
'''
from mutil.XmlExtractor import XmlExtractor
from mutil import XmlExtractor as XMLE

def eval_class(classs, item):
    item_hira = item.split(".")
    ilen = len(item_hira) 
    class_hira = classs.split(".")
    if len(class_hira) < len(item_hira):
        return False,ilen
    for i in range(len(item_hira)):
        if item_hira[i] != class_hira[i]:
            return False,ilen
    return True,ilen
    
def eval_attribute(classs, attribute):
    for item in attribute.split(":"):
        ret,ilen = eval_class(classs, item)
        if ret:
            return True,ilen
    return False,ilen

def is_for_print(classs, attrs):
    include = False
    exclude = False
    ilen    = 0
    elen    = 0
    if "include" in attrs:
        include,ilen = eval_attribute(classs, attrs["include"])
    if "exclude" in attrs:
        exclude,elen = eval_attribute(classs, attrs["exclude"])
    if ilen > 0 and elen == 0:
        return include
    elif elen > 0 and ilen == 0:
        return not exclude
    elif ilen > 0 and elen > 0:
        if ilen > elen:
            if include:
                return True
            else:
                return not exclude
        elif elen > ilen:
            if exclude:
                return False
            else:
                return include
    return True
    
    
def extract(file, classs, target):
    source = XmlExtractor()
    source.openInput(file)
    
    # open output file
    out_file = open(target, "w")
    
    source.requireChild("document")
    (ctl,elem, value, attrs) = source.extractElement(XMLE.EC_BEG)
    while ctl != XMLE.EC_END:
        if elem != "text":
            raise EnvironmentError("<text> node expected")
        if is_for_print(classs, attrs):
            out_file.write(value+"\n")
        (ctl,elem, value, attrs) = source.extractElement(ctl)
    return 0

        