#!/usr/bin/env python3
"""
Twitter @UkyHandoko — Autoreply Mention & Komentar
Balas mention/komentar yang MASUK ke Twitter @UkyHandoko dengan bahasa humanis & sambutan positif.

Aturan (FIXED 10 Agustus 2026):
- Balas SEMUA komentar pending untuk akun Twitter @UkyHandoko
- Bahasa humanis, sambutan positif, pakai "saya" (bukan "gue")
- Maks 280 karakter per balasan (batas Twitter) — teks utuh, JANGAN dipotong
- Jalan via cron tiap 30 menit; max 5 reply/run, jeda 2 menit biar natural
- Tracker global biar gak balas 2x; error non-400 dicoba ulang di run berikutnya
"""
import sys, json, os, time, random
import urllib.request, urllib.error
sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import HEADERS, BASE, ACC

TWITTER_ACCOUNT = {"id": ACC.UKY_TWITTER, "name": "@UkyHandoko"}

TRACKER = "/home/mantapman/.hermes/profiles/atun/workspace/.twitter_mention_tracker.json"
MAX_PER_RUN = 5
DELAY_SECONDS = 120
MAX_REPLY_CHARS = 280


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 http_get(path):
    req = urllib.request.Request(BASE + path, headers=HEADERS)
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.loads(r.read())


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


def fetch_pending():
    """Ambil komentar pending untuk akun Twitter @UkyHandoko."""
    docs = []
    for page in range(1, 6):
        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") != TWITTER_ACCOUNT["id"]:
            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"),
            "comment_id": c.get("id"),
            "owner": owner.get("name") or owner.get("username") or "?",
            "text": text,
            "created": x.get("createdAt", ""),
        })
    out.sort(key=lambda r: r["created"], reverse=True)
    return out


def generate_reply(comment_text: str, owner: str) -> str:
    """Bikin balasan humanis & positif sesuai isi komentar."""
    t = comment_text.lower()

    # ── kategori: belajar SEO / minta tips ──
    if any(k in t for k in ["belajar seo", "cara belajar", "mulai belajar", "gimana caranya", "bagaimana caranya", "tips seo", "ajari"]):
        return random.choice([
            "Makasih udah mampir! \U0001F64F Buat mulai belajar SEO, saran saya mulai dari 3 hal: pahami cara kerja Google, riset kata kunci yang relevan, dan konsisten bikin konten yang menjawab kebutuhan orang. Gak perlu tools mahal dulu — pahami konsepnya dulu!",
            "Senang banget ada yang mau belajar SEO! \U0001F604 Mulainya dari riset kata kunci dulu ya — dari situ kita tahu orang lagi nyari apa. Pelan-pelan aja, yang penting mulai dan konsisten!",
        ])

    # ── kategori: setuju / sepakat ──
    if any(k in t for k in ["setuju", "sepakat", "bener banget", "bener juga", "betul", "bener", "agree"]):
        return random.choice([
            "Sepakat! \U0001F64C Hasil yang bertahap justru yang paling awet. SEO itu kayak nanam pohon — makin lama dirawat, makin rindang.",
            "Makasih! \U0001F60A Senang rasanya kalau insight-nya nyambung sama pengalaman teman-teman di sini. Semoga makin berkembang ya usahanya!",
        ])

    # ── kategori: debat / tidak setuju (kontroversial) ──
    if any(k in t for k in ["nggak setuju", "tidak setuju", "salah", "debat", "kurang setuju", "disagree"]):
        return random.choice([
            "Justru saya suka kalau ada yang beda pendapat! \U0001F4A1 Selama ini saya lihat dari pengalaman klien. Tapi kalau ada data atau pengalaman yang beda, saya sangat terbuka buat diskusi. Sharing dong pengalamanmu!",
            "Poin menarik! \U0001F914 Semua orang punya konteks dan pengalaman beda. Justru dari perbedaan ini diskusinya makin seru. Boleh cerita lebih detail pandanganmu?",
        ])

    # ── kategori: artikel / link ──
    if any(k in t for k in ["artikel", "link", "baca", "studiosoft", "website"]):
        return random.choice([
            "Makasih udah baca! \U0001F60A Semoga artikelnya bermanfaat. Kalau ada bagian yang kurang jelas atau mau dibahas lebih dalam, tinggal tanya aja di sini ya!",
            "Senang kalau artikelnya kepake! \U0001F64C Kalau ada topik lain yang pengen dibahas, saran saya selalu diterima. Terima kasih sudah mampir!",
        ])

    # ── kategori: AI / tools ──
    if any(k in t for k in ["ai", "tools", "chatgpt", "gemini", "artificial"]):
        return random.choice([
            "Betul! \U0001F916 AI itu alat bantu, bukan pengganti strategi. Yang penting kita tetap paham konsepnya, biar AI-nya dipakai di tempat yang tepat.",
            "Setuju — tools AI sekarang memang powerful banget. Tapi yang bikin beda tetap cara kita menyusun strategi dan memahami kebutuhan pasar. \U0001F60A",
        ])

    # ── kategori: klien / bisnis / UMKM ──
    if any(k in t for k in ["klien", "umkm", "bisnis", "usaha", "owner", "toko"]):
        return random.choice([
            "Pertanyaan yang sering banget muncul! \U0001F4A1 Kuncinya komunikasi ekspektasi dari awal: SEO itu maraton, bukan sprint. Kalau dikemas dengan laporan progres yang jelas, pemilik bisnis biasanya paham kok.",
            "Nah ini tantangan klasik \U0001F604 Saya biasanya ajak lihat data dulu — dari mana pengunjung datang, kata kunci apa yang naik. Angka yang bicara lebih meyakinkan daripada janji.",
        ])

    # ── kategori: DM/WA/kontak ──
    if any(k in t for k in ["dm", "wa ", "whatsapp", "cek dm", "chat", "kontak"]):
        return "Halo! \U0001F64F Boleh banget, silakan DM aja ya — nanti saya balas secepatnya. Makasih sudah mampir! \U0001F60A"

    # ── kategori: terima kasih / apresiasi ──
    if any(k in t for k in ["makasih", "terima kasih", "thanks", "thank you", "mantap"]):
        return random.choice([
            "Sama-sama! \U0001F60A Senang bisa berbagi. Kalau ada topik yang pengen dibahas lebih dalam, tinggal komen aja ya!",
            "Makasih kembali! \U0001F64C Justru diskusi di kolom komentar ini yang bikin kontennya makin hidup. Mampir lagi ya!",
        ])

    # ── kategori: quote / motivasi ──
    if any(k in t for k in ["quote", "motivasi", "menyentuh", "nasihat", "sadar"]):
        return random.choice([
            "Makasih sudah meresapi! \U0001F64F Kadang yang paling sederhana justru paling sulit dipraktikkan. Semoga jadi pengingat yang baik buat kita semua ya!",
            "Senang kalau tulisannya nyampe! \U0001F60A Kadang kita butuh pengingat kecil di tengah kesibukan. Tetap semangat dan konsisten ya!",
        ])

    # ── default humanis (sambutan positif) ──
    return random.choice([
        "Makasih responnya! \U0001F64F Senang diskusinya hidup di sini. Kalau ada topik yang mau dibahas lebih dalam, tinggal komen aja ya!",
        "Wah makasih udah baca dan komen! \U0001F60A Semoga insight-nya kepake buat usaha. Jangan sungkan mampir lagi ya!",
        "Makasih udah mampir! \U0001F60A Setiap komen di sini sangat berarti. Siapa tahu jadi bahasan seru berikutnya di akun ini!",
        "Halo, makasih sudah menyempatkan komen! \U0001F60A Saya senang banget bisa ngobrol sama teman-teman di sini. Ada yang mau ditanyakan lagi?",
    ])


