from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def custom_fields_fix():
    """
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202309211419_custom_fields_fix )
    Здесь можно работать с моделями через models.CmfTask и т.д.
    Для прогрессбара используйте:
    for task in tqdm(models.CmfTask.list()):
        ...
    """
    return
    print('Запуск патча custom_fields_fix')
    for ui_form in models.CmfUiForm.list(fields=['ui_form_json']):
        for key in ui_form.ui_form_json['ui_fields']:
            if ui_form.ui_form_json['ui_fields'][key].get('field_type') == 'CmfCascadeChoice':
                print(f"Изменим устаревший тип поля {ui_form.ui_form_json['ui_fields'][key].get('field_type')} на CmfM2M")
                ui_form.ui_form_json['ui_fields'][key]['field_type'] = 'CmfM2M'
                ui_form.ui_form_json['ui_fields'][key]['left'] = True
                ui_form.ui_form_json['ui_fields'][key]['model'] = f'CmfTask{"".join([w.capitalize() for w in key.split("_")])}'
            elif ui_form.ui_form_json['ui_fields'][key].get('field_type') == 'CmfM2M':
                if not ui_form.ui_form_json['ui_fields'][key].get('left'):
                    print(f"Неправильная настройка поля {ui_form.ui_form_json['ui_fields'][key]}")
                    ui_form.ui_form_json['ui_fields'][key]['left'] = True
                    ui_form.ui_form_json['ui_fields'][key]['model'] = f'CmfTask{"".join([w.capitalize() for w in key.split("_")])}'
        ui_form.save(only_data=True)
    # ХАК! Был баг в кеше когда разрабатывался этот патч, в будущем так делать нельзя!
    cmf.app.CMF_CACHE.flushdb()
    models.CmfTask.custom_field_sync(skip_choice_data_sync=True)
    for model_name in vars(models):
        # кастомным таблицам надо поля cmf_hidden добавить
        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'Отдельный баг, что тыблицы может не быть: {e}')
                    continue
                if 'cmf_hidden' not in columns:
                    print(f'Добавляем поле в {model_name}')
                    model.dp.data_driver.add_custom_column(model.tablename, 'cmf_hidden', fields.CmfBool)
                    commit_all_ds()
            except Exception as e:
                print(e)
                rollback_all_ds()
                raise e


if __name__ == "__main__":
    custom_fields_fix()
