from typing import Optional
from datetime import datetime
from pydantic import BaseModel, Field, ConfigDict


class VersaoBase(BaseModel):
    versao: str = Field(
        ...,
        description="Versão do aplicativo (ex: 1.0.0)",
        min_length=1,
        max_length=20,
    )
    build: int = Field(..., description="Número do build", ge=1)
    nomeArquivo: str = Field(
        ...,
        description="Nome do arquivo",
        min_length=1,
        max_length=255,
    )
    caminhoArquivo: str = Field(
        ...,
        description="Caminho do arquivo",
        min_length=1,
        max_length=255,
    )
    hashSha256: str = Field(
        "",
        description="Hash SHA256 do arquivo",
        min_length=0,
        max_length=64,
    )
    tamanhoBytes: int = Field(
        ...,
        description="Tamanho do arquivo em bytes",
        ge=0,
    )
    changelog: Optional[str] = Field(None, description="Changelog da versão")
    atualizacaoObrigatoria: bool = Field(
        False, description="Se a atualização é obrigatória")
    ativo: bool = Field(True, description="Se a versão está ativa/disponível")

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


class VersaoCreate(VersaoBase):
    pass


class VersaoUpdate(BaseModel):
    versao: Optional[str] = Field(None, min_length=1, max_length=20)
    build: Optional[int] = Field(None, ge=1)
    nomeArquivo: Optional[str] = Field(None, min_length=1, max_length=255)
    caminhoArquivo: Optional[str] = Field(None, min_length=1, max_length=255)
    hashSha256: Optional[str] = Field(None, min_length=0, max_length=64)
    tamanhoBytes: Optional[int] = Field(None, ge=0)
    changelog: Optional[str] = Field(None)
    atualizacaoObrigatoria: Optional[bool] = Field(None)
    ativo: Optional[bool] = Field(None)

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


class Versao(VersaoBase):
    id: int = Field(..., description="ID da versão")
    dataRelease: datetime = Field(..., description="Data de release")

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


class VersaoResponse(Versao):
    pass


class CheckUpdateResponse(BaseModel):
    """Response para verificação de atualização"""
    has_update: bool = Field(..., description="Se há atualização disponível")
    current_version: Optional[str] = Field(
        None, description="Versão atual fornecida")
    current_build: Optional[int] = Field(
        None, description="Build atual fornecido")
    latest_version: Optional[str] = Field(
        None, description="Última versão disponível")
    latest_build: Optional[int] = Field(
        None, description="Último build disponível")
    update_mandatory: Optional[bool] = Field(
        None, description="Se a atualização é obrigatória")
    versao: Optional[Versao] = Field(None, description="Detalhes da versão")

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