"""
court.py — Post-processing khusus untuk mode sidang pengadilan.

Mode ini melakukan normalisasi teks hasil transkripsi agar sesuai
dengan konvensi dokumen resmi persidangan Indonesia:
- Nama pihak (HAKIM, JAKSA, TERDAKWA, dll.) dicetak kapital
- Tanda baca setelah label speaker distandarkan
- Spasi berlebih dibersihkan
- Baris kosong antar giliran bicara ditambahkan
"""

import re

# ── Daftar label speaker sidang ────────────────────────────────────
COURT_SPEAKERS = [
    "KETUA MAJELIS",        # Urutan panjang → pendek agar regex greedy cocok duluan
    "ANGGOTA MAJELIS",
    "PENASIHAT HUKUM",
    "PANITERA PENGGANTI",
    "PENUNTUT UMUM",
    "HAKIM",
    "JAKSA",
    "PENGACARA",
    "ADVOKAT",
    "TERDAKWA",
    "SAKSI",
    "AHLI",
    "PANITERA",
]

# ── Pola regex ─────────────────────────────────────────────────────
# FIX #1: Urutkan dari yang terpanjang ke terpendek agar alternatif
#          multi-kata ("KETUA MAJELIS") tidak kalah dengan "HAKIM".
# FIX #2: \s*[:：]\s* — tangkap spasi & colon (termasuk full-width ：)
#          agar bisa dinormalisasi seragam.
_SPEAKER_PATTERN = re.compile(
    r"^("
    + "|".join(re.escape(s) for s in COURT_SPEAKERS)
    + r")\s*[:：]\s*",
    re.IGNORECASE | re.MULTILINE,
)


def _replace_speaker(match: re.Match) -> str:
    """
    FIX #3: Gabungkan dua operasi (kapitalkan + tambah newline) dalam
    SATU pass substitusi sehingga pola tidak dicocokkan dua kali.

    - Baris pertama dokumen tidak mendapat '\n' di awal.
    - Semua speaker berikutnya diawali '\n\n' agar ada jeda antar giliran.
    """
    speaker = match.group(1).upper()
    # Jika match dimulai di posisi 0 (awal teks), jangan tambah newline
    prefix = "" if match.start() == 0 else "\n\n"
    return f"{prefix}{speaker} : "


def normalize_court_transcript(text: str) -> str:
    """
    Normalisasi teks transkripsi sidang:
    1. Normalisasi spasi berlebih
    2. Kapitalkan label speaker DAN tambah jeda — dalam satu pass
    3. Bersihkan sisa baris kosong berlebih
    """
    if not text:
        return text

    # 1. Normalisasi spasi berlebih (lebih dari 1 spasi → 1 spasi)
    text = re.sub(r"[^\S\n]+", " ", text)          # spasi horizontal saja
    text = re.sub(r" +\n", "\n", text)              # hapus spasi trailing tiap baris

    # 2. Kapitalkan speaker label + tambah newline — SATU PASS
    #    FIX #3: Sebelumnya ada dua .sub() terpisah; pass kedua memakai
    #    m.group(0) yang sudah diubah pass pertama sehingga hasilnya
    #    tidak konsisten dan proses regex berjalan dua kali sia-sia.
    text = _SPEAKER_PATTERN.sub(_replace_speaker, text)

    # 3. Bersihkan baris kosong berlebih (>2 baris kosong → 1 baris kosong)
    text = re.sub(r"\n{3,}", "\n\n", text)

    return text.strip()


def apply_court_mode(text: str, is_court_mode: bool) -> str:
    """Terapkan normalisasi court mode jika aktif."""
    if not is_court_mode:
        return text
    return normalize_court_transcript(text)