// taxes_az/public/js/xml_mapping/xml_parser.js

frappe.provide("taxes_az.xml_mapping");

taxes_az.xml_mapping.XMLParser = class XMLParser {
    constructor() {
        this.fieldPaths = [];
    }

    // Основная функция парсинга XML
    parseXML(xmlString) {
        const parser = new DOMParser();
        try {
            const xmlDoc = parser.parseFromString(xmlString, "text/xml");
            
            // Проверка наличия ошибок парсинга
            const parseError = xmlDoc.getElementsByTagName("parsererror");
            if (parseError.length > 0) {
                frappe.throw(__("Invalid XML: ") + parseError[0].textContent);
                return null;
            }
            
            // Получить корневой элемент
            const rootElement = xmlDoc.documentElement;
            this.fieldPaths = [];
            
            // Рекурсивно извлечь пути к полям
            this._extractFieldPaths(rootElement, "");
            
            return {
                rootElement: rootElement.nodeName,
                fieldPaths: this.fieldPaths
            };
        } catch (error) {
            frappe.throw(__("Error parsing XML: ") + error.message);
            return null;
        }
    }

    // Рекурсивное извлечение путей к полям
    _extractFieldPaths(element, currentPath) {
        const nodeName = element.nodeName;
        const newPath = currentPath ? `${currentPath}/${nodeName}` : nodeName;
        
        // Если у элемента есть текстовое содержимое и нет дочерних элементов,
        // считаем его полем
        if (element.childNodes.length === 1 && element.childNodes[0].nodeType === 3) {
            this.fieldPaths.push({
                path: newPath,
                value: element.textContent.trim(),
                type: 'field'
            });
            return;
        }
        
        // Если у элемента есть атрибуты, извлекаем их как поля
        if (element.attributes && element.attributes.length > 0) {
            for (let i = 0; i < element.attributes.length; i++) {
                const attr = element.attributes[i];
                this.fieldPaths.push({
                    path: `${newPath}/@${attr.name}`,
                    value: attr.value,
                    type: 'attribute'
                });
            }
        }
        
        // Рекурсивно обрабатываем дочерние элементы
        const childElements = element.childNodes;
        for (let i = 0; i < childElements.length; i++) {
            const child = childElements[i];
            if (child.nodeType === 1) { // ELEMENT_NODE
                this._extractFieldPaths(child, newPath);
            }
        }
    }
};