package com.amz.genie.helpers

import com.google.gson.JsonObject

object ChatMessageRenderer {
    fun render(message: JsonObject?): String {
        if (message == null) return ""

        val sb = StringBuilder()

        // 1) uraian (kalau ada)
        val uraian = message.getString("uraian")
        if (!uraian.isNullOrBlank()) {
            sb.append(uraian.trim())
        }

        // 2) komunikasi / tipe_komunikasi / tentang (optional)
//        message.getObj("komunikasi")?.getString("komunikasi")?.let { addLine(sb, "Komunikasi", it) }
//        message.getObj("tipe_komunikasi")?.getString("tipe_komunikasi")?.let { addLine(sb, "Tipe", it) }
//        message.getObj("tentang")?.getString("tentang")?.let { addLine(sb, "Tentang", it) }

        // 3) Render field komunikasi dinamis (list, angka, teks, tanggal, waktu, jam, pecahan, string)
        // Semua ini umumnya array of object yang punya "isian" dan "nilai" (atau variasinya).
        addSectionFromArray(sb, "aksi_komunikasi_teks", message)
        addSectionFromArray(sb, "aksi_komunikasi_string", message)
        addSectionFromArray(sb, "aksi_komunikasi_angka", message)
        addSectionFromArray(sb, "aksi_komunikasi_pecahan", message)
        addSectionFromArray(sb, "aksi_komunikasi_tanggal", message)
        addSectionFromArray(sb, "aksi_komunikasi_waktu", message)
        addSectionFromArray(sb, "aksi_komunikasi_jam", message)
        addSectionFromArray(sb, "aksi_komunikasi_list", message)

        // 4) Lampiran (jika ingin tampil sebagai teks)
        val lampiranArr = message.getArray("lampiran")
        if (lampiranArr != null && lampiranArr.size() > 0) {
            // tampilkan ringkas saja
            addLine(sb, "Lampiran", "${lampiranArr.size()} file")
        }

        // ✅ 5) Lampiran REAKSI (taruh di sini)
        val lampReaksi = message.getArray("lampiran_reaksi")
        if (lampReaksi != null && lampReaksi.size() > 0) {
            addLine(sb, "Lampiran", "${lampReaksi.size()} file")
        }

        // Kalau kosong total, fallback tampilkan JSON singkat
        return sb.toString().ifBlank { message.toString() }
    }

    private fun addSectionFromArray(sb: StringBuilder, key: String, msg: JsonObject) {
        val arr = msg.getArray(key) ?: return
        if (arr.size() == 0) return

        for (el in arr) {
            if (!el.isJsonObject) continue
            val obj = el.asJsonObject

            // Label pertanyaan/isian
            val label = obj.getString("isian")
                ?: obj.getString("label")
                ?: obj.getString("nama")
                ?: key

            // Nilai jawaban (banyak variasi field di backend)
            val value = obj.getString("nilai")
                ?: obj.getString("value")
                ?: obj.getString("uraian")
                ?: obj.getString("isi")
                ?: obj.getString("jawaban")

            if (!value.isNullOrBlank()) {
                addLine(sb, label, value)
            }
        }
    }

    private fun addLine(sb: StringBuilder, label: String, value: String) {
        if (sb.isNotEmpty()) sb.append("\n")
        sb.append("• ").append(label).append(": ").append(value)
    }

    // ---- Json helpers ----
    private fun JsonObject.getString(key: String): String? {
        val el = get(key) ?: return null
        if (el.isJsonNull) return null
        return runCatching { el.asString }.getOrNull()
    }

    private fun JsonObject.getObj(key: String): JsonObject? {
        val el = get(key) ?: return null
        if (el.isJsonNull || !el.isJsonObject) return null
        return el.asJsonObject
    }

    private fun JsonObject.getArray(key: String) =
        get(key)?.takeIf { it.isJsonArray }?.asJsonArray
}