from patch.include import *
from tqdm import tqdm


@app_context(commit=True)
def migrate_tokens_to_access_token_table():
    """
    Миграция токенов из полей CmfPerson (api_token_hash, webhook_token_hash) в таблицу CmfAccessToken.
    
    Для тестирования патча: ( cd /opt/eva-app; python3 -m patch.202512031637_migrate_tokens_to_access_token_table )
    """
    print('=' * 80)
    print('Запуск патча: миграция токенов в CmfAccessToken')
    print('=' * 80)
    
    migrated_api = 0
    migrated_webhook = 0
    
    # Загружаем пользователей, у которых есть хотя бы один токен
    print("\n1. Подготовка данных...")
    base_filter = ['OR', ['api_token_hash', '!=', None], ['webhook_token_hash', '!=', None]]

    total_api = models.CmfPerson.count(filter=['api_token_hash', '!=', None])
    total_webhook = models.CmfPerson.count(filter=['webhook_token_hash', '!=', None])

    print(f"Найдено пользователей с API токенами: {total_api}")
    print(f"Найдено пользователей с Webhook токенами: {total_webhook}")

    # Мигрируем токены батчами, не держа весь список в памяти
    limit = 500
    while True:
        persons = models.CmfPerson.list(
            filter=base_filter,
            fields=['id', 'api_token_hash', 'webhook_token_hash', 'name'],
            limit=limit,
        )
        if not persons:
            break

        for person in tqdm(persons, desc="Миграция токенов"):
            api_hash = person.api_token_hash
            webhook_hash = person.webhook_token_hash

            if api_hash:
                api_token = models.CmfAccessToken(
                    parent=person,
                    name='Migrated API Token',
                    hash=api_hash,
                    type='api',
                    cmf_owner=person
                )
                api_token.save()
                migrated_api += 1
                person.api_token_hash = None

            if webhook_hash:
                webhook_token = models.CmfAccessToken(
                    parent=person,
                    name='Migrated Webhook Token',
                    hash=webhook_hash,
                    type='webhook',
                    cmf_owner=person
                )
                webhook_token.save()
                migrated_webhook += 1
                person.webhook_token_hash = None

            person.save(only_data=True)
    
    # Отчет
    print("\n" + "=" * 80)
    print("РЕЗУЛЬТАТЫ МИГРАЦИИ")
    print("=" * 80)
    print(f"API токенов мигрировано: {migrated_api}/{total_api}")
    print(f"Webhook токенов мигрировано: {migrated_webhook}/{total_webhook}")
    print(f"Всего токенов: {migrated_api + migrated_webhook}/{total_api + total_webhook}")
    print("\n✓ Миграция завершена!")
    print("=" * 80)


if __name__ == "__main__":
    migrate_tokens_to_access_token_table()
