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


class ConsultorRankingResumoSchema(BaseModel):
    id_pessoa: int
    nome: str
    posicao: Optional[int]
    pontuacao_total: float
    bloco_a: float
    bloco_b: float
    bloco_c: float
    bloco_d: float
    ativo: bool
    anos_atuacao: float
    tipos_atuacao: List[str] = []
    coordenador_ppg: Optional[bool] = None
    consultoria: Optional[dict] = None
    coordenacoes_capes: Optional[list] = None
    inscricoes: Optional[list] = None
    avaliacoes_comissao: Optional[list] = None
    premiacoes: Optional[list] = None
    bolsas_cnpq: Optional[list] = None
    participacoes: Optional[list] = None
    orientacoes: Optional[list] = None
    membros_banca: Optional[list] = None
    pontuacao: Optional[dict] = None


class RankingPaginadoResponseSchema(BaseModel):
    total: int
    page: int
    size: int
    total_pages: int
    consultores: List[ConsultorRankingResumoSchema]


class EstatisticasRankingSchema(BaseModel):
    total_consultores: int
    total_ativos: int
    total_inativos: int
    ultima_atualizacao: Optional[str]
    pontuacao_media: float
    pontuacao_maxima: float
    pontuacao_minima: float
    media_blocos: dict
    distribuicao: List[dict]


class JobStatusSchema(BaseModel):
    running: bool
    progress: int
    processados: int
    total: int
    mensagem: str
    batch_atual: int
    total_batches: int
    tempo_decorrido: Optional[str]
    tempo_estimado: Optional[str]
    inicio: Optional[str]
    fim: Optional[str]
    erro: Optional[str]


class ProcessarRankingRequestSchema(BaseModel):
    limpar_antes: bool = Field(default=True, description="Se deve limpar a tabela antes de processar")


class ProcessarRankingResponseSchema(BaseModel):
    sucesso: bool
    mensagem: str
    job_id: Optional[str] = None


class ConsultaNomeSchema(BaseModel):
    id_pessoa: int
    nome: str
    posicao: Optional[int]
    pontuacao_total: float


class PosicaoRankingSchema(BaseModel):
    id_pessoa: int
    nome: str
    posicao: Optional[int]
    total_consultores: int
    pontuacao_total: float
    bloco_a: float
    bloco_b: float
    bloco_c: float
    bloco_d: float
    ativo: bool
    encontrado: bool = True


class SugestaoConsultorSchema(BaseModel):
    id_pessoa: int
    nome: str
    score_match: float
    areas_avaliacao: List[str] = []
    areas_conhecimento: List[str] = []
    linhas_pesquisa: List[str] = []
    situacao: str = ""
    ies: Optional[str] = None
    foi_coordenador: bool = False
    foi_premiado: bool = False
    posicao_ranking: Optional[int] = None
    pontuacao_ranking: float = 0
    motivos_match: List[str] = []


class SugerirConsultoresRequestSchema(BaseModel):
    tema: str = Field(..., min_length=2, description="Tema ou assunto para buscar consultores")
    area_avaliacao: Optional[str] = Field(None, description="Filtrar por area de avaliacao especifica")
    apenas_ativos: bool = Field(True, description="Filtrar apenas consultores ativos")
    quantidade: int = Field(20, ge=1, le=100, description="Quantidade maxima de sugestoes")


class SugerirConsultoresResponseSchema(BaseModel):
    tema_buscado: str
    total_encontrados: int
    consultores: List[SugestaoConsultorSchema]


class AreaAvaliacaoSchema(BaseModel):
    nome: str
    count: int
