#!/usr/bin/env python3
"""verify_hc63.py — verifikasi jadwal hc63 lewat GET per-ID (bukan asumsi create)."""
import json, os, re, sys, time

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
import repliz_openssl_transport
repliz_openssl_transport.install(verbose=False)
from repliz_client import ReplizClient, ACC

c = ReplizClient()
MEDIA_FILES = ["ss_hc63_channel10_01_cover.jpg", "ss_hc63_channel10_02_fondasi.jpg",
               "ss_hc63_channel10_03_interaksi.jpg", "ss_hc63_channel10_04_visibilitas.jpg",
               "ss_hc63_channel10_05_cta.jpg"]
ID = {
    "threads": "6acbddcd4ca1569ae0fb7215",
    "reply1": "6acbddcd9c5c4966e67656b2",
    "reply2": "6acbddcd4ca1569ae0fb721b",
    "linkedin": "6acbddcd9c5c4966e67656c0",
    "facebook": "6acbddcd9c5c4966e67656c9",
}
CTA_STRICT = re.compile(r"komentar|diskusi|pendapat|tulis di|share|pengalaman|menurut anda|setuju", re.I)
problems = []


def get(sid):
    last = None
    for i in range(6):
        try:
            d = c.get("/public/schedule/%s" % sid)
            return d.get("doc") or d.get("data") or d
        except Exception as e:
            last = e
            time.sleep(3 + 3 * i)
    raise last


def norm_replies(rr):
    """ObjectId bisa diserialisasi per karakter -> gabung key numerik saja."""
    if not isinstance(rr, list):
        return []
    out = []
    for r in rr:
        if isinstance(r, str):
            out.append(r)
        elif isinstance(r, dict):
            keys = [k for k in r.keys() if k.isdigit()]
            if keys:
                out.append("".join(r[k] for k in sorted(keys, key=int)))
            else:
                out.append(str(r.get("_id") or r.get("id") or ""))
    return [x for x in out if x]


def cek_teks(nama, txt):
    if not txt:
        problems.append("%s: caption kosong" % nama)
        return
    if re.search(r"[\u3000-\u9fff\uff00-\uffef]", txt):
        problems.append("%s: karakter CJK" % nama)
    if re.findall(r"@\w+", txt):
        problems.append("%s: ada mention" % nama)
    caps = [t for t in re.findall(r"#(\w+)", txt) if t != t.lower()]
    if caps:
        problems.append("%s: hashtag kapital %s" % (nama, caps))
    if "..." in txt:
        problems.append("%s: ada elipsis" % nama)


for name, sid in ID.items():
    d = get(sid)
    acc = d.get("accountId")
    st = d.get("status")
    at = d.get("scheduleAt")
    typ = d.get("type")
    meds = d.get("medias") or []
    reps = norm_replies(d.get("replies"))
    desc = d.get("description") or ""
    print("%-9s | %s | %s | %s | medias=%d replies=%s" % (name, st, at, typ, len(meds), reps))
    print("           acc=%s title=%s desc=%d char" % (acc, (d.get("title") or "")[:60], len(desc)))
    if st != "pending":
        problems.append("%s: status %s (harus pending)" % (name, st))
    cek_teks(name, desc)

    if name == "threads":
        if acc != ACC.STUDIOSOFT_THREADS:
            problems.append("threads: akun salah %s" % acc)
        if typ != "album":
            problems.append("threads: type %s (harus album)" % typ)
        if len(meds) != 5:
            problems.append("threads: medias %d (harus 5)" % len(meds))
        urls = [os.path.basename((m.get("url") or "").split("?")[0]) for m in meds]
        if urls != MEDIA_FILES:
            problems.append("threads: urutan media beda: %s" % urls)
        if at != "2026-10-13T02:00:00.000Z":
            problems.append("threads: slot %s" % at)
        if len(desc) > 500:
            problems.append("threads: caption %d > 500" % len(desc))
        if not CTA_STRICT.search(desc[-160:]):
            problems.append("threads: tak ada pancingan diskusi di ekor")
    if name in ("reply1", "reply2"):
        if acc != ACC.STUDIOSOFT_THREADS:
            problems.append("%s: akun salah %s" % (name, acc))
        if ID["threads"] not in reps:
            problems.append("%s: tidak menempel ke album (%s)" % (name, reps))
        if typ != "text" or len(meds) != 0:
            problems.append("%s: type/medias salah" % name)
    if name == "linkedin":
        if acc != ACC.STUDIOSOFT_LINKEDIN:
            problems.append("linkedin: akun salah %s" % acc)
        if typ != "text" or meds or norm_replies(d.get("replies")):
            problems.append("linkedin: harus text tanpa media/replies")
        if at != "2026-10-13T13:00:00.000Z":
            problems.append("linkedin: slot %s" % at)
        if not CTA_STRICT.search(desc[-160:]):
            problems.append("linkedin: tak ada pancingan diskusi di ekor")
    if name == "facebook":
        if acc != ACC.STUDIOSOFT_FB:
            problems.append("facebook: akun salah %s" % acc)
        if typ != "text" or meds or norm_replies(d.get("replies")):
            problems.append("facebook: harus text tanpa media/replies")
        if at != "2026-10-17T12:30:00.000Z":
            problems.append("facebook: slot %s" % at)

print("\nMASALAH: %d" % len(problems))
for p in problems:
    print("  -", p)
