# Copyright (c) 2025, Your Company and contributors
# For license information, please see license.txt

import frappe
from frappe.model.document import Document


class ETaxesVATAccountMapping(Document):
    def validate(self):
        """
        Проверка уникальности комбинации operation_type + classification_code + expense_income
        в рамках одного родительского документа (E-Taxes Settings)
        """
        if not self.parent or not self.parenttype:
            return

        # Нормализуем classification_code (None и пустая строка считаются одинаковыми)
        current_code = self.classification_code or None

        # Ищем другие строки с такой же комбинацией
        filters = {
            'parent': self.parent,
            'parenttype': self.parenttype,
            'operation_type': self.operation_type,
            'expense_income': self.expense_income,
            'name': ['!=', self.name]  # Исключаем текущую строку
        }

        # Получаем все строки с таким же operation_type и expense_income
        existing_mappings = frappe.get_all(
            'E-Taxes VAT Account Mapping',
            filters=filters,
            fields=['name', 'classification_code']
        )

        # Проверяем есть ли дубликат
        for mapping in existing_mappings:
            existing_code = mapping.get('classification_code') or None

            # Сравниваем classification_code (учитывая что None == пустая строка)
            if current_code == existing_code:
                if current_code:
                    frappe.throw(
                        f'Duplicate mapping found: Operation Type "{self.operation_type}", '
                        f'Expense/Income "{self.expense_income}", '
                        f'Classification Code "{current_code}" already exists. '
                        f'Each combination must be unique.'
                    )
                else:
                    frappe.throw(
                        f'Duplicate mapping found: Operation Type "{self.operation_type}", '
                        f'Expense/Income "{self.expense_income}" '
                        f'with empty Classification Code already exists. '
                        f'Each combination must be unique.'
                    )
