"""Русские пользовательские имена; код функций совместим с MicroPython FEMM 5."""

PROPERTY_NAMES = {
    'Air':'Воздух','air':'Воздух','Air-reference':'Воздух — опорная область',
    'A0':'Граница A = 0','a0':'Граница A = 0','A=0':'Граница A = 0',
    'outer-A0':'Внешняя граница A = 0','Left-A':'Левая граница A',
    'Right-A':'Правая граница A','Left':'Левая граница','Right':'Правая граница',
    'Inner':'Внутренняя граница','Outer':'Внешняя граница',
    'Winding':'Обмоточная область','winding':'Обмоточная область',
    'Stator Winding':'Обмотка статора','IdealWinding':'Идеализированная обмотка',
    'LinearSteel':'Линейная сталь','NonlinearSteel':'Нелинейная сталь',
    'Steel':'Сталь','iron':'Сталь','1018 steel':'Сталь 1018',
    'Silicon Core Iron':'Кремнистая электротехническая сталь',
    'Core2000':'Магнитопровод — относительная проницаемость 2000',
    'Magnet':'Постоянный магнит','Coil':'Катушка',
    'Primary':'Первичная обмотка','Secondary':'Вторичная обмотка',
    'Armature':'Обмотка якоря','Field':'Обмотка возбуждения',
    'PhaseA':'Фаза A','PhaseB':'Фаза B','PhaseC':'Фаза C',
    'Copper':'Медь','copper':'Медь','Aluminum':'Алюминий',
    'Dielectric':'Диэлектрик','Insulation':'Изоляция','Solid':'Сплошная среда',
    'Supply':'Источник питания','Return':'Обратный проводник',
    'screen-material':'Материал экрана',
}

