import json
import os

from frappe.utils import get_bench_path

# Доктайпы erpnext, у которых в апстриме не стоит галка 'Translate Link Fields'
# (translated_doctype), но чьи значения-данные (имена записей) нужно переводить.
# Путь указывается относительно apps/erpnext/.
TRANSLATED_DOCTYPES = [
    (
        "erpnext/buying/doctype/supplier_scorecard_standing/supplier_scorecard_standing.json",
        "Supplier Scorecard Standing",
    ),
    (
        "erpnext/buying/doctype/supplier_scorecard_variable/supplier_scorecard_variable.json",
        "Supplier Scorecard Variable",
    ),
    (
        "erpnext/stock/doctype/uom_category/uom_category.json",
        "UOM Category",
    ),
]


def update_doctype():
    """Принудительно включаем флаг 'Translate Link Fields' (translated_doctype)
    у перечисленных доктайпов erpnext.

    У этих доктайпов в апстриме галка не стоит, поэтому значения их записей
    (стандинги, переменные скоркарты) нигде не переводятся. С translated_doctype=1
    доктайп попадает в frappe.boot.translated_doctypes, и любое Link-поле,
    ссылающееся на него, прогоняет значение через __() — перевод берётся из
    .po/extras.po.

    Правим JSON файлов доктайпов в erpnext. Применится при следующем bench migrate:
    Frappe сравнивает migration_hash (хеш содержимого файла) и переимпортирует
    доктайп, т.к. содержимое изменилось (см. frappe/modules/import_file.py).
    """
    bench_path = get_bench_path()

    for rel_path, doctype in TRANSLATED_DOCTYPES:
        file_path = os.path.join(bench_path, "apps", "erpnext", rel_path)

        try:
            with open(file_path, "r", encoding="utf-8") as f:
                data = json.load(f)
        except FileNotFoundError:
            print(f"❌ Файл доктайпа не найден: {file_path} (erpnext не установлен?)")
            continue
        except json.JSONDecodeError:
            print(f"❌ Ошибка чтения JSON доктайпа {doctype}.")
            continue

        if data.get("translated_doctype") == 1:
            print(f"ℹ️ translated_doctype уже включён для {doctype}, пропускаем.")
            continue

        data["translated_doctype"] = 1

        # Тот же формат, что использует экспортёр Frappe: отступ в 1 пробел,
        # ключи отсортированы — чтобы diff к апстриму был минимальным.
        with open(file_path, "w", encoding="utf-8") as f:
            json.dump(data, f, indent=1, sort_keys=True, ensure_ascii=False)
            f.write("\n")

        print(f"✅ translated_doctype включён для {doctype} "
              "(перевод применится при следующем bench migrate).")
