#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""PASANG bank konten percakapan Threads DAS (@das_indonesia).

Pakai:
  python3 pasang_bank_das_threads.py plan [hari]     # validasi + rencana (tanpa create)
  python3 pasang_bank_das_threads.py run  [hari]     # create (idempoten: slot terisi -> skip)

Slot: 07:00 WIB (tips/mitos) + 19:00 WIB (pertanyaan/cerita). Jam 23:00 lama
ditinggalkan karena mayoritas post DAS tayang di jam itu dan hasilnya nol komentar.

Semua post TANPA link (link tetap datang dari pipeline artikel harian & YouTube short),
WAJIB ada ajakan komentar di 120 karakter terakhir + hashtag huruf kecil + balasan anak.
"""
import re, sys, json, time, datetime
sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import get_client
import bank_das_threads as bank

AKUN = "6a39e461c5ff4ce3a3233e09"          # DAS INDONESIA (threads)
NAMA = "das_indonesia"
JAM_PAGI, JAM_MALAM = 7, 19
MULAI = datetime.date(2026, 10, 7)
HARI_DEFAULT = 12

CTA_RE = re.compile(
    r"komentar|diskusi|pendapat|tulis di|ceritakan|share|pengalaman|"
    r"menurut kamu|menurut anda|setuju|kamu tipe|kamu tim|kamu pernah|kamu pilih",
    re.I)
MENTION_RE = re.compile(r"@\w+")
CJK = re.compile(r"[\u3000-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]")


def validasi(teks, tipe):
    """Kembalikan (teks_final, daftar_masalah)."""
    t = (teks or "").strip()
    tag = bank.HASHTAG[tipe]
    if not re.search(r"#\w", t):
        if len(t) + 2 + len(tag) <= 480:
            t = t + "\n\n" + tag
    tag_list = re.findall(r"#(\w+)", t)
    ekor = t[-120:]
    ada_cta = bool(CTA_RE.search(ekor)) or ("?" in ekor)
    masalah = []
    if len(t) > 480:
        masalah.append(f"len={len(t)}")
    if not ada_cta:
        masalah.append("tanpa-CTA-komentar")
    if MENTION_RE.search(t):
        masalah.append("ada-mention")
    if CJK.search(t):
        masalah.append("CJK")
    if any(x != x.lower() for x in tag_list):
        masalah.append("hashtag-besar")
    if not tag_list:
        masalah.append("tanpa-hashtag")
    if len(re.findall(r"#\w+", t)) > 4:
        masalah.append("hashtag-kebanyakan")
    return t, masalah


def rencana(hari):
    tugas, idx = [], 0
    for i in range(hari):
        tgl = MULAI + datetime.timedelta(days=i)
        pagi = bank.PAGI[i % len(bank.PAGI)]
        malam = bank.MALAM[i % len(bank.MALAM)]
        for ent, jam in ((pagi, JAM_PAGI), (malam, JAM_MALAM)):
            teks, masalah = validasi(ent["text"], ent["tipe"])
            rep, mas_rep = validasi(ent["reply"], ent["tipe"])
            if mas_rep and mas_rep != ["tanpa-CTA-komentar"]:
                masalah = masalah + [f"reply:{m}" for m in mas_rep]
            tugas.append({"tgl": tgl.isoformat(), "jam": jam, "tipe": ent["tipe"],
                          "topic": ent["topic"], "text": teks, "reply": ent["reply"].strip(),
                          "masalah": masalah, "idx": idx})
            idx += 1
    return tugas


def main():
    mode = sys.argv[1] if len(sys.argv) > 1 else "plan"
    hari = int(sys.argv[2]) if len(sys.argv) > 2 else HARI_DEFAULT
    tugas = rencana(hari)
    bad = [t for t in tugas if t["masalah"]]
    print(f"akun: {NAMA} | tugas: {len(tugas)} | bermasalah: {len(bad)}")
    for t in tugas:
        flag = "❌ " + ",".join(t["masalah"]) if t["masalah"] else "✅"
        print(f"  {t['tgl']} {t['jam']:02d}:00 WIB [{t['tipe']}] len={len(t['text']):3} {flag}  "
              f"{t['text'][:52].splitlines()[0]!r}")
    if bad:
        print("\n⛔ Ada entri tidak valid.")
        if mode != "run":
            return
        print("   (mode run: entri bermasalah DILEWATI)")
    if mode != "run":
        return

    c = get_client()
    docs, page = [], 1
    while True:
        r = c.get(f"/public/schedule?page={page}&limit=100")
        d = r.get("docs") or []
        docs.extend(d)
        if not d or page * 100 >= (r.get("totalDocs") or 0):
            break
        page += 1
    terisi = set()
    for d in docs:
        aid = (d.get("account") or {}).get("_id") or d.get("accountId")
        if aid != AKUN:
            continue
        if d.get("status") in ("error", "draft", "canceled"):
            continue
        terisi.add((d.get("scheduleAt") or "")[:16])
    print(f"jadwal existing DAS: {sum(1 for d in docs if ((d.get('account') or {}).get('_id') == AKUN))}")

    hasil = []
    for t in tugas:
        if t["masalah"]:
            hasil.append((t, "SKIP-invalid", None))
            continue
        hh = t["jam"] - 7
        iso = f"{t['tgl']}T{hh:02d}:00"
        if iso in terisi:
            hasil.append((t, "SKIP-slot-terisi", None))
            continue
        jadwal_wib = datetime.datetime.fromisoformat(iso + ":00") + datetime.timedelta(hours=7)
        if jadwal_wib <= datetime.datetime.utcnow() + datetime.timedelta(hours=7):
            hasil.append((t, "SKIP-sudah-lewat", None))
            continue
        res = c.create_schedule(
            AKUN, t["text"], f"{iso}:00.000Z",
            title=f"DAS {t['tipe']} {t['tgl']} {t['jam']:02d}:00",
            topic=t["topic"], type_="text", medias=[],
            replies=[{"text": t["reply"], "username": ""}])
        sid = res.get("scheduleId") or res.get("_id") or res.get("id")
        if sid:
            terisi.add(iso)
        hasil.append((t, "CREATED" if sid else "GAGAL", sid))
        print(f"  {t['tgl']} {t['jam']:02d}:00 -> {hasil[-1][1]} {sid}")
        time.sleep(0.4)

    ok = sum(1 for _, s, _ in hasil if s == "CREATED")
    print(f"\nSELESAI: created {ok} | skip {len(hasil) - ok}")
    json.dump([{**t, "status": s, "id": i} for t, s, i in hasil],
              open("bank_das_threads_hasil.json", "w"), ensure_ascii=False, indent=1)
    print("-> bank_das_threads_hasil.json")


if __name__ == "__main__":
    main()
