# Учебная редакция: назначение, единицы и этапы алгоритма пояснены по-русски.
# Исходная программа остаётся самостоятельным свидетельством прежней проверки.
# Запуск: File → Open Python Script в FEMM 5; контроллер может задать CODE_REFERENCE_DIR.
# Проверяем аналитические алгоритмы и имитацию API; полевой расчёт проверяется отдельно.
import os
import json

# Ищем комплект рядом с программой; запасной вариант — текущая папка.
try:
    reference_dir = CODE_REFERENCE_DIR
except NameError:
    try:
        script_path = __file__.replace(chr(92), "/")
        reference_dir = script_path.rsplit("/", 1)[0] if "/" in script_path else os.getcwd()
    except NameError:
        reference_dir = os.getcwd()

lesson_ids = ["II00-1", "II00-2", "II00-4", "II01-2", "II02-2", "II03-3", "II07-2", "II08-2"]
results = []
for lesson_id in lesson_ids:
    path = reference_dir + "/" + lesson_id + "-reference.py"
    with open(path, "r") as stream:
        source = stream.read()
    # Отдельное пространство имён исключает перенос переменных между эталонами.
    namespace = {"__name__": "reference", "__file__": path}
    try:
        # Исполняются только восемь сопровождаемых программ этого учебного комплекта.
        exec(source, namespace)
        detail = namespace["run_checks"]()
        results.append({"lesson": lesson_id, "passed": True, "detail": detail})
    except Exception as error:
        results.append({"lesson": lesson_id, "passed": False, "error": str(error)})
# Результат отмечает каждый отказ; общая успешность требует прохождения всех эталонов.
summary = {"schemaVersion": 1, "scope": "analytic selfchecks and API ordering mock; not a field-validation campaign", "passed": all(row["passed"] for row in results), "results": results}
print("CODE_REFERENCE_RESULT=" + json.dumps(summary))
assert summary["passed"], "At least one code reference failed"
