from dataclasses import dataclass, field
from typing import Dict, List


@dataclass(frozen=True)
class PontuacaoAtuacao:
    codigo: str
    base: int
    tempo: int
    bonus: int
    total: int
    quantidade: int = 1


@dataclass(frozen=True)
class PontuacaoBloco:
    bloco: str
    atuacoes: List[PontuacaoAtuacao] = field(default_factory=list)

    @property
    def total(self) -> int:
        return sum(a.total for a in self.atuacoes)

    def to_dict(self) -> Dict:
        return {
            "bloco": self.bloco,
            "total": self.total,
            "atuacoes": [
                {
                    "codigo": a.codigo,
                    "base": a.base,
                    "tempo": a.tempo,
                    "bonus": a.bonus,
                    "total": a.total,
                    "quantidade": a.quantidade,
                }
                for a in self.atuacoes
            ],
        }


@dataclass(frozen=True)
class PontuacaoCompleta:
    bloco_a: PontuacaoBloco
    bloco_c: PontuacaoBloco
    bloco_d: PontuacaoBloco

    @property
    def total(self) -> int:
        return self.bloco_a.total + self.bloco_c.total + self.bloco_d.total

    def to_dict(self) -> Dict:
        return {
            "bloco_a": self.bloco_a.to_dict(),
            "bloco_c": self.bloco_c.to_dict(),
            "bloco_d": self.bloco_d.to_dict(),
            "pontuacao_total": self.total,
        }

    @property
    def detalhamento(self) -> Dict:
        return self.to_dict()
