from pydantic import BaseModel
from typing import List, Optional


class PeriodoSchema(BaseModel):
    inicio: str
    fim: Optional[str] = None
    ativo: bool
    anos_decorridos: float


class IESSchema(BaseModel):
    id: str
    nome: str
    sigla: Optional[str] = None


class VinculoConsultoriaSchema(BaseModel):
    periodo: PeriodoSchema
    ies: Optional[IESSchema] = None
    situacao: str = ""


class CoordenacaoCapesSchema(BaseModel):
    codigo: str
    tipo: str
    area_avaliacao: str
    periodo: PeriodoSchema
    areas_adicionais: List[str]
    ja_coordenou_antes: bool
    presidente: bool = False


class ConsultoriaSchema(BaseModel):
    codigo: str
    situacao: str
    periodo: PeriodoSchema
    vinculos: List[VinculoConsultoriaSchema] = []
    areas: List[str]
    anos_consecutivos: int
    retornos: int


class InscricaoSchema(BaseModel):
    codigo: str
    tipo: str
    premio: str
    ano: int
    situacao: str


class AvaliacaoComissaoSchema(BaseModel):
    codigo: str
    tipo: str
    premio: str
    ano: int
    comissao_tipo: str
    nome_comissao: str = ""


class PremiacaoSchema(BaseModel):
    codigo: str
    tipo: str
    nome_premio: str
    ano: int
    papel: Optional[str] = None


class BolsaCNPQSchema(BaseModel):
    codigo: str
    nivel: str
    area: str


class ParticipacaoSchema(BaseModel):
    codigo: str
    tipo: str
    descricao: str
    ano: Optional[int] = None


class OrientacaoSchema(BaseModel):
    codigo: str
    tipo: str
    nivel: str
    ano: Optional[int] = None
    coorientacao: bool = False
    premiada: bool = False
    premiacao_tipo: Optional[str] = None


class MembroBancaSchema(BaseModel):
    codigo: str
    tipo: str
    nivel: str
    ano: Optional[int] = None


class PontuacaoAtuacaoSchema(BaseModel):
    codigo: str
    base: int
    tempo: int
    bonus: int
    total: int
    quantidade: int


class PontuacaoBlocoSchema(BaseModel):
    bloco: str
    total: int
    atuacoes: List[PontuacaoAtuacaoSchema]


class PontuacaoCompletaSchema(BaseModel):
    bloco_a: PontuacaoBlocoSchema
    bloco_c: PontuacaoBlocoSchema
    bloco_d: PontuacaoBlocoSchema
    pontuacao_total: int


class ConsultorResumoSchema(BaseModel):
    id_pessoa: int
    nome: str
    anos_atuacao: float
    ativo: bool
    veterano: bool
    pontuacao_total: int
    bloco_a: int
    bloco_c: int
    bloco_d: int
    rank: Optional[int] = None


class ConsultorDetalhadoSchema(BaseModel):
    id_pessoa: int
    nome: str
    anos_atuacao: float
    ativo: bool
    veterano: bool
    coordenador_ppg: bool = False
    coordenacoes_capes: List[CoordenacaoCapesSchema]
    consultoria: Optional[ConsultoriaSchema] = None
    inscricoes: List[InscricaoSchema]
    avaliacoes_comissao: List[AvaliacaoComissaoSchema]
    premiacoes: List[PremiacaoSchema]
    bolsas_cnpq: List[BolsaCNPQSchema]
    participacoes: List[ParticipacaoSchema]
    orientacoes: List[OrientacaoSchema]
    membros_banca: List[MembroBancaSchema]
    pontuacao: PontuacaoCompletaSchema
    rank: Optional[int] = None


class RankingResponseSchema(BaseModel):
    total: int
    limite: int
    offset: int
    consultores: List[ConsultorResumoSchema]


class RankingDetalhadoResponseSchema(BaseModel):
    total: int
    limite: int
    consultores: List[ConsultorDetalhadoSchema]
