import xml.etree.ElementTree as ET
from doc_parser.utils.omml_parser import omml
from doc_parser.utils.omml_parser.utils import qualified_tag_name, namespace_map


def list_paragraph_to_normal_text(xml_str):

    root = ET.fromstring(xml_str)
    list_paragraph_dict = {}
    for child in root.iter():
        if child.tag == qualified_tag_name('w:p'):
            style_w_val = None
            try:
                styles = list(child.iter(qualified_tag_name("w:pStyle")))
                style_w_val = styles[0].get(qualified_tag_name('w:val'))

            except:
                continue

            if style_w_val == 'ListParagraph':
                numId_w_val = None
                try:
                    numPrs = list(child.iter(qualified_tag_name("w:numPr")))
                    numId_w_val = list(numPrs[0].iter(qualified_tag_name('w:numId')))[
                        0].get(qualified_tag_name('w:val'))
                    if numId_w_val in list_paragraph_dict:
                        list_paragraph_dict[numId_w_val] += 1
                    else:
                        list_paragraph_dict[numId_w_val] = 1

                    wt = ET.Element(f"INJECTED_TEXT")
                    wt.text = f"{list_paragraph_dict[numId_w_val]}) "

                    child.insert(0, wt)

                except:

                    continue

    # print(list_paragraph_dict)
    # for item in list_paragraph_dict:
    #     print(list_paragraph_dict[item])
    # print(ET.tostring(root,))
    return ET.tostring(root)


def xml_to_element_list(dox_xml_str, rel_xml_str, skip_images=False):
    normalized_dox_xml_str = list_paragraph_to_normal_text(dox_xml_str)
    output = []
    root = ET.fromstring(normalized_dox_xml_str)
    rel_root = ET.fromstring(rel_xml_str)
    for child in root.iter():
        if child.tag == qualified_tag_name('w:t') or child.tag == 'INJECTED_TEXT':
            t_text = child.text
            if t_text and (not output or output[-1]["type"] != "text"):
                obj = {
                    "type": "text",
                    "value": t_text
                }
                output.append(obj)
            elif t_text and output[-1]["type"] == "text":
                output[-1]["value"] += t_text
        elif child.tag == qualified_tag_name('w:tab'):
            obj = {
                "type": "tab",
            }
            output.append(obj)
        elif child.tag in (qualified_tag_name('w:br'), qualified_tag_name('w:cr')):
            obj = {
                "type": "break",
            }
            output.append(obj)

        elif child.tag == qualified_tag_name("w:p"):
            obj = {
                "type": "break",
            }
            output.append(obj)

        elif not skip_images and child.tag == qualified_tag_name("w:drawing"):
            extents = list(child.iter(qualified_tag_name("wp:extent")))
            extent = extents[0] if extents else None
            cx = int(extent.get('cx'))
            cy = int(extent.get('cy'))
            cx_pixel = cx/914400*96
            cy_pixel = cy/914400*96

            blip = list(child.iter(qualified_tag_name("a:blip")))[0]
            relation = blip.get(qualified_tag_name('r:embed'))
            paths = [item for item in rel_root if item.attrib["Id"] == relation]
            path = paths[0].get('Target') if paths else None

            obj = {
                "type": "img",
                "value": path,
                "width": cx_pixel,
                "height": cy_pixel,

            }
            output.append(obj)

        elif child.tag == qualified_tag_name("m:oMath"):

            obj = {
                "type": "equation",
                "value": omml.omml_to_latext(child),
            }
            output.append(obj)

    return output
