from dataclasses import dataclass, field
from typing import List, Optional
from datetime import datetime

from ..value_objects.periodo import Periodo
from ..value_objects.pontuacao import PontuacaoCompleta


@dataclass
class CoordenacaoCapes:
    codigo: str
    tipo: str
    area_avaliacao: str
    periodo: Periodo
    areas_adicionais: List[str] = field(default_factory=list)
    ja_coordenou_antes: bool = False
    presidente: bool = False


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


@dataclass
class VinculoConsultoria:
    periodo: Periodo
    ies: Optional[IES] = None
    situacao: str = ""


@dataclass
class Consultoria:
    codigo: str
    situacao: str
    periodo: Periodo
    periodos: List[Periodo] = field(default_factory=list)
    vinculos: List[VinculoConsultoria] = field(default_factory=list)
    areas: List[str] = field(default_factory=list)
    anos_consecutivos: int = 0
    retornos: int = 0


@dataclass
class Inscricao:
    codigo: str
    tipo: str
    premio: str
    ano: int
    situacao: str = ""


@dataclass
class AvaliacaoComissao:
    codigo: str
    tipo: str
    premio: str
    ano: int
    comissao_tipo: str = ""
    nome_comissao: str = ""


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


@dataclass
class BolsaCNPQ:
    codigo: str
    nivel: str
    area: str = ""


@dataclass
class Participacao:
    codigo: str
    tipo: str
    descricao: str = ""
    ano: Optional[int] = None


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


@dataclass
class MembroBanca:
    codigo: str
    tipo: str
    nivel: str
    ano: Optional[int] = None


@dataclass
class Consultor:
    id_pessoa: int
    nome: str
    cpf: Optional[str] = None
    coordenador_ppg: bool = False
    coordenacoes_capes: List[CoordenacaoCapes] = field(default_factory=list)
    consultoria: Optional[Consultoria] = None
    inscricoes: List[Inscricao] = field(default_factory=list)
    avaliacoes_comissao: List[AvaliacaoComissao] = field(default_factory=list)
    premiacoes: List[Premiacao] = field(default_factory=list)
    bolsas_cnpq: List[BolsaCNPQ] = field(default_factory=list)
    participacoes: List[Participacao] = field(default_factory=list)
    orientacoes: List[Orientacao] = field(default_factory=list)
    membros_banca: List[MembroBanca] = field(default_factory=list)
    pontuacao: Optional[PontuacaoCompleta] = None

    @property
    def anos_atuacao(self) -> float:
        if not self.consultoria or not self.consultoria.periodo.inicio:
            return 0.0
        dias = (datetime.now() - self.consultoria.periodo.inicio).days
        return round(dias / 365.25, 1)

    @property
    def ativo(self) -> bool:
        if not self.consultoria:
            return False
        return self.consultoria.codigo == "CONS_ATIVO"

    @property
    def veterano(self) -> bool:
        return self.anos_atuacao >= 10.0

    @property
    def pontuacao_total(self) -> int:
        return self.pontuacao.total if self.pontuacao else 0

    @property
    def pontuacao_bloco_a(self) -> int:
        return self.pontuacao.bloco_a.total if self.pontuacao else 0

    @property
    def pontuacao_bloco_c(self) -> int:
        return self.pontuacao.bloco_c.total if self.pontuacao else 0

    @property
    def pontuacao_bloco_d(self) -> int:
        return self.pontuacao.bloco_d.total if self.pontuacao else 0
