"""Classify corporate publications by competitive-intelligence relevance.

Applied to rows from both DRE (RSS) and publicacoes.mj.pt (MJ). Title
conventions differ between the two sources so the patterns are loose —
match on trigger verbs + target nouns anywhere in the concatenated
title+summary text, order-agnostic.

Returns (relevance, change_kind):
  * high    — material change worth an alert/flag
  * medium  — notable but less urgent
  * low     — routine bookkeeping (PRESTAÇÃO DE CONTAS, Éditos, etc.)
"""
import re
from typing import NamedTuple


class Classification(NamedTuple):
    relevance: str  # 'high' | 'medium' | 'low'
    change_kind: str | None


# Individual matcher regexes. Each is order-agnostic and lowercase,
# pre-compiled for speed. The classifier runs them in priority order and
# returns on the first hit.

_LIQUIDATION_RE = re.compile(
    r"\b("
    r"insolv[êe]ncia|"
    r"liquida[çc][ãa]o|"
    r"dissolu[çc][ãa]o|"
    r"extin[çc][ãa]o|"
    r"encerramento da liquida[çc][ãa]o"
    r")\b",
    re.I,
)

_CAPITAL_RE = re.compile(
    r"(aumento de capital|redu[çc][ãa]o de capital|altera[çc][ãa]o do capital social"
    r"|capital social.*(aument|reduz|alter|redenomin))",
    re.I | re.DOTALL,
)

_MANAGEMENT_TRIGGER_RE = re.compile(
    r"\b("
    r"nomea[çc][ãa]o|"
    r"cessa[çc][ãa]o|"
    r"exonera[çc][ãa]o|"
    r"designa[çc][ãa]o|"
    r"destitui[çc][ãa]o|"
    r"substitui[çc][ãa]o|"
    r"renova[çc][ãa]o de mandato"
    r")\b",
    re.I,
)
_MANAGEMENT_TARGET_RE = re.compile(
    r"\b("
    r"gerente|gerentes|ger[êe]ncia|"
    r"administrador|administradores|administra[çc][ãa]o|"
    r"presidente|vogal|secret[áa]rio|tesoureiro|"
    r"conselho (de administra[çc][ãa]o|fiscal)|"
    r"[óo]rg[ãa]o(\(s\))? social(\(ais\))?|"
    r"[óo]rg[ãa]os sociais|"
    r"revisor oficial|roc|"
    r"liquidat[áa]rio"
    r")\b",
    re.I,
)

_HEADQUARTERS_RE = re.compile(
    r"("
    r"mudan[çc]a de sede|"
    r"transfer[êe]ncia de sede|"
    r"altera[çc][ãa]o da sede|"
    r"\bnova sede\b|"
    r"sede social.*(muda|altera|transfere)"
    r")",
    re.I | re.DOTALL,
)

_CONTRACT_TRIGGER_RE = re.compile(
    r"\b(altera[çc][ãa]o|altera[çc][õo]es|modifica[çc][ãa]o|revis[ãa]o)\b",
    re.I,
)
_CONTRACT_TARGET_RE = re.compile(
    r"\b(contrato de sociedade|pacto social|estatutos?|pacto estatut[áa]rio)\b",
    re.I,
)

_NAME_CHANGE_RE = re.compile(
    r"("
    r"altera[çc][ãa]o da (denomina[çc][ãa]o|firma)|"
    r"mudan[çc]a de (denomina[çc][ãa]o|firma)|"
    r"nova denomina[çc][ãa]o|"
    r"denomina[çc][ãa]o social.*(altera|muda)"
    r")",
    re.I | re.DOTALL,
)

_PURPOSE_RE = re.compile(
    r"(objec?to social)",
    re.I,
)

_OWNERSHIP_RE = re.compile(
    r"("
    r"transmiss[ãa]o de quotas|"
    r"cess[ãa]o de quotas|"
    r"venda de participa[çc][ãa]o|"
    r"aquisi[çc][ãa]o de participa[çc][ãa]o|"
    r"altera[çc][ãa]o de s[óo]cios?"
    r")",
    re.I,
)

_INSOLVENCY_PROC_RE = re.compile(
    r"(processo especial de revitaliza[çc][ãa]o|per|presen[çc]a de credores|concordata)",
    re.I,
)


def classify(title: str | None, summary: str | None) -> Classification:
    text = f"{title or ''}\n{summary or ''}"
    # Order matters: highest-severity buckets first.
    if _LIQUIDATION_RE.search(text):
        return Classification("high", "liquidation")
    if _CAPITAL_RE.search(text):
        return Classification("high", "capital_change")
    if _MANAGEMENT_TRIGGER_RE.search(text) and _MANAGEMENT_TARGET_RE.search(text):
        return Classification("high", "management_change")
    if _HEADQUARTERS_RE.search(text):
        return Classification("high", "headquarters_change")
    if _INSOLVENCY_PROC_RE.search(text):
        return Classification("high", "liquidation")

    if _CONTRACT_TRIGGER_RE.search(text) and _CONTRACT_TARGET_RE.search(text):
        return Classification("medium", "contract_change")
    if _NAME_CHANGE_RE.search(text):
        return Classification("medium", "name_change")
    if _PURPOSE_RE.search(text) and _CONTRACT_TRIGGER_RE.search(text):
        return Classification("medium", "purpose_change")
    if _OWNERSHIP_RE.search(text):
        return Classification("medium", "ownership_transfer")

    return Classification("low", None)