FILE_WORDS = {
    'model':'Модель','case':'Вариант','control':'Контрольный-образец',
    'base':'Базовый','baseline':'Исходный','reference':'Эталон',
    'results':'Результаты','result':'Результат','report':'Отчёт',
    'receipt':'Исходный-протокол','provenance':'Происхождение',
    'manifest':'Состав-файлов','context':'Условия-проверки','readme':'Порядок-работы',
    'parameters':'Параметры','machine':'Машина','winding':'Обмотка',
    'open':'Открытый','load':'Нагрузка','loaded':'Нагруженный','exc':'Возбуждение',
    'sc':'Короткое-замыкание','scc':'Короткое-замыкание','occ':'Холостой-ход',
    'mutual':'Взаимный','source':'Источник','solid':'Массивный','ring':'Кольцо',
    'force':'Сила','level':'Уровень','refined':'Уточнённый','series':'Серия',
    'step':'Шаг','input':'Вход','eps':'Диэлектрическая-проницаемость',
    'core':'Магнитопровод','iteration':'Итерация','shield':'Экран',
    'matrix':'Матрица','pair':'Пара','plus':'Плюс','minus':'Минус',
    'strands':'Элементарные-проводники','eccentric':'Эксцентриситет',
    'practice':'Практикум','tube':'Труба','balanced':'Симметричный',
    'unbalanced':'Несимметричный','heat':'Тепло','three':'Трёх',
    'phase':'Фаза','pivot':'Шарнир','rotating':'Вращение','angle':'Угол',
    'toothtip':'Коронка-зубца','current':'Ток','whole':'Полный',
    'coax':'Коаксиальный','pitch':'Шаг-обмотки','sensor':'Датчик',
    'rounding':'Скругление','shorted':'Короткозамкнутый','course':'Учебный',
    'magnetic':'Магнитный','notch':'Надрез','carter':'Картер',
    'magmesh':'Магнитная-сетка','power':'Мощность','parallel':'Параллельный',
    'transposed':'Транспонированный','solenoid':'Катушка','column':'Стержень',
    'transformer':'Трансформатор','eval':'Проверка','anisotropic':'Анизотропный',
    'isotropic':'Изотропный','microstrip':'Микрополосковая-линия','axis':'Ось',
    'linear':'Линейный','nonlinear':'Нелинейный','port':'Вывод',
    'uniformt':'Равномерная-температура','delta':'Треугольник','div':'Дивергенция',
    'domain':'Расчётная-область','checkpoint':'Контрольное-состояние',
    'gap':'Зазор','emde':'Электромагнитная-система',
    'dc':'Постоянный-ток','ac':'Переменный-ток','circuit':'Цепь',
    'stator':'Статор','healthy':'Без-дефекта','gauge':'Уровень-потенциала',
    'unit':'Единичный','fingers':'Пальцевые-электроды','overhead':'Воздушная-линия',
    'wires':'Провода','needle':'Игла','sector':'Сектор','pole':'Полюс',
    'plane':'Плоскость','harmonic':'Гармонический','katona':'Катона',
    'template':'Заготовка','secondary':'Вторичная-обмотка','primary':'Первичная-обмотка',
    'fine':'Мелкая-сетка','outer':'Внешний','regulation':'Регулирование',
    'validation':'Проверка','layers':'Слои','rotated':'Поворот',
    'bare':'Без-экрана','screened':'С-экраном','feedback':'Обратная-связь',
    'limit':'Ограничение','graded':'Градуированный','single':'Одиночный',
    'interface':'Граница-раздела','losses':'Потери','floating':'Изолированный',
    'calibration':'Калибровка','cal':'Калибровка','rogowski':'Роговский',
    'sphere':'Сфера','solved':'Решение','mytransformer':'Учебный-трансформатор',
    'electrostatic':'Электростатика','multicoil':'Многокатушечный',
    'induction':'Индукционный','synchronous':'Синхронный','short':'Короткий',
    'state':'Состояние','rotor':'Ротор','cross':'Перекрёстный',
    'secant':'Секущая','large':'Большой','steel':'Сталь','fill':'Заполнение',
    'conformal':'Конформный','my':'Учебный','motor':'Двигатель',
    'medium':'Средняя-сетка','only':'Только','torque':'Момент',
    'benchmark':'Контрольная-задача','coupled':'Связанные-катушки',
    'electromagnet':'Электромагнит','coarse':'Грубая-сетка','finest':'Наиболее-мелкая-сетка',
    'hydro':'Гидрогенератор','turbo':'Турбогенератор','boundary':'Граница',
    'scan':'Сканирование','bias':'Смещение','optimum':'Оптимум','coil':'Катушка',
    'magnet':'Магнит','rectangle':'Прямоугольник','background':'Внешнее-поле',
    'compact':'Компактный','double':'Двойной','doubled':'Удвоенный',
    'doublesidedlim':'Двусторонний-линейный-двигатель',
    'effective':'Эффективный','even':'Чётный','odd':'Нечётный','flux':'Поток',
    'horse':'Подковообразный','lim':'Линейный-двигатель','mapped':'Преобразованный',
    'marking':'Разметка','physical':'Физический','probe':'Измерение',
    'reversed':'Обратный','seed':'Исходный','selected':'Выбранный','sided':'Сторонний',
    'strict':'Строгий','wedge':'Клин','fundamental':'Основная-гармоника',
    'mesh':'Сетка','srm':'Вентильно-индукторная-машина',
    'spm':'Поверхностные-магниты','ipm':'Внутренние-магниты',
    'pm':'Постоянные-магниты','synrm':'Синхронная-реактивная-машина',
    'agb':'Специальный-воздушный-зазор','lrk':'Обмотка-LRK','team':'Задача-TEAM',
    'data':'Данные','output':'Результаты','comparison':'Сравнение',
    'summary':'Сводка','checks':'Проверки','check':'Проверка','fields':'Поля',
    'status':'Состояние','readiness':'Готовность','formula':'Формулы',
    'audit':'Сверка','bibliography':'Библиография','review':'Проверка',
    'teaching':'Учебный','verification':'Проверка-расчёта','convergence':'Сходимость',
    'geometry':'Геометрия','energy':'Энергия','spectra':'Спектры','spectrum':'Спектр',
    'physics':'Физика','numerics':'Численные-методы','final':'Итоговый',
    'edition':'Редакция','plan':'План','gates':'Условия-приёмки','run':'Запуск',
    'runtime':'Среда-выполнения','version':'Версия','stdout':'Журнал-вывода',
    'stderr':'Журнал-ошибок','measurement':'Измерение','measurements':'Измерения',
    'patch':'Изменения','inputdata':'Исходные-данные','settings':'Настройки',
    'native':'Расчёт-FEMM','field':'Поле','scope':'Границы-применимости',
    'experiments':'Опыты','stage':'Этап','stages':'Этапы','table':'Таблица',
    'iterations':'Итерации','publication':'Публикация','expected':'Ожидаемые-значения',
    'reproduction':'Воспроизведение','complete':'Завершённый','angular':'Угловой',
    'map':'Карта','mapping':'Преобразование','characteristic':'Характеристика',
    'characteristics':'Характеристики','replay':'Повторный-расчёт','portable':'Переносимый',
    'task':'Задание','material':'Материал','materials':'Материалы','catalog':'Перечень',
    'slots':'Пазы','slot':'Паз','evaluations':'Расчётные-точки','key':'Ответы',
    'cases':'Варианты','full':'Полный','contract':'Исходные-условия',
    'progress':'Ход-расчёта','forces':'Силы','dynamics':'Динамика','edges':'Кромки',
    'curve':'Кривая','curves':'Кривые','samples':'Образцы','recipe':'Порядок-запуска',
    'arc':'Дуга','self':'Собственный','conductor':'Проводник','conductors':'Проводники',
    'spatial':'Пространственный','harmonics':'Гармоники','study':'Исследование',
    'studies':'Исследования','independent':'Независимый','adaptation':'Адаптация',
    'models':'Модели','emf':'ЭДС','transposition':'Транспозиция','partition':'Разбиение',
    'permeance':'Магнитная-проводимость','derivative':'Производная','air':'Воздух',
    'reactor':'Реактор','release':'Редакция','evidence':'Расчётные-доказательства',
    'quantities':'Величины','closure':'Согласование','execution':'Выполнение',
    'sweep':'Серия-режимов','raw':'Исходный','derivation':'Вывод',
    'sources':'Первоисточники','materialized':'Сохранённый','reluctance':'Магнитное-сопротивление',
    'hodographs':'Годографы','labs':'Практикумы','profile':'Профиль',
    'difference':'Разность','similarity':'Подобие','planar':'Плоская-модель',
    'precision':'Точность','airgap':'Воздушный-зазор','design':'Конструкция',
    'analytical':'Аналитический','analytic':'Аналитический','scheme':'Схема',
    'arkkio':'Арккио','swing':'Качания','shaft':'Вал','correction':'Поправка',
    'dynamic':'Динамический','half':'Половина','search':'Поиск','candidate':'Кандидат',
    'criteria':'Критерии','actual':'Расчётный','comparisons':'Сравнения',
    'windings':'Обмотки','voltage':'Напряжение','frozen':'Замороженная-проницаемость',
    'rapidim':'Метод-RAPIDIM','skew':'Скос','depth':'Глубина','methods':'Методы',
    'jacobian':'Матрица-Якоби','postprocess':'Обработка-результатов','inventory':'Состав',
    'resistance':'Сопротивление','ledger':'Перечень','mtpa':'Максимальный-момент-на-ампер',
    'chunk':'Часть','driver':'Запуск','circle':'Окружность','original':'Исходный',
    'originals':'Оригиналы','files':'Файлы','first':'Первый','metrics':'Показатели',
    'elements':'Элементы','nodes':'Узлы','cells':'Ячейки','analogy':'Аналогия',
    'transient':'Переходный-процесс','faraday':'Фарадей','angles':'Углы',
    'extensions':'Дополнения','coefficients':'Коэффициенты','profiles':'Профили',
    'waveforms':'Временные-зависимости','waveform':'Временная-зависимость',
    'programs':'Программы','pot':'Потенциал','parent':'Исходный','two':'Два',
    'section':'Раздел','stress':'Напряжения','tubes':'Трубы','figure':'Рисунок',
    'pedagogy':'Учебный-порядок','device':'Устройство','wrapper':'Оболочка',
    'supersession':'Соответствие-версий','theory':'Теория','optimization':'Оптимизация',
    'controls':'Проверки','inductance':'Индуктивность','eccentricity':'Эксцентриситет',
    'triangles':'Треугольники','static':'Статический','all':'Все',
    'hashes':'Контрольные-суммы','and':'и','spec':'Исходные-данные','bundle':'Набор-файлов',
    'calculation':'Расчёт','editorial':'Редакционная-проверка','integrals':'Интегралы',
    'points':'Точки','component':'Покомпонентный','trilinear':'Трилинейный',
    'means':'Средние-значения','sensitivity':'Чувствительность',
    'trajectory':'Траектория','requests':'Задания','nameplate':'Паспортные-данные',
    'derived':'Производные-величины','states':'Состояния',
    'dipole':'Диполь','asymptotic':'Асимптотическая-граница','helmholtz':'Гельмгольц',
    'sample':'Образец','temp':'Временный','latest':'Последний',
    'rebuild':'Повторное-построение','rebuilt':'Повторно-построенный',
    'increment':'Приращение','contour':'Контур','synthetic':'Условный','loop':'Петля',
    'electric':'Электрический','jobs':'Расчётные-задания','error':'Ошибка',
    'demagnetization':'Размагничивание','loss':'Потери','passport':'Описание',
    'levitron':'Левитрон','temperature':'Температура','frequency':'Частота',
    'identification':'Определение-параметров','circuits':'Цепи','newton':'Ньютон',
    'plain':'Обычный','smoke':'Быстрая-проверка',
}


