import sys
import os

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from model.database import AppliedJob, Job, async_session
import asyncio

from sqlalchemy import select, update, func
from sqlalchemy.orm import joinedload
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
# from model.database import AppliedJob, Job
from sqlalchemy.sql import and_
from sqlalchemy.orm import sessionmaker

from dotenv import load_dotenv
import os

# Загружаем переменные окружения
load_dotenv()

# Правильная строка подключения
DATABASE_URL = os.getenv('DATABASE_URL')  # Должно быть "mysql+aiomysql://..." или "postgresql+asyncpg://..."

# Создаём асинхронный движок
# async_engine = create_async_engine(DATABASE_URL, echo=True)
async_engine = create_async_engine(DATABASE_URL, echo=True, pool_recycle=1800, pool_size=10, pool_pre_ping=True )


# Создаём фабрику сессий
async_session = sessionmaker(async_engine, class_=AsyncSession, expire_on_commit=False)

async def promote_backlogged_to_scheduled(db: async_session):
    # Получаем всех уникальных client_id, у которых есть Backlogged
    result = await db.execute(
        select(AppliedJob.client_id)
        .where(AppliedJob.status == "Backlogged")
        .distinct()
    )
    client_ids = [row[0] for row in result.fetchall()]

    for client_id in client_ids:
        # Выбираем до 5 самых новых Backlogged вакансий для клиента
        result = await db.execute(
            select(AppliedJob)
            .join(AppliedJob.job)  # ⬅️ Явно присоединяем таблицу jobs
            .options(joinedload(AppliedJob.job))  # Чтобы подгрузить Job в объект
            .where(
                and_(
                    AppliedJob.client_id == client_id,
                    AppliedJob.status == "Backlogged"
                )
            )
            .order_by(Job.date_posted.desc())
            .limit(5)
        )
        jobs_to_update = result.scalars().all()

        for job in jobs_to_update:
            job.status = "Scheduled"  # Меняем статус

    await db.commit()
    return {"message": f"Обновлено клиентов: {len(client_ids)}"}


async def main():
    async with async_session() as session:
        await promote_backlogged_to_scheduled(session)

if __name__ == "__main__":
    asyncio.run(main())
