import hashlib
from datetime import date


def dedup_hash(
    company_id: str,
    process_number: str,
    tribunal: str,
    date_filed: date,
) -> str:
    """Dedup key includes company_id so a single judicial event involving
    multiple monitored companies yields one row per company (each gets its
    own view, possibly with a different role)."""
    key = (
        f"{company_id}|"
        f"{process_number.strip()}|"
        f"{tribunal.strip()}|"
        f"{date_filed.isoformat()}"
    )
    return hashlib.sha256(key.encode("utf-8")).hexdigest()


def announcement_hash(
    referencia: str | None,
    process_number: str | None,
    ato: str | None,
    pub_date: date | None,
) -> str:
    """Chave de deduplicação dos anúncios CIRE.

    Ao contrário dos processos, um anúncio não pertence a uma empresa: é uma
    publicação única do tribunal, cruzada depois contra várias entidades. A
    `referência` do CITIUS é o identificador natural, mas incluímos o resto
    porque nada garante que seja globalmente única entre tribunais.
    """
    key = "|".join(
        [
            (referencia or "").strip(),
            (process_number or "").strip(),
            (ato or "").strip(),
            pub_date.isoformat() if pub_date else "",
        ]
    )
    return hashlib.sha256(key.encode("utf-8")).hexdigest()


def filing_hash(
    process_number: str | None,
    tribunal: str | None,
    data_distribuicao: date | None,
) -> str:
    """Chave de deduplicação da Distribuição nacional.

    **Sem empresa**, ao contrário do `dedup_hash`: uma distribuição é um facto do
    tribunal, publicado uma vez, e só depois é cruzado contra quem interessa. Se
    a empresa entrasse na chave, a mesma linha entrava duas vezes quando dois
    monitorizados fossem co-réus — que é precisamente o que a `processes` quer, e
    o que o arquivo não pode ter.

    O número do processo é único por tribunal e ano, mas não entre tribunais, e
    uma consulta ao CITIUS pode devolver a mesma linha em dias diferentes se a
    distribuição for corrigida; daí os três campos.
    """
    key = "|".join(
        [
            (process_number or "").strip(),
            (tribunal or "").strip(),
            data_distribuicao.isoformat() if data_distribuicao else "",
        ]
    )
    return hashlib.sha256(key.encode("utf-8")).hexdigest()
