// Файл: jey_erp/public/js/vat_calculator.js
// Версия с двумя типами НДС 18%: сверху и в том числе
// + индивидуальные фильтры для tax_article

if (!window.jey_erp) {
    window.jey_erp = {};
}

jey_erp.vat_calculator = {
    init: function(doctype) {
        const child_doctype = doctype === 'Sales Order' ? 'Sales Order Item' : 'Sales Invoice Item';

        // 1. Стандартные триггеры Frappe
        frappe.ui.form.on(doctype, {
            refresh: (frm) => {
                if (frm.doc.docstatus === 0) {
                    this.setup_vat_system(frm, child_doctype);
                }
            }
        });

        frappe.ui.form.on(child_doctype, {
            item_code: (frm, cdt, cdn) => {
                // Даем время фреймворку загрузить данные товара
                setTimeout(() => {
                    this.run_calculations(frm, cdt, cdn);
                }, 200);
            },
            
            // ОСНОВНЫЕ ТРИГГЕРЫ - используем те, которые срабатывают после обновления значений
            qty: (frm, cdt, cdn) => {
                // Добавляем небольшую задержку для гарантии обновления
                setTimeout(() => {
                    this.run_calculations(frm, cdt, cdn);
                }, 50);
            },
            
            rate: (frm, cdt, cdn) => {
                setTimeout(() => {
                    this.run_calculations(frm, cdt, cdn);
                }, 50);
            },
            
            // Триггер amount как дополнительная подстраховка
            amount: (frm, cdt, cdn) => {
                setTimeout(() => {
                    this.run_calculations(frm, cdt, cdn);
                }, 50);
            },
            
            item_tax_template: (frm, cdt, cdn) => {
                setTimeout(() => {
                    this.run_calculations(frm, cdt, cdn);
                }, 100);
            },
            
            form_render: (frm, cdt, cdn) => {
                setTimeout(() => {
                    this.update_tax_article_readonly(frm, cdt, cdn);
                }, 50);
            }
        });

        // 2. jQuery-обработчики для гарантированного обновления readonly и фильтров
        $(document).ready(() => {
            // Обработчик фокуса на элементах внутри строк таблицы
            $(document).on('focus', '.grid-row input, .grid-row select', (e) => {
                const frm = cur_frm;
                if (frm && frm.doctype === doctype) {
                    const $row = $(e.target).closest('.grid-row');
                    const row_index = $row.index();
                    const item = frm.doc.items?.[row_index];
                    
                    if (item) {
                        setTimeout(() => {
                            this.update_tax_article_readonly(frm, child_doctype, item.name);
                        }, 50);
                    }
                }
            });

            // Дополнительный обработчик клика по строке
            $(document).on('click', '.grid-row', (e) => {
                const frm = cur_frm;
                if (frm && frm.doctype === doctype) {
                    const $row = $(e.currentTarget);
                    const row_index = $row.index();
                    const item = frm.doc.items?.[row_index];
                    
                    if (item) {
                        setTimeout(() => {
                            this.update_tax_article_readonly(frm, child_doctype, item.name);
                        }, 50);
                    }
                }
            });
        });
    },

    run_calculations: function(frm, cdt, cdn) {
        this.calculate_vat_fields(cdt, cdn, frm);
        this.update_tax_article_readonly(frm, cdt, cdn);
    },

    setup_vat_system: function(frm, child_doctype) {
        if (!frm.doc.items?.length) return;
        frm.doc.items.forEach(item => {
            if (item.item_code) {
                this.calculate_vat_fields(child_doctype, item.name, frm);
                this.update_tax_article_readonly(frm, child_doctype, item.name);
            }
        });
    },
    
    // 3. ОБНОВЛЕННАЯ функция с поддержкой индивидуальных фильтров для tax_article
    update_tax_article_readonly: function(frm, cdt, cdn) {
        const item = locals[cdt][cdn];
        if (!item?.item_code) return;

        const is_editable = this.is_tax_article_allowed(item.item_tax_template);
        const readonly_value = is_editable ? 0 : 1;

        // Метод 1: Обновление через grid (для всех строк)
        const grid = frm.fields_dict.items.grid;
        if (grid) {
            try {
                grid.update_docfield_property("tax_article", "read_only", readonly_value);
                
                // Устанавливаем фильтр для tax_article в зависимости от налогового шаблона
                if (is_editable) {
                    const filter = this.get_tax_article_filter(item.item_tax_template);
                    if (filter) {
                        grid.update_docfield_property("tax_article", "get_query", function() {
                            return {
                                filters: filter
                            };
                        });
                    }
                }
            } catch (e) {
                // Игнорируем ошибки
            }
        }

        // Метод 2: Обновление конкретной строки (более надежно)
        const row_index = frm.doc.items.findIndex(i => i.name === cdn);
        if (row_index !== -1) {
            const grid_row = grid?.grid_rows?.[row_index];
            if (grid_row) {
                try {
                    grid_row.toggle_editable("tax_article", is_editable);
                    
                    // Устанавливаем фильтр для конкретной строки
                    if (is_editable) {
                        const filter = this.get_tax_article_filter(item.item_tax_template);
                        if (filter) {
                            const tax_article_field = grid_row.get_field('tax_article');
                            if (tax_article_field) {
                                tax_article_field.get_query = function() {
                                    return {
                                        filters: filter
                                    };
                                };
                            }
                        }
                    }
                } catch (e) {
                    // Игнорируем ошибки
                }
            }
        }

        // Очищаем tax_article если поле должно быть заблокировано или изменился тип НДС
        if (!is_editable && item.tax_article) {
            frappe.model.set_value(cdt, cdn, 'tax_article', '');
        } else if (is_editable && item.tax_article) {
            // Проверяем, соответствует ли текущий tax_article новому фильтру
            this.validate_tax_article_against_filter(frm, cdt, cdn, item.item_tax_template);
        }
    },

    // ОБНОВЛЕНО: tax_article разрешен только для ƏDV 0% и ƏDV-dən azadolma
    // Для обоих типов НДС 18% поле заблокировано
    is_tax_article_allowed: function(tax_template) {
        return tax_template === "ƏDV 0%" || tax_template === "ƏDV-dən azadolma";
    },

    // НОВАЯ функция: возвращает фильтр для tax_article в зависимости от налогового шаблона
    get_tax_article_filter: function(tax_template) {
        switch (tax_template) {
            case "ƏDV 0%":
                return {
                    "parent_tax_article": "ƏDV-yə 0% dərəcə ilə tutulan əməliyyatlar"
                };
            case "ƏDV-dən azadolma":
                return {
                    "parent_tax_article": "ƏDV-dən azad olunan əməliyyatlar"
                };
            default:
                return null;
        }
    },

    // НОВАЯ функция: проверяет соответствие текущего tax_article новому фильтру
    validate_tax_article_against_filter: function(frm, cdt, cdn, tax_template) {
        const item = locals[cdt][cdn];
        if (!item.tax_article) return;

        const filter = this.get_tax_article_filter(tax_template);
        if (!filter) return;

        // Проверяем через API, подходит ли текущий tax_article под новый фильтр
        frappe.call({
            method: "frappe.client.get_value",
            args: {
                doctype: "Tax Article", // Предполагаемое название doctype
                filters: {
                    name: item.tax_article,
                    ...filter
                },
                fieldname: "name"
            },
            callback: (response) => {
                if (!response.message) {
                    // Текущий tax_article не подходит под новый фильтр, очищаем
                    frappe.model.set_value(cdt, cdn, 'tax_article', '');
                    frappe.show_alert({
                        message: __('Tax Article cleared due to template change'),
                        indicator: 'orange'
                    });
                }
            }
        });
    },

    // Альтернативный метод получения актуальных значений из DOM
    get_current_values: function(frm, cdt, cdn) {
        const item = locals[cdt][cdn];
        const row_index = frm.doc.items.findIndex(i => i.name === cdn);
        
        if (row_index === -1) {
            return {
                qty: flt(item.qty || 0),
                rate: flt(item.rate || 0),
                amount: flt(item.qty || 0) * flt(item.rate || 0)
            };
        }
        
        // Пытаемся получить значения из DOM полей
        const grid_row = frm.fields_dict.items.grid?.grid_rows?.[row_index];
        if (grid_row) {
            const qty_field = grid_row.get_field('qty');
            const rate_field = grid_row.get_field('rate');
            
            const qty = qty_field ? flt(qty_field.get_value()) : flt(item.qty || 0);
            const rate = rate_field ? flt(rate_field.get_value()) : flt(item.rate || 0);
            
            return {
                qty: qty,
                rate: rate,
                amount: qty * rate
            };
        }
        
        // Fallback к обычному способу
        return {
            qty: flt(item.qty || 0),
            rate: flt(item.rate || 0),
            amount: flt(item.qty || 0) * flt(item.rate || 0)
        };
    },

    calculate_vat_fields: function(cdt, cdn, frm = null) {
        const item = locals[cdt][cdn];
        
        // Получаем актуальные значения
        let amount;
        if (frm) {
            const values = this.get_current_values(frm, cdt, cdn);
            amount = values.amount;
        } else {
            // Fallback: вычисляем из значений в locals
            const qty = flt(item.qty || 0);
            const rate = flt(item.rate || 0);
            amount = qty * rate;
        }

        // Очищаем все поля НДС перед расчетом
        this.clear_all_vat_fields(cdt, cdn);

        if (amount <= 0) return;

        const tax_template = item.item_tax_template;
        
        switch (tax_template) {
            case "ƏDV 18%":
                // НДС 18% СВЕРХУ: к amount добавляется 18%
                // amount = 100 -> vat_amount = 18, total = 118
                const vat_amount_top = amount * 0.18;
                const total_with_vat_top = amount + vat_amount_top;
                
                frappe.model.set_value(cdt, cdn, 'vat_18_percent_with_amount', total_with_vat_top);
                frappe.model.set_value(cdt, cdn, 'vat_amount', vat_amount_top);
                break;
                
            case "ƏDV daxil 18%":
                // НДС 18% В ТОМ ЧИСЛЕ: из amount выделяется НДС
                // amount = 100 -> vat_amount = 15.25, amount без НДС = 84.75, total = 100
                const total_with_vat_included = amount;
                const amount_without_vat = total_with_vat_included / 1.18;
                const vat_amount_included = total_with_vat_included - amount_without_vat;
                
                frappe.model.set_value(cdt, cdn, 'vat_18_percent_with_amount', total_with_vat_included);
                frappe.model.set_value(cdt, cdn, 'vat_amount', vat_amount_included);
                break;
                
            case "ƏDV 0%":
                frappe.model.set_value(cdt, cdn, 'vat_0_percent_with_amount', amount);
                break;
                
            case "ƏDV-dən azadolma":
                frappe.model.set_value(cdt, cdn, 'vat_free_amount', amount);
                break;
                
            default:
                frappe.model.set_value(cdt, cdn, 'amount_without_vat', amount);
                break;
        }
    },

    clear_all_vat_fields: function(cdt, cdn) {
        const vat_fields = [
            'vat_18_percent_with_amount', 
            'vat_amount', 
            'vat_0_percent_with_amount',
            'amount_without_vat', 
            'vat_free_amount'
        ];
        vat_fields.forEach(fieldname => {
            frappe.model.set_value(cdt, cdn, fieldname, 0);
        });
    }
};