def russian_name(value):
    if not isinstance(value,str):return value
    if value in PROPERTY_NAMES:return PROPERTY_NAMES[value]
    for prefix,label in [('N55_','Постоянный магнит N55 — участок '),
                         ('SectorAnti-','Антипериодическая граница сектора '),
                         ('apbc','Антипериодическая граница '),
                         ('S','Обмотка статора S'),('R','Обмотка ротора R'),
                         ('c','Цепь c')]:
        if value.startswith(prefix) and value[len(prefix):].isdigit():
            return label+value[len(prefix):]
    return value


def russian_file(value):
    if not isinstance(value,str):return value
    pos=max(value.rfind('/'),value.rfind('\\'))
    prefix,name=value[:pos+1],value[pos+1:]
    if '.' not in name:return value
    stem,extension=name.rsplit('.',1)
    if stem.upper() in ['LICENSE','NOTICE','ATTRIBUTION','COPYING','AUTHORS']:
        return value
    if not stem or extension.lower() not in ['fem','ans','fee','res','fec','anc','feh','anh','json','csv','txt','md','svg','png','html']:
        return value
    # Обозначения топологий и параметров не меняют физического смысла имени.
    stem=stem.replace('no-load','Холостой-ход').replace('open-wedge','Открытый-паз')
    if stem.startswith('case-'):stem=stem.replace('-open-','-Холостой-ход-')
    out=[];word=''
    for char in stem+'\0':
        if 'A'<=char<='Z' or 'a'<=char<='z':word+=char;continue
        if word:
            descriptor={'team':'Задача-','lrk':'Обмотка-','rapidim':'Метод-'}.get(word.lower())
            out.append(word if descriptor and ''.join(out).endswith(descriptor) else FILE_WORDS.get(word.lower(),word));word=''
        if char!='\0':out.append(char)
    stem=''.join(out)
    if not any('А'<=c<='я' or c in 'Ёё' for c in stem):stem='Модель-'+stem
    return prefix+stem+'.'+extension.lower()
