// Файл: 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) => {
                // Do NOT recompute on every open: clear_all_vat_fields() does
                // set_value(...,0) which marks the form dirty on load. VAT fields are
                // recomputed by the qty/rate/amount/item_tax_template triggers when the
                // user edits, and authoritatively on the server at save. Skipping the
                // refresh recompute for Sales Invoice keeps it clean ("only when needed").
                if (frm.doc.docstatus === 0 && doctype !== 'Sales Invoice') {
                    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) {
        // On Sales Invoice the single `tax_article` field is vestigial (hidden;
        // replaced by the multi-select child table). Touching/clearing it here
        // marks the form dirty on every refresh — skip it entirely for Sales Invoice.
        if (frm && frm.doctype === 'Sales Invoice') return;

        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) {
        if (!tax_template) return false;
        const template = tax_template.trim();
        return template.startsWith("ƏDV 0%") || template.startsWith("ƏDV-dən azadolma");
    },

    // НОВАЯ функция: возвращает фильтр для tax_article в зависимости от налогового шаблона
    get_tax_article_filter: function(tax_template) {
        if (!tax_template) return null;
        const template = tax_template.trim();

        if (template.startsWith("ƏDV 0%")) {
            return {
                "parent_tax_article": "ƏDV-yə 0% dərəcə ilə tutulan əməliyyatlar"
            };
        } else if (template.startsWith("ƏDV-dən azadolma")) {
            return {
                "parent_tax_article": "ƏDV-dən azad olunan əməliyyatlar"
            };
        } else {
            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'
                    });
                }
            }
        });
    },


    calculate_vat_fields: function(cdt, cdn, frm = null) {
        const item = locals[cdt][cdn];

        // amount считаем из значений МОДЕЛИ (locals), а не из DOM.
        // Прежний вариант читал qty/rate через grid_row.get_field(...), который
        // бросает "fieldname qty not found", когда колонка не отрисована / строка
        // свёрнута — это исключение рвало всю последовательную refresh-цепочку
        // Sales Invoice (frappe.run_serially) и отключало остальные refresh-хендлеры.
        // К моменту триггеров qty/rate/amount значения в locals уже актуальны.
        const amount = flt(item.qty || 0) * flt(item.rate || 0);

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

        if (amount <= 0) return;

        const tax_template = (item.item_tax_template || '').trim();

        // Используем startsWith вместо точного сравнения
        if (tax_template.startsWith("Ə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);
        } else if (tax_template.startsWith("Ə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);
        } else if (tax_template.startsWith("ƏDV 0%")) {
            frappe.model.set_value(cdt, cdn, 'vat_0_percent_with_amount', amount);
        } else if (tax_template.startsWith("ƏDV-dən azadolma")) {
            frappe.model.set_value(cdt, cdn, 'vat_free_amount', amount);
        } else {
            frappe.model.set_value(cdt, cdn, 'amount_without_vat', amount);
        }
    },

    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);
        });
    }
};