from typing import Optional, List
from sqlalchemy.ext.asyncio import AsyncSession
from src.crud.usuarios import UsuarioCRUD
from src.schemas.usuarios import (
    UsuarioCreate,
    UsuarioUpdate,
    Usuario as UsuarioSchema
)
from src.core.timezone import get_now_brasil


class UsuarioService:
    def __init__(self):
        self.crud = UsuarioCRUD()

    async def get_usuario(
        self,
            db: AsyncSession,
            usuario_id: int) -> Optional[UsuarioSchema]:
        usuario = await self.crud.get_by_id(db, usuario_id)
        return usuario

    async def get_or_create_usuario(
        self,
            db: AsyncSession,
            nome: str) -> UsuarioSchema:
        """
        Busca um usuário pelo nome. Se não existir, cria um novo.
        """
        usuario = await self.crud.get_by_nome(db, nome)
        if usuario:
            return usuario

        payload = UsuarioCreate(nome=nome, ativo=True)
        usuario = await self.crud.create(db, payload)
        return usuario

    async def list_usuarios(
        self,
        db: AsyncSession,
        *,
        ativo: Optional[bool] = None,
        nome: Optional[str] = None,
    ) -> List[UsuarioSchema]:
        usuarios = await self.crud.list(db, ativo=ativo, nome=nome)
        return usuarios

    async def create_usuario(
        self,
            db: AsyncSession,
            payload: UsuarioCreate) -> UsuarioSchema:
        usuario = await self.crud.create(db, payload)
        return usuario

    async def update_usuario(
        self,
            db: AsyncSession,
            usuario_id: int,
            payload: UsuarioUpdate) -> Optional[UsuarioSchema]:
        usuario = await self.crud.update(db, usuario_id, payload)
        return usuario

    async def delete_usuario(self, db: AsyncSession, usuario_id: int) -> bool:
        return await self.crud.delete(db, usuario_id)

    async def update_ultimo_login(
        self,
            db: AsyncSession,
            usuario_id: int) -> Optional[UsuarioSchema]:
        """
        Atualiza o último login do usuário para o momento atual.
        """
        payload = UsuarioUpdate(ultimo_login=get_now_brasil())
        return await self.crud.update(db, usuario_id, payload)
