#!/usr/bin/env python3
"""verify_hc54.py — verifikasi jadwal hc54 dari API (album Threads + 2 replies + LinkedIn + FB text)."""
import re
import sys
import time

sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import ReplizClient, ACC

ALBUM = "6ac0003e07008e0e916ddc10"
LIID = "6ac0003f17330783858bf611"
FBID = "6ac0003f17330783858bf61e"
EXPECT_MEDIA = ["ss_hc54_jasmarkklinik_%02d_%s.jpg" % (i, n) for i, n in
                [(1, "cover"), (2, "perjalanan"), (3, "strategi"), (4, "kesalahan"), (5, "cta")]]
c = ReplizClient()


def norm_replies(r):
    out = []
    for x in (r or []):
        if isinstance(x, dict):
            nums = sorted([k for k in x.keys() if str(k).isdigit()], key=lambda k: int(k))
            if nums:
                out.append("".join(str(x[k]) for k in nums))
        else:
            out.append(str(x))
    return out


def get_retry(ep, tries=6):
    last = None
    for i in range(tries):
        try:
            return c.get(ep)
        except Exception as e:
            last = e
            time.sleep(3 + 3 * i)
    raise last


def fetch(sid):
    d = get_retry("/public/schedule/%s" % sid)
    return d.get("doc") or d.get("data") or d


print("=== 1) ALBUM THREADS", ALBUM)
a = fetch(ALBUM)
print("  status=%s at=%s type=%s account=%s" % (a.get("status"), a.get("scheduleAt"), a.get("type"),
                                                (a.get("account") or {}).get("name")))
medias = a.get("medias") or []
got = [m.get("url", "").split("/")[-1] for m in medias]
print("  medias=%d" % len(medias))
for i, (exp, g) in enumerate(zip(EXPECT_MEDIA, got)):
    print("   %d %s %s" % (i + 1, "\u2705" if exp == g else "\u274c", g))
print("  urutan sesuai:", got == EXPECT_MEDIA)
desc = a.get("description") or ""
print("  caption=%d char | judul=%s" % (len(desc), (a.get("title") or "")[:70]))
print("  link artikel ada:", "jasa-digital-marketing-klinik" in desc)
print("  mention:", re.findall(r"@\w+", desc))
print("  hashtag KAPITAL:", [t for t in re.findall(r"#(\w+)", desc) if t != t.lower()])
print("  CJK:", bool(re.search(r"[\u3000-\u9fff\uff00-\uffef]", desc)))
print("  CTA ekor (STRICT):", bool(re.search(r"komentar|diskusi|pendapat|tulis di|share|pengalaman|menurut anda|setuju", desc[-160:], re.I)))

print("\n=== 2) ANAK/REPLY di sekitar 2026-10-04T02:0x (Threads SS)")
docs, page = [], 1
while True:
    d = get_retry("/public/schedule?page=%d&limit=100" % page)
    docs.extend(d.get("docs", []))
    if page >= (d.get("totalPages") or 1):
        break
    page += 1
kids = [x for x in docs if x.get("accountId") == ACC.STUDIOSOFT_THREADS
        and (x.get("scheduleAt") or "").startswith("2026-10-04T02:0")]
kids.sort(key=lambda x: x.get("scheduleAt"))
for k in kids:
    rr = norm_replies(k.get("replies"))
    print("  %s %s type=%s status=%s len=%d replies=%s" % (
        k.get("scheduleAt")[11:19], k.get("_id"), k.get("type"), k.get("status"),
        len(k.get("description") or ""), rr))
print("  anak menempel ke album:", sum(1 for k in kids if ALBUM in norm_replies(k.get("replies"))))

print("\n=== 3) LINKEDIN", LIID)
li = fetch(LIID)
print("  status=%s at=%s type=%s account=%s medias=%d replies=%s" % (
    li.get("status"), li.get("scheduleAt"), li.get("type"), (li.get("account") or {}).get("name"),
    len(li.get("medias") or []), norm_replies(li.get("replies"))))
ldesc = li.get("description") or ""
print("  caption=%d char | judul=%s" % (len(ldesc), (li.get("title") or "")[:70]))
print("  link artikel ada:", "konsultan-pemasaran-digital" in ldesc)
print("  mention:", re.findall(r"@\w+", ldesc))
print("  hashtag KAPITAL:", [t for t in re.findall(r"#(\w+)", ldesc) if t != t.lower()])
print("  CTA ekor:", bool(re.search(r"komentar|diskusi|menurut", ldesc[-200:], re.I)))

print("\n=== 4) FACEBOOK", FBID)
f = fetch(FBID)
print("  status=%s at=%s type=%s account=%s medias=%d replies=%s" % (
    f.get("status"), f.get("scheduleAt"), f.get("type"), (f.get("account") or {}).get("name"),
    len(f.get("medias") or []), norm_replies(f.get("replies"))))
fdesc = f.get("description") or ""
print("  caption=%d char | judul=%s" % (len(fdesc), (f.get("title") or "")[:70]))
print("  link FB:", "panduan-seo-klinik-rumah-sakit" in fdesc)
print("  mention:", re.findall(r"@\w+", fdesc))
print("  hashtag KAPITAL:", [t for t in re.findall(r"#(\w+)", fdesc) if t != t.lower()])
print("  CTA ekor:", bool(re.search(r"komentar|diskusi|menurut", fdesc[-200:], re.I)))

print("\n=== 5) tidak ada duplikat media ss_hc54 di akun SS (pending)")
dup = []
for s in docs:
    if s.get("accountId") not in (ACC.STUDIOSOFT_THREADS, ACC.STUDIOSOFT_LINKEDIN, ACC.STUDIOSOFT_FB):
        continue
    for m in (s.get("medias") or []):
        b = (m.get("url") or "").split("/")[-1].lower()
        if b.startswith("ss_hc54_"):
            dup.append((s.get("accountId"), (s.get("scheduleAt") or "")[:16], b, s.get("status")))
print("  jumlah jadwal ber-media ss_hc54:", len(dup))
for d in dup:
    print("   ", d)