def main():
    tracker = load_tracker()
    pending = fetch_pending()
    todo = [p for p in pending if p["doc_id"] not in tracker]
    print(f"Komentar pending (Twitter @UkyHandoko): {len(pending)} | belum dibalas: {len(todo)}")
    for p in todo[:MAX_PER_RUN]:
        print(f"  - {p['owner']}: {p['text'][:80]}")

    done = 0
    for p in todo[:MAX_PER_RUN]:
        reply = generate_reply(p["text"], p["owner"])
        # VALIDASI KETAT: maks 280 karakter, JANGAN dipotong
        reply = reply.strip()
        if len(reply) > MAX_REPLY_CHARS:
            print(f"  SKIP: balasan {len(reply)} karakter > {MAX_REPLY_CHARS} — ringkas dulu.")
            continue
        try:
            res = post_reply(p["doc_id"], reply)
            tracker[p["doc_id"]] = {
                "owner": p["owner"],
                "comment": p["text"][:100],
                "reply": reply[:100],
                "replied_at": time.strftime("%Y-%m-%d %H:%M:%S"),
            }
            save_tracker(tracker)
            print(f"  \U0001F5E8 Balas {p['owner']} ({p['comment_id']}) -> {str(res)[:80]}")
            done += 1
            if done < MAX_PER_RUN and done < len(todo):
                time.sleep(DELAY_SECONDS)
        except urllib.error.HTTPError as e:
            if e.code == 400:
                tracker[p["doc_id"]] = {
                    "owner": p["owner"],
                    "comment": p["text"][:100],
                    "reply": "",
                    "failed": "400 bad request",
                    "replied_at": time.strftime("%Y-%m-%d %H:%M:%S"),
                }
                save_tracker(tracker)
            print(f"  \u26A0 Gagal balas {p['owner']}: HTTP {e.code}")
        except Exception as e:
            print(f"  \u26A0 Gagal balas {p['owner']}: {str(e)[:120]}")

    sisa = len(todo) - done
    print(f"Selesai — {done} reply terkirim (maks {MAX_PER_RUN}/run). Sisa antrian: {sisa} (diproses run berikutnya).")


if __name__ == "__main__":
    main()
