from dataclasses import dataclass, field
from typing import Literal, Optional

Tipo = Literal["entrada", "saida"]
Escopo = Literal["pj", "pf"]
MeioPagamento = Literal["dinheiro", "pix", "debito", "credito", "transferencia", "boleto"]


@dataclass
class Lancamento:
    data: str           # ISO YYYY-MM-DD
    tipo: Tipo
    escopo: Escopo
    categoria: str
    valor: float
    descricao: str = ""
    fornecedor_cliente: Optional[str] = None
    meio_pagamento: Optional[MeioPagamento] = None


@dataclass
class ResumoMensal:
    mes: str            # YYYY-MM
    entradas: float = 0.0
    saidas: float = 0.0

    @property
    def saldo(self) -> float:
        return self.entradas - self.saidas
