from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from typing import List
from src.models.classificacao import Classifier
from src.schemas.classificacao import ClassifierCreate, ClassifierUpdate


class ClassifierCRUD:
    async def get_classifiers(self, db: AsyncSession) -> List[Classifier]:
        query = select(Classifier)
        result = await db.execute(query)
        return result.scalars().all()

    async def create_classifiers(
        self, db: AsyncSession, activities_data: List[ClassifierCreate]
    ) -> List[Classifier]:
        created_activities = []
        for item in activities_data:
            model_data = item.dict()
            classifier = Classifier(
                **{k: v for k, v in model_data.items() if v is not None})
            db.add(classifier)
            created_activities.append(classifier)
        await db.commit()
        for activity in created_activities:
            await db.refresh(activity)
        return created_activities

    async def update_classifier(
        self, db: AsyncSession,
        empresa: str,
        sistema: str,
        update_data: ClassifierUpdate
    ) -> Classifier:
        query = select(Classifier).where(
            Classifier.empresa == empresa,
            Classifier.sistema == sistema
        )
        result = await db.execute(query)
        classifier = result.scalars().one_or_none()
        if not classifier:
            return None
        update_dict = update_data.dict(exclude_unset=True)
        for key, value in update_dict.items():
            setattr(classifier, key, value)
        await db.commit()
        await db.refresh(classifier)
        return classifier


crud = ClassifierCRUD()
