"""Prompt builders for the LLM extractor.

Kept in their own module so the prompts can be edited / version-tracked
without touching the orchestration logic. We build prompts in Indonesian
because the source documents are too — the model performs better when the
field labels in the prompt match the OCR text it's being asked about.
"""

from __future__ import annotations

SYSTEM_HEADER = (
    "Anda adalah asisten ekstraksi data untuk dokumen Surat Perintah (Sprint) "
    "Kepolisian Republik Indonesia (POLRI). Pengguna akan memberikan teks hasil "
    "OCR sebuah surat sprint, dan Anda harus mengembalikan JSON yang sesuai "
    "dengan skema yang diberikan.\n\n"
    "Aturan keras:\n"
    "1. Jangan mengarang. Jika sebuah field tidak terlihat di teks, kembalikan null.\n"
    "2. Jangan menerjemahkan field. Output harus identik ejaannya dengan teks "
    "sumber (kecuali normalisasi spasi/kapitalisasi yang jelas hasil OCR error).\n"
    "3. Tanggal: kembalikan format ISO YYYY-MM-DD jika tanggal terlihat, "
    "selain itu null.\n"
    "4. Dasar hukum: array string berisi tiap butir, urut sesuai teks.\n"
    "5. Jangan menambahkan field apa pun di luar skema. Output WAJIB JSON valid."
)


def build_user_prompt(raw_text: str, regex_partial: dict[str, object]) -> str:
    """Construct the user message: OCR text + a hint about which fields the
    deterministic regex layer already filled. Telling the LLM what we
    *already have* keeps it from "creatively" overwriting good values.
    """
    known_fields = "\n".join(f"  - {k}: {v!r}" for k, v in sorted(regex_partial.items()) if v)
    known_block = (
        f"\nField yang sudah berhasil diekstrak dengan regex:\n{known_fields}\n"
        if known_fields
        else ""
    )

    return (
        "Teks OCR:\n"
        "----------\n"
        f"{raw_text}\n"
        "----------\n"
        f"{known_block}"
        "Tugas: kembalikan JSON dengan field nomor_sprint, tanggal (ISO date | null), "
        "satuan_penerbit, perihal, dasar (array string). Hanya field yang terlihat — "
        "yang tidak ada di teks isi null (atau array kosong untuk dasar)."
    )
