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


class PalavrasService:
    @staticmethod
    async def criar(db: AsyncSession, payload: PalavraCreate) -> Palavras:
        existing_result = await db.execute(
            select(Palavras).where(Palavras.palavra == payload.palavra)
        )
        existing: Optional[Palavras] = existing_result.scalar_one_or_none()
        if existing:
            return existing

        obj = Palavras(palavra=payload.palavra)
        db.add(obj)
        try:
            await db.commit()
        except IntegrityError:
            await db.rollback()
            again = await db.execute(
                select(Palavras).where(Palavras.palavra == payload.palavra)
            )
            found = again.scalar_one_or_none()
            if found:
                return found
            raise
        await db.refresh(obj)
        return obj

    @staticmethod
    async def listar(
        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())

    @staticmethod
    async def deletar(db: AsyncSession, palavra_id: int) -> bool:
        result = await db.execute(
            select(Palavras.id).where(Palavras.id == int(palavra_id))
        )
        exists = result.scalar_one_or_none()
        if not exists:
            return False
        await db.execute(
            delete(Palavras).where(Palavras.id == int(palavra_id))
        )
        await db.commit()
        return True
