from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def conf_custom_choice():
    """
    Добавление поля cust_field_conf_id в таблицы multichoice
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202509301325_conf_custom_choice )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    print('Запуск патча conf_custom_choice')
    print('Добавление поля cust_field_conf_id в таблицы multichoice для привязки списков выбора к конфигурациям')
    
    # Синхронизируем кастомные поля для всех моделей
    models.CmfTask.custom_field_sync(skip_choice_data_sync=True)
    
    # Проходим по всем моделям
    for model_name in vars(models):
        # Ищем кастомные таблицы выбора (multichoice) - они заканчиваются на 'Ch'
        if model_name.startswith('CmfTaskCf') and model_name.endswith('Ch'):
            model = vars(models)[model_name]
            try:
                print(f'Проверяем таблицу {model_name}')
                try:
                    # Получаем список колонок таблицы
                    columns = [c['name'] for c in models.CmfTask.dp.data_driver.inspect_table_columns(model.tablename)]
                except Exception as e:
                    print(f'Таблица {model_name} не существует: {e}')
                    continue
                
                # Проверяем наличие поля cust_field_conf_id
                if 'cust_field_conf_id' not in columns:
                    print(f'Добавляем поле cust_field_conf_id в таблицу {model_name}')
                    model.dp.data_driver.add_custom_column(model.tablename, 'cust_field_conf_id', fields.CmfStr64)
                else:
                    print(f'Поле cust_field_conf_id уже существует в таблице {model_name}')
            except Exception as e:
                print(f'Ошибка при обработке таблицы {model_name}: {e}')
                raise e
    
    print('Патч conf_custom_choice успешно завершен')


if __name__ == "__main__":
    conf_custom_choice()
