from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def icap_servers_migration():
    """
    Миграция данных ICAP сервера из старого формата (строка host:port) в новый формат (список icap://host:port/service).
    
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202511141604_icap_servers_migration )
    """
    print('Запуск патча icap_servers_migration')
    
    # Получаем глобальные настройки
    global_settings = models.CmfGlobalSettings.get()
    
    if not global_settings:
        print('Глобальные настройки не найдены, патч завершен')
        return
    
    # Читаем текущее значение icap_server
    # Так как мы уже изменили модель на CmfJson, нужно работать напрямую с БД
    result = models.CmfGlobalSettings.dp.data_driver.Session().execute(
        "SELECT icap_server FROM cmf_global_settings LIMIT 1"
    ).fetchone()
    
    if not result:
        print('Записи в cmf_global_settings не найдены, патч завершен')
        return
    
    old_value = result[0]
    print(f'Текущее значение icap_server: {old_value!r}')
    
    # Определяем новое значение
    new_value = None
    
    if not old_value or old_value.strip() == '':
        # Пустое значение -> пустой список
        new_value = []
        print('Значение пустое, устанавливаем пустой список []')
    else:
        # Конвертируем из формата "host:port" или "host" в "icap://host:port/avscan"
        old_value_str = str(old_value).strip()
        
        # Проверяем, может быть это уже JSON список (на случай повторного запуска патча)
        try:
            import json
            parsed = json.loads(old_value_str)
            if isinstance(parsed, list):
                print(f'Значение уже в формате списка: {parsed}, патч завершен')
                return
        except (json.JSONDecodeError, ValueError):
            pass
        
        # Парсим старый формат
        if ':' in old_value_str:
            # Формат "host:port"
            host, port = old_value_str.rsplit(':', 1)
            try:
                port = int(port)
                new_url = f'icap://{host}:{port}/avscan'
            except ValueError:
                # Порт не является числом, считаем это за host
                new_url = f'icap://{old_value_str}:1344/avscan'
        else:
            # Формат "host"
            new_url = f'icap://{old_value_str}:1344/avscan'
        
        new_value = [new_url]
        print(f'Конвертируем "{old_value_str}" -> {new_value}')
    
    # Обновляем значение в БД
    import json
    models.CmfGlobalSettings.dp.data_driver.Session().execute(
        "UPDATE cmf_global_settings SET icap_server = :new_value",
        {'new_value': json.dumps(new_value, ensure_ascii=False)}
    )
    
    print(f'Значение icap_server успешно обновлено: {new_value}')
    print('Патч icap_servers_migration завершен')


if __name__ == "__main__":
    icap_servers_migration()
