import asyncio

from celery.app import Celery
from sqlmodel import Session, func, select

from rvpc.celery.publisher import publish_event
from rvpc.db import engine
from rvpc.locks import check_loc, release_loc
from rvpc.models.models import Video
from rvpc.pydantic_models import CardCount, CardCounts
from rvpc.settings import rmq_settings

celery_app = Celery(
    __name__, broker=rmq_settings.broker_url, backend=rmq_settings.back_url
)


@celery_app.task(ignore_result=True)
def count_cards():
    with Session(engine) as session:
        if check_loc(session=session, category=1, id=1):
            try:
                stmt = (
                    select(Video.location_name, func.count(Video.id))
                    .select_from(Video)
                    .group_by(Video.location_name)
                )
                count = session.exec(stmt).all()

                msg_body = CardCounts(
                    locations=[
                        CardCount(location_name=loc[0], value=loc[1])
                        for loc in count
                    ]
                )
                msg = msg_body.model_dump_json()

                asyncio.run(publish_event(msg))
            finally:
                release_loc(session=session, category=1, id=1)
