# Generated by Django 5.1.9 on 2025-06-26 20:30

from django.db import migrations
from django.conf import settings
from core.models import AsyncMigrationStatus
from core.redis import start_job_async_or_sync
import logging
logger = logging.getLogger(__name__)

IS_SQLITE = settings.DJANGO_DB == settings.DJANGO_DB_SQLITE

migration_name = '0055_task_proj_octlen_idx_async'

sql_create_index = (
    'CREATE INDEX CONCURRENTLY IF NOT EXISTS task_proj_octlen_idx '
    'ON task (project_id, octet_length(data::text) DESC) '
    'INCLUDE (id);'
)
sql_drop_index = (
    'DROP INDEX CONCURRENTLY IF EXISTS task_proj_octlen_idx;'
)

def forward_migration(migration_name, db_alias):
    migration, created = AsyncMigrationStatus.objects.using(db_alias).get_or_create(
        name=migration_name,
        defaults={'status': AsyncMigrationStatus.STATUS_STARTED},
    )
    if not created:
        return
    
    logger.info(f'Start async migration {migration_name}')
    from django.db import connections
    cursor = connections[db_alias].cursor()
    cursor.execute(sql_create_index)
    migration.status = AsyncMigrationStatus.STATUS_FINISHED
    migration.save(using=db_alias)
    logger.info(f'Async migration {migration_name} complete')

def backward_migration(migration_name, db_alias):
    migration = AsyncMigrationStatus.objects.using(db_alias).create(
        name=migration_name,
        status=AsyncMigrationStatus.STATUS_STARTED,
    )
    logger.info(f'Start revert of async migration {migration_name}')
    from django.db import connections
    cursor = connections[db_alias].cursor()
    cursor.execute(sql_drop_index)
    migration.status = AsyncMigrationStatus.STATUS_FINISHED
    migration.save(using=db_alias)
    logger.info(f'Async migration {migration_name} revert complete')

def forwards(apps, schema_editor):
    if IS_SQLITE:
        logger.info('SQLite execution')
        logger.info('Skipping async index creation for non-PostgreSQL databases')
        return

    db_alias = schema_editor.connection.alias
    start_job_async_or_sync(forward_migration, migration_name=migration_name, db_alias=db_alias)

def backwards(apps, schema_editor):
    db_alias = schema_editor.connection.alias
    start_job_async_or_sync(backward_migration, migration_name=migration_name, db_alias=db_alias)

class Migration(migrations.Migration):
    atomic = False

    dependencies = [
        ("tasks", "0054_add_brin_index_updated_at"),
    ]
    operations = [
        migrations.RunPython(forwards, backwards),
    ]
