from dataclasses import dataclass, asdict
from typing import List, Optional, Dict, Any


@dataclass
class PeriodoDTO:
    inicio: str
    fim: Optional[str]
    ativo: bool
    anos_decorridos: float


@dataclass
class CoordenacaoCapesDTO:
    codigo: str
    tipo: str
    area_avaliacao: str
    periodo: PeriodoDTO
    areas_adicionais: List[str]
    ja_coordenou_antes: bool
    presidente: bool


@dataclass
class IESDTO:
    id: str
    nome: str
    sigla: Optional[str] = None


@dataclass
class VinculoConsultoriaDTO:
    periodo: PeriodoDTO
    ies: Optional[IESDTO] = None
    situacao: str = ""


@dataclass
class ConsultoriaDTO:
    codigo: str
    situacao: str
    periodo: PeriodoDTO
    areas: List[str]
    anos_consecutivos: int
    retornos: int
    vinculos: List[VinculoConsultoriaDTO] = None

    def __post_init__(self):
        if self.vinculos is None:
            self.vinculos = []


@dataclass
class InscricaoDTO:
    codigo: str
    tipo: str
    premio: str
    ano: int
    situacao: str


@dataclass
class AvaliacaoComissaoDTO:
    codigo: str
    tipo: str
    premio: str
    ano: int
    comissao_tipo: str
    nome_comissao: str


@dataclass
class PremiacaoDTO:
    codigo: str
    tipo: str
    nome_premio: str
    ano: int
    papel: Optional[str] = None


@dataclass
class BolsaCNPQDTO:
    codigo: str
    nivel: str
    area: str


@dataclass
class ParticipacaoDTO:
    codigo: str
    tipo: str
    descricao: str
    ano: Optional[int]


@dataclass
class OrientacaoDTO:
    codigo: str
    tipo: str
    nivel: str
    ano: Optional[int]
    coorientacao: bool = False
    premiada: bool = False
    premiacao_tipo: Optional[str] = None


@dataclass
class MembroBancaDTO:
    codigo: str
    tipo: str
    nivel: str
    ano: Optional[int]


@dataclass
class PontuacaoAtuacaoDTO:
    codigo: str
    base: int
    tempo: int
    bonus: int
    total: int
    quantidade: int


@dataclass
class PontuacaoBlocoDTO:
    bloco: str
    total: int
    atuacoes: List[PontuacaoAtuacaoDTO]


@dataclass
class PontuacaoCompletaDTO:
    bloco_a: PontuacaoBlocoDTO
    bloco_c: PontuacaoBlocoDTO
    bloco_d: PontuacaoBlocoDTO
    pontuacao_total: int


@dataclass
class ConsultorResumoDTO:
    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


@dataclass
class ConsultorDetalhadoDTO:
    id_pessoa: int
    nome: str
    anos_atuacao: float
    ativo: bool
    veterano: bool
    coordenador_ppg: bool
    coordenacoes_capes: List[CoordenacaoCapesDTO]
    consultoria: Optional[ConsultoriaDTO]
    inscricoes: List[InscricaoDTO]
    avaliacoes_comissao: List[AvaliacaoComissaoDTO]
    premiacoes: List[PremiacaoDTO]
    bolsas_cnpq: List[BolsaCNPQDTO]
    participacoes: List[ParticipacaoDTO]
    orientacoes: List[OrientacaoDTO]
    membros_banca: List[MembroBancaDTO]
    pontuacao: PontuacaoCompletaDTO
    rank: Optional[int] = None

    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)
