from typing import Optional, List
from sqlalchemy import select, delete
from src.models.palavras import Palavras
from sqlalchemy.ext.asyncio import AsyncSession
from src.schemas.palavras import PalavraCreate


class PalavrasCRUD:
    async def get_by_id(
        self,
            db: AsyncSession,
            palavra_id: int) -> Optional[Palavras]:
        result = await db.execute(
            select(Palavras).where(Palavras.id == int(palavra_id))
        )
        return result.scalar_one_or_none()

    async def get_by_palavra(
        self,
            db: AsyncSession,
            palavra: str) -> Optional[Palavras]:
        result = await db.execute(
            select(Palavras).where(Palavras.palavra == palavra)
        )
        return result.scalar_one_or_none()

    async def list(
        self,
            db: AsyncSession,
            *,
            palavra: Optional[str] = None) -> List[Palavras]:
        stmt = select(Palavras)
        if palavra:
            stmt = stmt.where(Palavras.palavra.like(f"%{palavra}%"))
        result = await db.execute(stmt)
        return list(result.scalars().all())

    async def create(
        self,
            db: AsyncSession,
            payload: PalavraCreate) -> Palavras:
        obj = Palavras(palavra=payload.palavra)
        db.add(obj)
        await db.commit()
        await db.refresh(obj)
        return obj

    async def delete(self, db: AsyncSession, palavra_id: int) -> bool:
        exists = await db.execute(
            select(Palavras.id).where(Palavras.id == int(palavra_id))
        )
        if exists.scalar_one_or_none() is None:
            return False
        await db.execute(
            delete(Palavras).where(Palavras.id == int(palavra_id))
        )
        await db.commit()
        return True


crud = PalavrasCRUD()
