#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Soto Semarang Pak Otto — Threads Autoreply KHUSUS (diaktifkan 21/08/2026).
Balas komentar/mention yang MASUK ke Threads @sotosemarang.pakotto (ACC.SOTO_THREADS)
dengan bahasa humanis & sambutan positif.

Aturan:
- HANYA akun Threads Pak Otto — akun lain TETAP MATI (aturan Bos 18 Agu).
- Balas komentar pending, bahasa humanis, pakai "saya".
- Maks 480 karakter per balasan, validasi threads_text_check.
- Max 5 reply/run, jeda 2 menit.
- Tracker global biar gak balas 2x.
- Keyword: menu/harga → info menu + ajak mampir; default humanis.
- **REPLY KE-2+ (Bos 22/08):** kalau user yang sama sudah pernah dibalas (reply ke-2 dan seterusnya),
  balasan otomatis arahkan DATANG KE LOKASI + tampilkan IMAGE MENU (soto_menu.jpg).
"""
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
from threads_text_check import cek_teks_threads, ThreadsTextError

ACCOUNT_ID = "6a86d84b62caae1e04fff12c"   # ACC.SOTO_THREADS
ACCOUNT_NAME = "@sotosemarang.pakotto"
TRACKER = "/home/mantapman/.hermes/profiles/atun/workspace/.soto_threads_mention_tracker.json"
MAX_PER_RUN = 5
DELAY_SECONDS = 120
MAX_REPLY_CHARS = 480

MENU_TEXT = ("Menu andalan kami: Soto Ayam Kampung, Sate Kerang, "
             "Nasi Goreng Babat & Kulit! 🍜 Kuah bening khas Semarang, "
             "ayam kampung empuk. Mampir yuk, kami tunggu di "
             "Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo! 😊")

# ── Reply ke-2+ (aturan Bos 22/08): arahkan datang + tampilkan image menu ──
MENU_IMAGE_URL = "https://mantapserver.tail3947bb.ts.net/soto_menu.jpg"
ALAMAT = ("Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo 📍 "
          "Buka Setiap Hari 10.00–21.00 WIB")


def generate_reply_kedua():
    """Balasan untuk reply/komen ke-2 dan seterusnya: arahkan datang ke lokasi + menu + pertanyaan lanjutan."""
    return random.choice([
        f"Kami tunggu kedatanganmu ya, kak! 😊 Kami di {ALAMAT}. Ini menu kami — "
        "soto ayam kampung cuma Rp10 ribu tok, ada paket makan & minum berdua 35rb. Mampir yuk! 🍜\n\n"
        "Rencananya mampir hari apa nih?",
        f"Siap, kak! Datang aja langsung ke warung ya — {ALAMAT}. Ini menu lengkapnya "
        "biar gak bingung milih 😄 Soto Rp10 ribu, sate kerang juara! 🦪\n\n"
        "Mau pesen yang mana duluan kalau nanti mampir?",
        f"Boleh banget kak! Di {ALAMAT} — ini menu kami ya. "
        "Soto ayam kampung, sate kerang, nasi goreng babat & kulit. Mampir, kami siapin yang hangat! 🍜\n\n"
        "Biasanya kalian makan soto pake nasi apa gak? 😄",
    ])


def count_owner_replies(tracker, owner):
    """Berapa kali owner ini sudah pernah dibalas (untuk deteksi reply ke-2+)."""
    n = 0
    for v in tracker.values():
        if isinstance(v, dict) and v.get("owner") == owner:
            n += 1
    return n


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, media_url=None):
    """Balas komentar. Kalau media_url dikasih → coba kirim image menu;
    kalau API tolak (400/422) → fallback text-only biar balasan tetap terkirim."""
    payload = {"text": text}
    if media_url:
        payload["medias"] = [{"url": media_url, "type": "image", "alt": "Menu Soto Semarang Pak Otto"}]
    body = json.dumps(payload).encode()
    req = urllib.request.Request(
        f"{BASE}/public/comment/{doc_id}",
        data=body, headers={**HEADERS, "Content-Type": "application/json"},
        method="POST")
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            return json.loads(r.read().decode())
    except urllib.error.HTTPError as e:
        if e.code in (400, 422) and media_url:
            print(f"  ⚠️ Media ditolak API ({e.code}) — fallback text only")
            return post_reply(doc_id, text, media_url=None)
        raise


def fetch_pending():
    """Komentar pending khusus akun Pak Otto."""
    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") != 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 "?",
            "text": text,
            "created": x.get("createdAt", ""),
        })
    out.sort(key=lambda r: r["created"], reverse=True)
    return out


def generate_reply(text):
    """Jawab sesuai pertanyaan + SELALU diakhiri pertanyaan lanjutan (Bos 8 Sep 2026)."""
    t = (text or "").lower()
    # ── lokasi / alamat / jam (cek PALING DULU — "jam berapa", "dimana" dll) ──
    if any(k in t for k in ["lokasi", "alamat", "dimana", "di mana", "jam", "buka", "tutup", "senin", "dimn", "dmn"]):
        return random.choice([
            "Kami di Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo. 📍 Buka setiap hari 10.00–21.00 WIB.\n\nKamu dari area mana? Siapa tau deket sama warung kami! 😄",
            "Alamatnya: Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo. Buka tiap hari 10.00-21.00 WIB, soto hangatnya selalu siap! 🍜\n\nBiasanya kalian mampir jam berapa nih — siang atau malem?",
        ])
    # ── menu / harga / pesan ──
    if any(k in t for k in ["menu", "harga", "price", "makanan apa", "ada apa", "pesan", "order", "berapa", "biaya", "duit", "rp"]):
        return random.choice([
            "Menu andalan kami: Soto Ayam Kampung Rp10 ribu, Sate Kerang, Nasi Goreng Babat & Kulit! 🍜 Kuah bening khas Semarang, ayam kampung empuk. Ada juga lumpia Semarang 7 ribuan & tempe mendoan cuma 2 ribuan.\n\nKamu paling suka nyamil yang mana — lumpia apa mendoan? 😄",
            "Boleh kak! Soto Ayam Kampung cuma Rp10 ribu tok, ada sate kerang, nasgor babat & kulit, lumpia 7rb, mendoan 2rb. Pas buat laper malam! 😋\n\nUdah pernah coba yang mana dulu? Cerita dong!",
        ])
    # ── delivery / ojol / gojek / grab / antar ──
    if any(k in t for k in ["ojol", "gojek", "grab", "delivery", "antar", "gofood", "grabfood", "shopeefood", "online"]):
        return random.choice([
            "Bisa banget kak! Soto kami bisa dipesan lewat layanan antar — tapi paling mantap memang langsung dimakan hangat di warung. 😄 Kuahnya masih ngebul!\n\nBiasanya kalian pesen antar atau mampir langsung?",
            "Tentu bisa diantar kak! Tapi kalau mampir langsung, kamu bisa cobain juga lumpia & mendoan yang baru digoreng. 😋\n\nLebih suka dine-in apa delivery nih?",
        ])
    # ── pedas / sambal ──
    if any(k in t for k in ["pedas", "sambal", "level", "tidak pedas"]):
        return random.choice([
            "Sambal kami bisa diatur sesuai selera kak — dari yang gak pedas sampai yang bikin keringetan! 😄🌶️\n\nKamu tim pedas level berapa nih?",
            "Tenang kak, level pedasnya bisa request. Soto tetap enak dinikmati tanpa sambal kok!\n\nSambal favoritmu yang gimana — uleg atau kuah?",
        ])
    # ── halal / bahan / ayam kampung ──
    if any(k in t for k in ["halal", "bahan", "ayam kampung", "halal?", "babi"]):
        return random.choice([
            "InsyaAllah halal kak! Kami pakai ayam kampung pilihan yang fresh tiap hari, kuah bening tanpa santan. Ada juga olahan babat & kulit — khas Semarang banget. 😊\n\nKamu paling suka bagian soto yang mana — dagingnya atau kuahnya?",
            "Bahan kami fresh tiap hari kak — ayam kampung asli, bukan ayam potong. Rasa kuahnya ringan & gurih, nggak enek.\n\nPernah cobain soto ayam kampung sejati? Ini bedanya kerasa banget!",
        ])
    # ── rekomendasi / enak / cobain ──
    if any(k in t for k in ["rekomendasi", "rekomend", "enak nggak", "worth", "cobain apa", "favorit"]):
        return random.choice([
            "Kalau pertama kali mampir, wajib coba Soto Ayam Kampungnya! Tambah lumpia & mendoan — dijamin makin mantap. 😋🍜\n\nRencananya mau mampir kapan nih? Bareng siapa?",
            "Rekomendasi saya: soto ayam kampung + sepiring mendoan hangat. Simple tapi nagih! 🔥\n\nKalau kamu, biasanya soto paling enak dinikmati sendiri atau rame-rame?",
        ])
    # ── terima kasih ──
    if any(k in t for k in ["makasih", "terima kasih", "thanks", "thank you", "sip", "oke", "ok"]):
        return random.choice([
            "Sama-sama kak! 😊 Senang bisa berbagi cerita. Jangan lupa mampir — soto hangatnya udah siap dari jam 10 pagi! 🍜\n\nAda menu yang paling bikin penasaran nggak?",
            "Makasih kembali! 🙏 Komentar kalian yang bikin warung kami makin semangat.\n\nKira-kira soto versi favoritmu kayak gimana — bening yang gurih atau ada tambahan spesial?",
        ])
    # ── Semarang / nostalgia ──
    if any(k in t for k in ["semarang", "kangen", "nostalgia", "lawang sewu", "tugu muda", "kota lama", "lumpia"]):
        return random.choice([
            "Ahh Semarang — kota yang selalu bikin kangen. 😌 Untungnya, rasa Semarang bisa kamu temuin di Sidoarjo, di warung kami! Lumpia & soto-nya beneran bikin kangen kesampean. 🍜\n\nPernah kulineran di Semarang? Daerah mana yang paling berkesan?",
            "Betul kak, rasa Semarang emang beda! Kami masak pakai resep turun-temurun biar otentik.\n\nKalau ke Semarang, kuliner wajib apa menurutmu — soto, lumpia, atau wingko babat? 😄",
        ])
    # ── porsi / kenyang / keluarga ──
    if any(k in t for k in ["porsi", "kenyang", "keluarga", "rame", "berdua", "banyak"]):
        return random.choice([
            "Porsi kami pas & mengenyangkan kak! Ada paket 35rb: 2 soto ayam kampung + 2 es teh + 4 mendoan — makan berdua kenyang tanpa drama! 😄\n\nBiasanya mampir sendiri, berdua, atau sama keluarga?",
            "Buat yang laper banget, tinggal tambah nasgor babatnya! Dijamin kenyang sampai malem. 😋\n\nKamu tim sekali pesan banyak atau cicil-cicil?",
        ])
    # ── default humanis + pertanyaan lanjutan ──
    return random.choice([
        "Makasih responnya kak! 🙏 Senang diskusinya hidup di sini. Soto hangat + sate kerang udah siap nemenin kapanpun kamu mampir! 🍜\n\nBtw, kamu orangnya lebih suka soto ayam atau soto daging nih?",
        "Wah makasih udah baca & komen! 😊 Kalau penasaran sama rasanya, mampir aja ke warung kami — Jl. Graha Anggrek Mas No. C-16, Pagerwojo.\n\nKira-kira topping soto favoritmu apa — ayam, babat, atau telur?",
        "Halo kak, makasih udah singgah! 😄 Kalau ada yang mau ditanya soal menu, harga, atau lokasi, tanya aja — saya bantu jawab.\n\nEh iya, kamu biasanya nyari kuliner Sidoarjo dari mana — TikTok, Google, atau kata temen?",
    ])


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()
    pending = fetch_pending()
    todo = [p for p in pending if p["doc_id"] not in tracker]
    print(f"Komentar pending Pak Otto: {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 ke-2 dan seterusnya (user yang sama pernah dibalas) → arahkan datang + image menu
        prev = count_owner_replies(tracker, p["owner"])
        if prev >= 1:
            reply = generate_reply_kedua()
            media = MENU_IMAGE_URL
        else:
            reply = generate_reply(p["text"])
            media = None
        try:
            reply = cek_teks_threads(reply, label="Balasan Pak Otto", maxlen=MAX_REPLY_CHARS)
        except ThreadsTextError as e:
            print(f"  SKIP: {e}")
            continue
        try:
            res = post_reply(p["doc_id"], reply, media_url=media)
            tracker[p["doc_id"]] = {
                "owner": p["owner"],
                "comment": p["text"][:100],
                "reply": reply[:100],
                "reply_ke": prev + 1,
                "media": media,
                "replied_at": time.strftime("%Y-%m-%d %H:%M:%S"),
            }
            save_tracker(tracker)
            print(f"  💬 Balas {p['owner']} (reply ke-{prev+1}{' + gambar menu' if media else ''}) -> {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:
                print(f"  SKIP (400): {p['doc_id']}")
            else:
                print(f"  ❌ HTTP {e.code} pada {p['doc_id']}")
        except Exception as e:
            print(f"  ❌ {e}")
    print(f"Selesai: {done} reply")


if __name__ == "__main__":
    main()
