import datetime

from uuid import UUID
from typing import Optional
from pydantic import BaseModel, Field, field_validator, ConfigDict


class ActivityBase(BaseModel):
    computador_id: UUID = Field(..., alias="computador_id")
    data_hora: Optional[datetime.datetime] = Field(None, alias="data_hora")
    nome_usuario: Optional[str] = Field(None, alias="nome_usuario")
    evento: Optional[str] = None
    processo: Optional[str] = None
    eh_navegador: Optional[bool] = Field(None, alias="eh_navegador")
    nome_janela: Optional[str] = Field(None, alias="nome_janela")
    descricao: Optional[str] = None
    duracao: Optional[datetime.time] = None
    pid: Optional[int] = None
    cliques: Optional[int] = None
    teclas: Optional[int] = None

    model_config = ConfigDict(
        from_attributes=True,
        validate_assignment=True,
    )

    @field_validator("data_hora", mode="before")
    @classmethod
    def parse_data_hora(cls, v):
        """Parse datetime from various formats and remove timezone info"""
        if v is None:
            return None
        if isinstance(v, datetime.datetime):
            if v.tzinfo is not None:
                return v.replace(tzinfo=None)
            return v
        if isinstance(v, str):
            v = v.strip()
            if ' ' in v and 'T' not in v:
                v = v.replace(' ', 'T', 1)
            if '+' in v:
                v = v.split('+')[0]
            elif v.rfind('-') > 10:
                v = v[:v.rfind('-')]
            try:
                return datetime.datetime.fromisoformat(v)
            except ValueError:
                try:
                    return datetime.datetime.strptime(v, "%Y-%m-%d %H:%M:%S")
                except ValueError:
                    return None
        return v

    @field_validator("duracao", mode="before")
    @classmethod
    def coerce_duracao(cls, v):
        if v is None:
            return None
        if isinstance(v, str):
            v_str = v.strip().lower()
            if v_str in {"nao se aplica", "n/a", "na", ""}:
                return None
        return v


class ActivityCreate(ActivityBase):
    pass


class ActivityUpdate(ActivityBase):
    pass


class ActivityResponse(ActivityBase):
    id: UUID = Field(..., description="ID da atividade")


class ActivitiesCreateResponse(BaseModel):
    inserted: int = Field(
        ..., description="Número de atividades inseridas com sucesso"
    )
