#!/usr/bin/env python3
"""fix_hc53_threads_caption.py — perbaiki caption album Threads hc53.

Masalah: base caption 443 char -> `diskusi_engine.tambahkan_diskusi` MENOLAK menambah pancingan
(genting 500) dan mengembalikan caption APA ADANYA, sementara `CTA_RE` memberi FALSE POSITIVE
("siapa yang" mengandung "apa yang") sehingga lolos validasi. Hasil: album hc53 tanpa ajakan
komentar eksplisit.

Perbaikan: pangkas base (hapus "yang sering terlupa: ") lalu PUT description baru (payload lengkap)
ke album yang SAMA -> status tetap pending. Verifikasi baca balik.
"""
import json
import re
import sys
import time

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

ALBUM = "6abeae9107008e0e913db167"
c = ReplizClient()

BASE = """Memilih jasa digital marketing untuk rumah sakit tidak sama dengan memilih agensi untuk bisnis biasa. Ada batas etika promosi kesehatan dan data pasien yang wajib dilindungi.

Tugas agensi bukan membuat rumah sakit viral, tapi memastikan orang yang mencari layanan menemukan RS yang tepat.

Pertanyaan penting: siapa yang memverifikasi kebenaran medis sebelum konten tayang?

https://studiosoft.id/jasa-digital-marketing-rs/"""

HOOKS = [
    "Menurut Anda, apa yang paling menentukan saat memilih agensi untuk rumah sakit? Yuk diskusi di komentar.",
    "Menurut Anda, apa yang paling menentukan saat memilih agensi? Yuk diskusi di komentar.",
    "Menurut Anda, mana yang paling penting? Yuk diskusi di komentar.",
    "Menurut Anda? Yuk diskusi di komentar.",
]
STRICT_CTA = re.compile(r"komentar|diskusi|pendapat|tulis|share|pengalaman|menurut anda|setuju", re.I)


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


cap = None
for h in HOOKS:
    cand = BASE.rstrip() + "\n\n" + h
    if len(cand) <= 500 and STRICT_CTA.search(cand[-160:]):
        cap = cand
        break
assert cap is not None, "tidak ada hook yang muat <=500"
print("caption baru: %d char" % len(cap))
print(cap)
print("---")
assert not re.findall(r"@\w+", cap), "ada mention"
assert not [t for t in re.findall(r"#(\w+)", cap) if t != t.lower()], "hashtag kapital"
assert "..." not in cap
assert not re.search(r"[\u3000-\u9fff\uff00-\uffef]", cap)
print("validasi aturan: OK")

cur = fetch(ALBUM)
print("\nsebelum: status=%s at=%s type=%s medias=%d desc=%d char" % (
    cur.get("status"), cur.get("scheduleAt"), cur.get("type"),
    len(cur.get("medias") or []), len(cur.get("description") or "")))

payload = {
    "accountId": cur.get("accountId") or ACC.STUDIOSOFT_THREADS,
    "title": cur.get("title") or "",
    "description": cap,
    "topic": cur.get("topic") or "",
    "type": cur.get("type") or "album",
    "medias": cur.get("medias") or [],
    "scheduleAt": cur.get("scheduleAt"),
    "replies": [],
}
res = c._request("PUT", "/public/schedule/%s" % ALBUM, payload)
print("PUT ->", json.dumps(res)[:200])

after = fetch(ALBUM)
print("\nsesudah: status=%s at=%s type=%s medias=%d desc=%d char" % (
    after.get("status"), after.get("scheduleAt"), after.get("type"),
    len(after.get("medias") or []), len(after.get("description") or "")))
nd = after.get("description") or ""
print("caption tersimpan sama:", nd == cap)
print("CTA ekor (ketat):", bool(STRICT_CTA.search(nd[-160:])))
print("medias url:", [m.get("url", "").split("/")[-1] for m in (after.get("medias") or [])])
