import datetime

from typing import List, Optional
from src.models.atividades import Activity
from sqlalchemy import select, and_, insert
from sqlalchemy.ext.asyncio import AsyncSession
from src.schemas.atividades import ActivityCreate


class ActivityCRUD:
    async def get_activities_cursor(
        self,
        db: AsyncSession,
        computador_id: Optional[str] = None,
        dataHora_de: Optional[datetime.datetime] = None,
        dataHora_ate: Optional[datetime.datetime] = None,
        cursor: Optional[datetime.datetime] = None,
        skip: int = 0,
        limit: int = 50
    ) -> List[Activity]:

        query = select(Activity)
        conditions = []

        if computador_id:
            conditions.append(Activity.computador_id == computador_id)

        if dataHora_de:
            conditions.append(Activity.data_hora >= dataHora_de)

        if dataHora_ate:
            conditions.append(Activity.data_hora <= dataHora_ate)

        if cursor:
            conditions.append(Activity.data_hora < cursor)

        if conditions:
            query = query.where(and_(*conditions))

        query = query.order_by(Activity.data_hora.desc())
        if cursor is None and skip > 0:
            query = query.offset(skip)
        query = query.limit(limit)

        result = await db.execute(query)
        return list(result.scalars())
    async def create_activities(
        self,
        db: AsyncSession,
        items: List[ActivityCreate]
    ) -> List[Activity]:
        """
        Cria múltiplas atividades no banco de dados usando bulk insert.

        Args:
            db: Sessão assíncrona do banco de dados
            items: Lista de schemas ActivityCreate para criar

        Returns:
            Lista de atividades criadas
        """
        model_data_list = []
        for item in items:
            activity_dict = item.model_dump(by_alias=True)
            computador_id_value = activity_dict.get(
                "computador_id") or activity_dict.get("computadorId")
            if computador_id_value:
                if hasattr(computador_id_value, "hex"):
                    computador_id_str = str(computador_id_value)
                elif isinstance(computador_id_value, str):
                    computador_id_str = computador_id_value
                else:
                    computador_id_str = str(computador_id_value)
                activity_dict["computador_id"] = computador_id_str

            model_data = {
                "computador_id": activity_dict.get("computador_id"),
                "nome_usuario": (
                    activity_dict.get("nome_usuario")
                    or activity_dict.get("nomeUsuario")
                ),
                "data_hora": (
                    activity_dict.get("data_hora")
                    or activity_dict.get("dataHora")
                ),
                "evento": activity_dict.get("evento"),
                "processo": activity_dict.get("processo"),
                "eh_navegador": (
                    activity_dict.get("eh_navegador")
                    or activity_dict.get("ehNavegador")
                ),
                "nome_janela": (
                    activity_dict.get("nome_janela")
                    or activity_dict.get("nomeJanela")
                ),
                "descricao": activity_dict.get("descricao"),
                "duracao": activity_dict.get("duracao"),
                "pid": activity_dict.get("pid"),
                "cliques": activity_dict.get("cliques"),
                "teclas": activity_dict.get("teclas"),
            }
            model_data_list.append(model_data)

        result = await db.execute(insert(Activity).values(model_data_list))
        await db.commit()
        inserted_count = result.rowcount

        return inserted_count


crud = ActivityCRUD()
