#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Auto-reply komentar Threads @ukyhandoko & StudioSoft — FOKUS GROWTH FOLLOWER (11 Sep 2026, Bos).
DAS (@das_indonesia, bengkel mobil) ditambahkan 6 Okt 2026 dengan bank balasan sendiri.
Balas komentar masuk: jawab SESUAI pertanyaan + akhiri pertanyaan lanjutan (biar diskusi lanjut).
Tracker anti-dobel. WAJIB ≤500 char.
"""
import sys, json, os, time, random, re
import urllib.request, urllib.error
sys.path.insert(0, "/home/mantapman/.openclaw/workspace-atun")
from repliz_client import HEADERS, BASE
from pangkas_threads import batasi

TRACKER = "/home/mantapman/.openclaw/workspace-atun/.threads_growth_autoreply_tracker.json"
MAX_PER_RUN = 6
MAX_REPLY = 480

AKUN = {
    "6a334e89c5ff4ce3a3225a48": "uky",
    "6a335b9ec5ff4ce3a3225c2a": "ss",
    "6a39e461c5ff4ce3a3233e09": "das",      # DAS BENGKEL INDONESIA (ditambah 6 Okt 2026)
}


# ── bank balasan khusus DAS (bengkel mobil) ──
def _balas_das(teks):
    """Balasan DAS: bantu jawab soal perawatan mobil, tanpa janji harga/klaim.

    Gaya: santai ("kami/kamu"), dua paragraf, paragraf kedua mengajak ngobrol.
    Kalau yang ditanya memang harus diperiksa langsung, arahkan untuk dicek
    di bengkel — jangan mendiagnosa mobil orang dari satu komentar.
    """
    t = (teks or "").lower()

    def ada(*kata):
        return any(k in t for k in kata)

    if ada("rem", "kampas", "blong", "pedal"):
        return random.choice([
            "Rem itu paling nggak boleh ditawar, apalagi kalau pedalnya sudah terasa dalam atau ada bunyi berdecit. Yang biasanya dicek dulu: level minyak rem, ketebalan kampas, dan kemungkinan rembesan di kaliper.\n\nKalau gejalanya yang mana yang paling kamu rasakan?",
            "Kalau bunyi berdecitnya muncul terus saat mengerem, biasanya itu pelat pengingat di kampas yang sudah menipis. Sengaja dibikin berisik supaya cepat diperiksa.\n\nSudah berapa lama muncul bunyinya?",
        ])
    if ada("oli", "ganti oli", "kilometer", "service berkala"):
        return random.choice([
            "Untuk oli, patokannya dua: jarak tempuh dan waktu. Kalau mobilnya jarang jalan, yang dipakai patokan waktu karena oli tetap menua walau mesin jarang dipakai.\n\nMobilmu dipakai harian atau jarang?",
            "Yang penting bukan mereknya, tapi spesifikasinya sesuai buku manual. Oli mahal dengan jenis yang salah justru bisa lebih merugikan.\n\nTerakhir ganti oli berapa ribu kilometer lalu?",
        ])
    if ada("ban", "spooring", "balancing", "getar", "setir"):
        return random.choice([
            "Bedanya begini: balancing menyeimbangkan putaran roda, spooring mengatur sudut roda. Kalau setir bergetar di kecepatan tinggi, biasanya balancing. Kalau ban aus sebelah, biasanya sudut rodanya.\n\nGetarannya muncul di kecepatan berapa?",
            "Tekanan angin dicek saat ban dingin, dan angkanya lihat di stiker pintu pengemudi, bukan di dinding ban. Dua angka itu tidak sama.\n\nBan mobilmu sudah berapa lama dipakai?",
        ])
    if ada("aki", "starter", "distarter", "kelistrikan"):
        return random.choice([
            "Aki itu umurnya biasanya 2-3 tahun, dan gejalanya sering muncul pelan: starter terasa berat pagi hari, lampu kabin meredup, jam digital mengulang dari nol.\n\nTiga tanda itu ada yang muncul?",
            "Kalau mobilnya sering dipakai jarak pendek, akinya tidak sempat terisi penuh, jadi umurnya bisa lebih pendek dari hitungan tahun.\n\nSehari biasanya jalan berapa kilometer?",
        ])
    if ada("ac", "freon", "dingin", "kabin"):
        return random.choice([
            "AC kurang dingin itu jangan langsung diisi freon. Yang paling sering cuma filter kabin tersumbat atau kondensor kotor, dan dua-duanya murah.\n\nFreonnya pernah diisi ulang belum?",
            "Kalau yang kurang dingin hanya baris belakang, biasanya bukan AC-nya yang rusak. Paling sering filter kabin atau saluran udaranya.\n\nYang tidak dingin bagian depan atau belakang?",
        ])
    if ada("matic", "cvt", "transmisi", "gigi", "kopling"):
        return random.choice([
            "Transmisi matic dan CVT itu paling tidak boleh menunggu gejala. Kalau sudah terasa jeda waktu pindah gigi, lebih baik diperiksa daripada ditunggu.\n\nGejalanya sudah muncul atau masih ingin dicek pencegahan?",
            "Kebiasaan yang bikin CVT cepat tua: menginjak gas dalam-dalam terus setiap jalan dari berhenti. Pelan tapi mulus itu lebih baik untuk sabuknya.\n\nMobilmu pakai CVT?",
        ])
    if ada("check engine", "lampu mesin", "lampu kuning"):
        return random.choice([
            "Lampu check engine tidak selalu berarti mesin rusak parah. Yang penting dicatat: kapan muncul, apakah tarikan hilang, dan apakah ada getaran.\n\nWaktu lampunya menyala, mobilnya masih jalan normal?",
            "Jangan lepas kabel aki buat mematikan lampu check engine. Lampunya memang bisa padam, tapi catatan kodenya ikut hilang dan diagnosa jadi lebih lama.\n\nSudah pernah dibaca kodenya belum?",
        ])
    if ada("ndut", "brebet", "boros", "mesin", "tenaga"):
        return random.choice([
            "Kalau bahan bakar jadi boros, urutan ceknya mulai dari yang gratis: tekanan angin dan gaya mengemudi, lanjut filter udara, busi, injektor, baru kompresi.\n\nBorosnya sudah berapa lama?",
            "Mesin tersendat biasanya dari hal yang murah dulu: filter udara kotor, busi lewat jadwal, atau injektor kotor. Dari tiga itu saja sudah banyak kasus yang selesai.\n\nTersendatnya muncul saat jalan pelan atau setelah kencang?",
        ])
    if len(teks or "") <= 90 and ada("biaya", "harga", "tarif", "mahal", "murah", "estimasi"):
        return random.choice([
            "Untuk biaya, kami belum bisa kasih angka tanpa lihat mobilnya. Yang wajar itu diperiksa dulu, baru ada rincian pekerjaan dan estimasi sebelum dibongkar.\n\nBoleh cerita keluhannya biar kami arahkan perkiraan pemeriksaannya?",
            "Harga di bengkel itu beda-beda sesuai jenis pekerjaan dan komponennya. Yang penting kamu tahu rinciannya sebelum pekerjaan mulai.\n\nMobilnya punya keluhan apa sekarang?",
        ])
    if ada("bengkel", "tempat", "rekomendasi", "dimana", "alamat"):
        return random.choice([
            "Cara paling cepat menilai bengkel: minta rincian pekerjaan sebelum mobil dibongkar, dan tanya garansinya berapa lama. Dua jawaban itu biasanya bicara banyak.\n\nKamu di area Surabaya bagian mana?",
            "Yang penting dari bengkel bukan cuma bisa memperbaiki, tapi mau menjelaskan apa yang dikerjakan dan apa yang belum perlu.\n\nSedang cari bengkel untuk perawatan rutin atau ada masalah tertentu?",
        ])
    if any(k in t for k in ["makasih", "terima kasih", "thanks", "mantap", "keren", "bermanfaat", "sip"]):
        return random.choice([
            "Senang kalau bermanfaat. Kalau ada gejala yang masih bikin penasaran, tulis aja di sini, nanti kami bantu baca.",
            "Terima kasih balik. Kalau nanti muncul bunyi atau rasa aneh di mobilnya, catat kapan munculnya, itu sangat membantu waktu diperiksa.",
        ])
    if len(teks or "") > 60:
        return random.choice([
            "Ceritanya menarik, dan keluhannya cukup jelas. Yang biasanya perlu dipastikan dulu: muncul saat mesin dingin atau panas, dan di kecepatan berapa.\n\nDua hal itu kelihatan nggak di mobilmu?",
            "Makasih sudah cerita. Kalau gejalanya muncul kadang-kadang, catat polanya dulu, karena itu yang paling mempercepat pemeriksaan.\n\nSeberapa sering kambuh?",
        ])
    return random.choice([
        "Boleh cerita lebih detail soal mobilmu? Semakin jelas gejalanya, semakin cepat kami bisa arahkan pemeriksaannya.",
        "Kalau ada yang mau ditanyakan soal perawatan mobil, tulis aja di sini. Kami bantu jawab semampunya dari pengalaman di bengkel.",
    ])


def http_get(path):
    req = urllib.request.Request(f"{BASE}{path}", headers=HEADERS)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read().decode())


def post_reply(doc_id, text):
    body = json.dumps({"text": text}).encode()
    req = urllib.request.Request(f"{BASE}/public/comment/{doc_id}", data=body,
                                 headers={**HEADERS, "Content-Type": "application/json"}, method="POST")
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read().decode())


def fetch_pending(accid):
    docs = []
    for page in range(1, 8):
        d = http_get(f"/public/comment?page={page}&limit=50")
        batch = d.get("docs", [])
        docs += batch
        if len(batch) < 50:
            break
    out = []
    for x in docs:
        if x.get("accountId") != accid:
            continue
        if x.get("status") not in ("pending",):
            continue
        c = x.get("comment") or {}
        owner = c.get("owner") or {}
        text = (c.get("text") or "").strip()
        if not text:
            continue
        out.append({"doc_id": x.get("_id"), "owner": owner.get("name") or "?",
                    "text": text, "created": x.get("createdAt", "")})
    out.sort(key=lambda r: r["created"], reverse=True)
    return out


# ── bank balasan per topik (uky: SEO/bisnis/AI; ss: digital marketing) ──
def _balas_bank(teks, who):
    t = (teks or "").lower()
    if who == "das":
        return _balas_das(teks)
    # pertanyaan langsung
    if "?" in teks or any(k in t for k in ["gimana", "bagaimana", "kenapa", "apa", "berapa", "kapan", "dimana", "cara"]):
        if any(k in t for k in ["seo", "google", "ranking", "peringkat"]):
            return random.choice([
                "Pertanyaan bagus! Kunci SEO itu 3: kata kunci yang tepat, konten yang menjawab, dan konsistensi. Mulai dari riset dulu — jangan asal tulis.\n\nBisnismu bergerak di bidang apa? Biar saya kasih arahan lebih spesifik. 👇",
                "SEO itu proses, bukan tombol ajaib. Yang paling penting: pahami dulu apa yang dicari pelangganmu, baru tulis kontennya.\n\nKamu sudah riset kata kunci belum? Cerita di komentar! 👇",
            ])
        if any(k in t for k in ["website", "web", "domain", "hosting"]):
            return random.choice([
                "Soal website, 3 hal ini wajib: cepat diakses, jelas tawarannya, dan gampang dihubungi. Sisanya bonus.\n\nWebsite kamu sudah punya 3 itu? Kalau belum, mana yang paling perlu dibenahi? 👇",
                "Website itu aset, bukan pengeluaran. Mulai dari yang sederhana tapi benar — lebih baik daripada mahal tapi nggak dipakai.\n\nKamu sedang bangun website untuk usaha apa? Cerita! 👇",
            ])
        if any(k in t for k in ["ai", "artificial", "chatgpt", "otomatis"]):
            return random.choice([
                "AI itu asisten, bukan pengganti. Yang penting: kasih arahan jelas, review hasilnya, dan pakai untuk hal repetitif.\n\nKamu sudah coba AI buat bagian kerja yang mana? 👇",
                "Saya pakai AI untuk riset & draft — hemat waktu banget. Tapi keputusan akhir tetap manusia.\n\nKalau ada satu tugas yang mau kamu otomasi, itu tugas apa? 👇",
            ])
        if any(k in t for k in ["marketing", "jualan", "promosi", "iklan", "konten"]):
            return random.choice([
                "Marketing yang jalan itu yang konsisten + relevan. Jangan semua channel sekaligus — pilih satu, fokus 90 hari.\n\nKamu paling banyak dapat pelanggan dari channel mana? 👇",
                "Konten yang bikin orang beli bukan yang paling keren, tapi yang paling menjawab kebutuhan mereka.\n\nProduk kamu paling sering ditanya apa sama calon pembeli? 👇",
            ])
        return random.choice([
            "Pertanyaan menarik! Coba ceritakan sedikit konteksnya — biar jawabannya lebih pas buat situasimu.\n\nDetailnya di komen ya, saya bantu pikirkan. 👇",
            "Bagus nih pertanyaannya. Menurut pengalaman saya, kuncinya mulai dari yang paling sederhana dulu, baru naik level.\n\nSituasimu sekarang seperti apa? Share dong! 👇",
        ])
    # apresiasi / makasih
    if any(k in t for k in ["makasih", "terima kasih", "thanks", "mantap", "keren", "bagus", "sip", "setuju"]):
        return random.choice([
            "Makasih banget! 🙏 Senang kalau bermanfaat. Kalau ada topik lain yang mau dibahas, tulis aja di komen.\n\nKamu lagi belajar soal apa sekarang? 👇",
            "Terima kasih! 😊 Justru diskusi begini yang bikin saya belajar juga.\n\nBagian mana yang paling relate sama kondisimu? 👇",
        ])
    # pengalaman / cerita
    if len(teks) > 60:
        return random.choice([
            "Wah, pengalamanmu menarik banget. Terima kasih sudah berbagi! 🙌\n\nDari cerita itu, apa pelajaran paling berharga buatmu? 👇",
            "Keren, ceritanya relatable. Setuju banget sama poinmu.\n\nKalau boleh tahu, sekarang tantangan terbesarmu apa? 👇",
        ])
    # default
    return random.choice([
        "Makasih sudah mampir & komen! 😊 Senang diskusinya hidup di sini.\n\nKalau ada yang mau ditanyakan soal SEO atau digital marketing, tanya aja — saya bantu jawab! 👇",
        "Halo! 🙌 Makasih responsnya. Kalau penasaran soal strategi digital, tulis aja pertanyaanmu di komen.\n\nKamu lagi fokus bangun apa sekarang? 👇",
    ])


def balas(teks, who):
    """Balasan yang tidak seragam + tidak membalas komentar tipis.

    Diperbaiki 5 Okt 2026 setelah ditemukan akun disebut "ternyata bot": dulu SEMUA
    balasan diakhiri "👇" dan diikuti pertanyaan yang sama, dan komentar sependek
    "D" atau "❤️" pun tetap dibalas panjang. Perilaku itu penanda bot.
    """
    inti = re.sub(r"[^a-z0-9]", "", (teks or "").lower())
    tipis = {"a", "b", "c", "d", "ya", "ok", "sip", "mantap", "keren", "bagus", "wkwk", "haha", "hehe"}
    if len(inti) <= 2 or inti in tipis:
        return ""            # dibiarkan tanpa balasan; manusia juga tidak akan membalas begitu

    jawab = _balas_bank(teks, who)
    if not jawab:
        return ""
    jawab = jawab.replace(" 👇", "")                       # emoji penanda bot dihapus
    if random.random() < 0.45 and "\n\n" in jawab:          # kadang balasan pendek saja
        jawab = jawab.split("\n\n")[0]
    if random.random() < 0.25:                              # kadang tanpa emoji sama sekali
        jawab = re.sub(r"[👊🙏😊🙌🔥💬👇]", "", jawab).replace("  ", " ").strip()
    return jawab


def load_tracker():
    if os.path.exists(TRACKER):
        try:
            with open(TRACKER) as f:
                return json.load(f)
        except Exception:
            return {}
    return {}


def save_tracker(t):
    with open(TRACKER, "w") as f:
        json.dump(t, f, indent=2)


def main():
    tracker = load_tracker()
    total = 0
    for accid, who in AKUN.items():
        pending = fetch_pending(accid)
        todo = [p for p in pending if p["doc_id"] not in tracker]
        print(f"[{who}] komentar pending: {len(pending)} | belum dibalas: {len(todo)}")
        for p in todo[:MAX_PER_RUN]:
            reply = batasi(balas(p["text"], who), MAX_REPLY)
            if not reply:
                # komentar terlalu tipis untuk dibalas (mis. "D" atau emoji saja) —
                # ditandai selesai supaya tidak diulang, tapi tidak dikirim.
                tracker[p["doc_id"]] = {"acc": who, "owner": p["owner"], "comment": p["text"][:80],
                                        "reply": "(dilewati: komentar terlalu tipis)",
                                        "at": time.strftime("%Y-%m-%d %H:%M:%S")}
                save_tracker(tracker)
                print(f"  ⏭️  {who} → dilewati: {p['text'][:40]}")
                continue
            try:
                res = post_reply(p["doc_id"], reply)
                tracker[p["doc_id"]] = {"acc": who, "owner": p["owner"], "comment": p["text"][:80],
                                        "reply": reply[:80], "at": time.strftime("%Y-%m-%d %H:%M:%S")}
                save_tracker(tracker)
                total += 1
                print(f"  💬 {who} → {p['owner']}: {p['text'][:50]}")
                time.sleep(45)
            except urllib.error.HTTPError as e:
                print(f"  ❌ HTTP {e.code} | {p['doc_id']}")
            except Exception as e:
                print(f"  ❌ {e}")
    print(f"Selesai: {total} balasan terkirim")


if __name__ == "__main__":
    main()
