# your_app/doctype/sales_invoice/sales_invoice.py
# Добавить в существующий класс Sales Invoice или создать custom app

import frappe
from frappe import _
from frappe.utils import flt
from erpnext.selling.doctype.sales_order.sales_order import SalesOrder
from erpnext.accounts.doctype.sales_invoice.sales_invoice import SalesInvoice

class CustomSalesInvoice(SalesInvoice):
    def on_update_after_submit(self):
        super().on_update_after_submit()
    
    def calculate_taxes_and_totals(self):
        # Сначала стандартные расчеты ERPNext
        super().calculate_taxes_and_totals()
        # Потом наши VAT расчеты
        self.calculate_vat_fields()
    
    def calculate_vat_fields(self):
        """Рассчитывает VAT поля для всех строк"""
        if not self.items:
            return
        
        for item in self.items:
            self.calculate_item_vat_fields(item)
    
    def calculate_item_vat_fields(self, item):
        """Рассчитывает VAT поля для одной строки"""
        if not item.item_code or flt(item.amount) <= 0:
            self.clear_item_vat_fields(item)
            return
        
        # Очищаем все VAT поля перед новым расчетом
        self.clear_item_vat_fields(item)
        
        # Блокируем tax_article если не разрешено
        self.handle_tax_article_permission(item)
        
        # Рассчитываем поля в зависимости от налогового шаблона
        amount = flt(item.amount)
        tax_template = item.item_tax_template
        
        if tax_template == "ƏDV 18%":
            self.calculate_18_percent_vat(item, amount)
        elif tax_template == "ƏDV 0%":
            self.calculate_0_percent_vat(item, amount)
        elif tax_template == "ƏDV-dən azadolma":
            self.calculate_vat_free(item, amount)
        else:
            self.calculate_without_vat(item, amount)
    
    def clear_item_vat_fields(self, item):
        """Очищает все VAT поля строки"""
        vat_fields = [
            'vat_18_percent_with_amount',
            'vat_amount', 
            'vat_0_percent_with_amount',
            'amount_without_vat',
            'vat_free_amount'
        ]
        
        for field in vat_fields:
            if hasattr(item, field):
                setattr(item, field, 0)
    
    def handle_tax_article_permission(self, item):
        """Обрабатывает разрешения для поля tax_article"""
        tax_template = item.item_tax_template
        is_allowed = tax_template in ["ƏDV 0%", "ƏDV-dən azadolma"]
        
        # Очищаем tax_article если оно не должно быть доступно
        if not is_allowed and item.tax_article:
            item.tax_article = None
    
    def calculate_18_percent_vat(self, item, amount):
        """Рассчитывает поля для ƏDV 18%"""
        vat_18_total = amount * 1.18
        vat_amount = vat_18_total - amount
        
        item.vat_18_percent_with_amount = vat_18_total
        item.vat_amount = vat_amount
    
    def calculate_0_percent_vat(self, item, amount):
        """Рассчитывает поля для ƏDV 0%"""
        item.vat_0_percent_with_amount = amount
    
    def calculate_vat_free(self, item, amount):
        """Рассчитывает поля для ƏDV-dən azadolma"""
        item.vat_free_amount = amount
    
    def calculate_without_vat(self, item, amount):
        """Рассчитывает поля для случаев без НДС"""
        item.amount_without_vat = amount


