// taxes_az/public/js/xml_mapping/doctype_field_selector.js

frappe.provide("taxes_az.xml_mapping");

taxes_az.xml_mapping.DoctypeFieldSelector = class DoctypeFieldSelector {
    constructor(frm) {
        this.frm = frm;
    }
    
    // Получить список полей DocType
    async getFieldsForDoctype(doctype) {
        return new Promise((resolve, reject) => {
            frappe.model.with_doctype(doctype, () => {
                try {
                    const meta = frappe.get_meta(doctype);
                    if (!meta) {
                        throw new Error(`DocType ${doctype} not found`);
                    }
                    
                    const fields = meta.fields.filter(field => {
                        // Исключаем служебные поля и разделы
                        return !['Section Break', 'Column Break', 'Tab Break', 'HTML', 'Button'].includes(field.fieldtype);
                    });
                    
                    resolve(fields);
                } catch (error) {
                    reject(error);
                }
            });
        });
    }
    
    // Добавить селекторы полей для каждого XML-пути
    async attachFieldSelectors(container, xmlPaths) {
        if (!this.frm.doc.target_doctype) {
            frappe.throw(__('Please select a target DocType first'));
            return;
        }
        
        try {
            const fields = await this.getFieldsForDoctype(this.frm.doc.target_doctype);
            
            // Добавляем селектор для каждого XML-пути
            container.find('.xml-field-row').each((i, row) => {
                const $row = $(row);
                const xmlPath = $row.data('path');
                const $selector = $row.find('.xml-field-selector');
                
                // Создаем выпадающий список
                const select = document.createElement('select');
                select.classList.add('form-control', 'xml-field-map-select');
                select.dataset.xmlPath = xmlPath;
                
                // Опция "Не сопоставлять"
                const defaultOption = document.createElement('option');
                defaultOption.value = "";
                defaultOption.textContent = __("-- Not mapped --");
                select.appendChild(defaultOption);
                
                // Добавляем опции для каждого поля DocType
                fields.forEach(field => {
                    const option = document.createElement('option');
                    option.value = field.fieldname;
                    option.textContent = `${field.label || field.fieldname} (${field.fieldname})`;
                    select.appendChild(option);
                });
                
                // Добавляем селектор в контейнер
                $selector.empty().append(select);
                
                // Устанавливаем выбранное значение из сохраненных данных
                if (this.frm.doc.mapping_data) {
                    try {
                        const mappingData = JSON.parse(this.frm.doc.mapping_data);
                        if (mappingData[xmlPath]) {
                            select.value = mappingData[xmlPath];
                        }
                    } catch (e) {
                        console.error('Error parsing mapping data:', e);
                    }
                }
                
                // Обработчик изменения
                $(select).on('change', () => {
                    this._saveMappingData();
                });
            });
        } catch (error) {
            frappe.throw(`Error loading DocType fields: ${error.message}`);
        }
    }
    
    _saveMappingData() {
        const mappingData = {};
        
        $('.xml-field-map-select').each((i, select) => {
            const $select = $(select);
            const xmlPath = $select.data('xml-path');
            const fieldname = $select.val();
            
            if (fieldname) {
                mappingData[xmlPath] = fieldname;
            }
        });
        
        // Просто устанавливаем значение, но не сохраняем автоматически
        this.frm.set_value('mapping_data', JSON.stringify(mappingData));
        
        // Уведомление об обновлении маппинга
        frappe.show_alert({
            message: __('Mapping updated. Remember to save the document.'),
            indicator: 'blue'
        });
    }
};