class CustomSalesOrder(SalesOrder):
    def on_update_after_submit(self):
        super().on_update_after_submit()
    
    def calculate_taxes_and_totals(self):
        # Сначала стандартные расчеты ERPNext
        super().calculate_taxes_and_totals()
        # Потом наши VAT расчеты
        self.calculate_vat_fields()
    
    def calculate_vat_fields(self):
        """Рассчитывает VAT поля для всех строк"""
        if not self.items:
            return
        
        for item in self.items:
            self.calculate_item_vat_fields(item)
    
    def calculate_item_vat_fields(self, item):
        """Рассчитывает VAT поля для одной строки"""
        if not item.item_code or flt(item.amount) <= 0:
            self.clear_item_vat_fields(item)
            return
        
        # Очищаем все VAT поля перед новым расчетом
        self.clear_item_vat_fields(item)
        
        # Блокируем tax_article если не разрешено
        self.handle_tax_article_permission(item)
        
        # Рассчитываем поля в зависимости от налогового шаблона
        amount = flt(item.amount)
        tax_template = item.item_tax_template
        
        if tax_template == "ƏDV 18%":
            self.calculate_18_percent_vat(item, amount)
        elif tax_template == "ƏDV 0%":
            self.calculate_0_percent_vat(item, amount)
        elif tax_template == "ƏDV-dən azadolma":
            self.calculate_vat_free(item, amount)
        else:
            self.calculate_without_vat(item, amount)
    
    def clear_item_vat_fields(self, item):
        """Очищает все VAT поля строки"""
        vat_fields = [
            'vat_18_percent_with_amount',
            'vat_amount', 
            'vat_0_percent_with_amount',
            'amount_without_vat',
            'vat_free_amount'
        ]
        
        for field in vat_fields:
            if hasattr(item, field):
                setattr(item, field, 0)
    
    def handle_tax_article_permission(self, item):
        """Обрабатывает разрешения для поля tax_article"""
        tax_template = item.item_tax_template
        is_allowed = tax_template in ["ƏDV 0%", "ƏDV-dən azadolma"]
        
        # Очищаем tax_article если оно не должно быть доступно
        if not is_allowed and item.tax_article:
            item.tax_article = None
    
    def calculate_18_percent_vat(self, item, amount):
        """Рассчитывает поля для ƏDV 18%"""
        vat_18_total = amount * 1.18
        vat_amount = vat_18_total - amount
        
        item.vat_18_percent_with_amount = vat_18_total
        item.vat_amount = vat_amount
    
    def calculate_0_percent_vat(self, item, amount):
        """Рассчитывает поля для ƏDV 0%"""
        item.vat_0_percent_with_amount = amount
    
    def calculate_vat_free(self, item, amount):
        """Рассчитывает поля для ƏDV-dən azadolma"""
        item.vat_free_amount = amount
    
    def calculate_without_vat(self, item, amount):
        """Рассчитывает поля для случаев без НДС"""
        item.amount_without_vat = amount


# Альтернативный способ через monkey patching, если не хотите наследовать классы
def patch_sales_documents():
    """Патчит существующие классы Sales Invoice и Sales Order"""
    
    # Патчим Sales Invoice
    original_calc_taxes_invoice = SalesInvoice.calculate_taxes_and_totals
    
    def new_calc_taxes_invoice(self):
        original_calc_taxes_invoice(self)
        calculate_vat_fields_for_doc(self)
    
    SalesInvoice.calculate_taxes_and_totals = new_calc_taxes_invoice
    
    # Патчим Sales Order
    original_calc_taxes_order = SalesOrder.calculate_taxes_and_totals
    
    def new_calc_taxes_order(self):
        original_calc_taxes_order(self)
        calculate_vat_fields_for_doc(self)
    
    SalesOrder.calculate_taxes_and_totals = new_calc_taxes_order


def calculate_vat_fields_for_doc(doc):
    """Универсальная функция для расчета VAT полей"""
    if not doc.items:
        return
    
    for item in doc.items:
        if not item.item_code or flt(item.amount) <= 0:
            clear_vat_fields(item)
            continue
        
        # Очищаем все VAT поля перед новым расчетом
        clear_vat_fields(item)
        
        # Блокируем tax_article если не разрешено
        handle_tax_article_permission(item)
        
        # Рассчитываем поля в зависимости от налогового шаблона
        amount = flt(item.amount)
        tax_template = item.item_tax_template
        
        if tax_template == "ƏDV 18%":
            calculate_18_percent_vat(item, amount)
        elif tax_template == "ƏDV 0%":
            calculate_0_percent_vat(item, amount)
        elif tax_template == "ƏDV-dən azadolma":
            calculate_vat_free(item, amount)
        else:
            calculate_without_vat(item, amount)


def clear_vat_fields(item):
    """Очищает все VAT поля"""
    vat_fields = [
        'vat_18_percent_with_amount',
        'vat_amount', 
        'vat_0_percent_with_amount',
        'amount_without_vat',
        'vat_free_amount'
    ]
    
    for field in vat_fields:
        if hasattr(item, field):
            setattr(item, field, 0)


def handle_tax_article_permission(item):
    """Обрабатывает разрешения для поля tax_article"""
    tax_template = item.item_tax_template
    is_allowed = tax_template in ["ƏDV 0%", "ƏDV-dən azadolma"]
    
    if not is_allowed and item.tax_article:
        item.tax_article = None


def calculate_18_percent_vat(item, amount):
    """Рассчитывает поля для ƏDV 18%"""
    vat_18_total = amount * 1.18
    vat_amount = vat_18_total - amount
    
    item.vat_18_percent_with_amount = vat_18_total
    item.vat_amount = vat_amount


def calculate_0_percent_vat(item, amount):
    """Рассчитывает поля для ƏDV 0%"""
    item.vat_0_percent_with_amount = amount


def calculate_vat_free(item, amount):
    """Рассчитывает поля для ƏDV-dən azadolma"""
    item.vat_free_amount = amount


def calculate_without_vat(item, amount):
    """Рассчитывает поля для случаев без НДС"""
    item.amount_without_vat = amount