#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""FB StudioSoft — penuhi tugas mingguan Facebook (27 Sep - 3 Okt 2026).

Perintah Bos 29 Sep 2026: kirim screenshot tugas mingguan FB StudioSoft
(15 postingan publik, 2 reel, 7 cerita, 5 balas komentar, 15 postingan berfoto).

Isi yang dijadwalkan (24 item, semua media sudah 200 di 2 ingress):
  - 15 ALBUM (5 slide carousel hc, type=album) — hitung "postingan" + "postingan berfoto"
  - 2 REEL (video vertikal 1080x1920 dari 5 slide, type=reel)
  - 7 STORY (gambar 9:16 dari slide CTA, type=story, tanpa caption)
Balasan komentar FB tidak bisa lewat API Repliz (dilaporkan ke Bos).
`replies=[]` WAJIB untuk Facebook.

Pakai:
  python3 ss_fb_mingguan_20260929.py            # daftar + validasi caption
  python3 ss_fb_mingguan_20260929.py --go       # buat jadwal + verifikasi
"""
import re
import sys
import time
from datetime import datetime, timezone, timedelta

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
sys.path.insert(0, WS)
from repliz_client import get_client  # noqa: E402

FB = "6a334952c5ff4ce3a3225941"          # StudioSoft (Facebook Page)
BASE = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
WIB = timezone(timedelta(hours=7))
TOPIC = "Mingguan FB StudioSoft"

TAGS = "#studiosoft #digitalmarketingklinik #rumahsakit #klinik #seo #kontenedukasi"

LINK_9KONTEN = "https://studiosoft.id/9-contoh-konten-digital-marketing-rumah-sakit-yang-edukatif-dan-tetap-etis/"
LINK_SEOKLINIK = "https://studiosoft.id/panduan-seo-klinik-rumah-sakit/"
LINK_DM2026 = "https://studiosoft.id/rs-klinik-digital-marketing-2026/"
LINK_JASAKLINIK = "https://studiosoft.id/jasa-digital-marketing-klinik/"
LINK_GBP = "https://studiosoft.id/google-business-profile-klinik/"
LINK_KLINIKCAN = "https://studiosoft.id/cara-klinik-kecantikan-di-surabaya-bisa-ditemukan-lebih-cepat-di-google/"
LINK_7STRATEGI = "https://studiosoft.id/7-strategi-digital-marketing-rumah-sakit-untuk-menambah-pasien-setiap-bulan/"
LINK_10CHANNEL = "https://studiosoft.id/10-channel-digital-marketing-rumah-sakit-yang-wajib-dikelola-di-era-online/"
LINK_SEOKLINIKCAN = "https://studiosoft.id/strategi-seo-terbaik-untuk-klinik-kecantikan-di-surabaya-tingkatkan-pasien-lewat-google/"
LINK_SEOLOKAL = "https://studiosoft.id/tips-seo-digital-marketing-surabaya-optimasi-local-untuk-klinik-dan-bengkel-lokal/"
LINK_GOOGLEADS = "https://studiosoft.id/jasa-google-ads-surabaya/"

# ── caption per seri carousel ───────────────────────────────────────────────
CAPS = {
    "hc37": f"""Klinik yang rajin mengedukasi justru lebih dipercaya daripada yang rajin promo.

Bandingkan: "Promo medical checkup diskon 50%" vs "Kenali 5 tanda awal diabetes yang sering diabaikan". Yang kedua lebih mungkin di-share dan diingat.

Konten edukasi membangun otoritas, menaikkan engagement organik tanpa iklan besar, dan tidak melanggar etika promosi kesehatan.

Contoh kontennya bisa Anda lihat di sini: {LINK_9KONTEN}

Menurut Anda, kualitas layanan RS itu diukur dari apa? Share pendapat Anda di komentar. 👇

{TAGS}""",
    "hc38": f"""Website RS yang lambat dan membingungkan bukan sekadar tidak rapi, ia mengantar pasien ke RS lain.

5 kesalahan fatal:
• Loading lebih dari 3 detik: 53% pengunjung langsung pergi
• Info dokter & jadwal praktik sulit ditemukan
• Tidak ramah ponsel, padahal 70% pasien mencari dari HP
• CTA lemah: tanpa tombol booking atau WhatsApp
• Tanpa integrasi sistem booking online

Fondasi website dan SEO-nya kami rangkum di sini: {LINK_SEOKLINIK}

Website klinik Anda pernah dites kecepatannya? Cerita di komentar. 👇

{TAGS}""",
    "hc39": f"""Iklan RS & klinik di Facebook dan Instagram boleh jalan, asal tahu aturan mainnya.

Yang TIDAK boleh: klaim sembuh berlebihan, foto sebelum-sesudah tanpa disclaimer, testimoni tanpa izin pasien, promo obat resep.

Yang BOLEH: iklan edukasi, promosi bernarasi netral, brand awareness, retargeting.

Selengkapnya: {LINK_DM2026}

Menurut Anda, iklan klinik seperti apa yang masih etis dan tetap efektif? Tulis di komentar. 👇

{TAGS}""",
    "hc40": f"""Banyak pemilik klinik kecil berpikir: "Digital marketing itu buat rumah sakit besar."

Faktanya justru sebaliknya. Klinik kecil paling diuntungkan: biaya lebih rendah, jangkauan lebih tepat, dan hasilnya lebih cepat terasa.

Empat mitos vs faktanya kami bahas di sini: {LINK_JASAKLINIK}

Menurut Anda, mitos mana yang paling sering Anda dengar soal klinik kecil? Yuk diskusi di komentar. 👇

{TAGS}""",
    "hc41": f"""RS dan klinik menghasilkan data setiap hari: kunjungan website, booking, review, sampai hasil iklan.

Masalahnya bukan kurang data, tapi datanya jarang dibaca. Padahal di situ tersimpan jawaban: apa yang sebenarnya dibutuhkan pasien?

{ LINK_DM2026 if False else "Strategi dan pembacaannya: " + LINK_DM2026 }

Bold statement: kebanyakan RS punya data lengkap tapi tidak pernah membacanya. Setuju atau tidak? Tulis di komentar. 👇

{TAGS}""",
    "hc42": f"""Pasien baru pindah rumah dan butuh dokter kulit terdekat. Ia buka Google, ketik klinik kulit Surabaya, lalu pilih satu dari 10 hasil pertama.

SEO menentukan siapa yang muncul di situ. RS dan klinik yang rajin optimasi dapat pasien baru tiap hari, tanpa bayar per klik.

{ LINK_SEOKLINIK if False else "Panduan lengkapnya: " + LINK_SEOKLINIK }

Menurut Anda, apa yang paling menentukan klinik muncul di halaman pertama Google? Yuk diskusi di komentar. 👇

{TAGS}""",
    "hc44": f"""Pasien buka Google Maps, ketik klinik gigi terdekat. Yang muncul: profil klinik lain, lengkap dengan rating, jam buka, dan foto.

Google Business Profile itu gratis dan efeknya langsung terasa. Kuncinya: data lengkap, minimal 20 foto, posting rutin, dan kelola review maksimal 24 jam.

Langkah lengkapnya: {LINK_GBP}

Bold statement: klinik dengan profil Google lengkap akan menang dari klinik yang layanannya bagus tapi tidak terlihat online. Setuju atau tidak? Tulis di komentar. 👇

{TAGS}""",
    "hc45": f"""Pasien tidak lagi percaya brosur: mereka cari di Google, baca ulasan, dan menyimak konten edukasi sebelum memilih RS.

Promosi RS ada etikanya. Ada 9 jenis konten yang aman: edukasi gejala, Tanya Dokter, tips gaya hidup, prosedur medis, profil dokter, testimoni berizin, program sosial, FAQ, dan pengingat kontrol.

Daftar lengkapnya: {LINK_9KONTEN}

Menurut Anda, konten RS seperti apa yang paling dipercaya pasien? Yuk diskusi di komentar. 👇

{TAGS}""",
    "hc46": f"""Pasien klinik kecantikan tidak lagi percaya iklan: mereka mengetik di Google dan memilih dari 5 hasil teratas.

Lima langkah tercepat: rapikan Google Business Profile, riset kata kunci lokal, percepat website di ponsel, rajin konten edukatif, bangun backlink lokal.

Selengkapnya: {LINK_KLINIKCAN}

Menurut Anda, dari lima langkah itu mana yang paling sering dilewatkan klinik? Yuk diskusi di komentar. 👇

{TAGS}""",
    "hc47": f"""Pasien baru tidak lagi datang dari spanduk atau brosur. Mereka mengetik di Google, membaca review, lalu memutuskan berobat.

Tujuh strategi yang terbukti menambah pasien: optimasi website per layanan, konten edukasi, media sosial yang humanis, kelola review, iklan terarah, pendaftaran online, dan analisis data rutin.

Rinciannya: {LINK_7STRATEGI}

Pengalaman apa yang bikin Anda nyaman, atau justru tidak nyaman, dengan sebuah RS? Cerita di komentar. 👇

{TAGS}""",
    "hc49": f"""Klinik kecantikan baru terus bermunculan di Surabaya, tapi yang ditemukan pasien hanya yang muncul di halaman pertama Google.

Bukan soal anggaran besar, melainkan fondasi: kata kunci lokal yang tepat, halaman layanan yang rapi, dan konten yang menjawab pertanyaan pasien.

{ LINK_SEOKLINIKCAN if False else "Fondasi SEO-nya dibahas di sini: " + LINK_SEOKLINIKCAN }

Menurut Anda, dari fondasi SEO itu mana yang paling sering dilewatkan klinik? Yuk diskusi di komentar. 👇

{TAGS}""",
    "hc50": f"""Klinik dan bengkel di Surabaya jarang kalah kualitas, tapi sering kalah di kolom pencarian Google.

Local SEO menutup celah itu: profil Google rapi, ulasan dikelola, kata kunci long-tail, dan konten yang menyebut area sekitar.

Langkahnya: {LINK_SEOLOKAL}

Menurut Anda, dari langkah local SEO itu mana yang paling sering dilewatkan klinik dan bengkel? Yuk diskusi di komentar. 👇

{TAGS}""",
    "hc20": f"""Pasien lebih percaya RS dan klinik yang mengedukasi daripada yang cuma promosi diskon.

Cukup rutin bagikan:
• Info gejala & kapan harus ke dokter
• Mitos vs fakta kesehatan
• Tips pola hidup sehat
• Jawaban pertanyaan pasien

Konten yang bermanfaat menumbuhkan kepercayaan. Sebelum pasien datang, mereka sudah yakin.

Contoh kontennya: {LINK_9KONTEN}

Pengalaman apa yang bikin Anda nyaman, atau tidak nyaman, dengan sebuah RS? Tulis di komentar. 👇

{TAGS}""",
    "hc22": f"""Pasien mencari layanan kesehatan di Google, bukan di Yellow Pages.

Itu sebabnya kehadiran digital fasyankes bukan lagi pelengkap. Website yang jelas, halaman layanan yang rapi, dan profil Google yang terisi membuat pasien menemukan Anda saat mereka benar-benar butuh.

Tanpa fondasi itu, iklan sebesar apa pun hanya menambah biaya tanpa menambah pasien.

Strategi lengkapnya: {LINK_DM2026}

Menurut Anda, apa yang pertama kali Anda cari saat memilih klinik atau RS? Tulis di komentar. 👇

{TAGS}""",
    "hc23": f"""Google Ads untuk RS dan klinik bukan soal siapa yang bayar paling besar, tapi siapa yang muncul tepat saat pasien mencari.

Kuncinya: kata kunci yang sesuai layanan, halaman tujuan yang relevan, dan pengukuran hasil. Tanpa itu, anggaran iklan habis untuk klik yang tidak pernah jadi pasien.

Cara mengatur iklan klinik supaya budget tidak sia-sia: {LINK_GOOGLEADS}

Pernah coba iklan Google untuk praktik atau klinik Anda? Bagaimana hasilnya? Cerita di komentar. 👇

{TAGS}""",
}

CAPS_REEL = {
    "hc43": f"""Pasien baru pindah rumah dan butuh dokter spesialis terdekat. Ia buka Google, bandingkan tiga RS dari website dan review, baru booking.

Digital marketing bukan lagi pilihan, tapi keharusan. 77% pasien mencari informasi RS online sebelum booking. Yang tidak muncul di pencarian kehilangan pasien.

Rincian strateginya: {LINK_DM2026}

Bold statement: RS yang serius menggarap digital marketing akan mengalahkan RS besar yang masih mengandalkan brosur. Setuju atau tidak? Tulis di komentar. 👇

{TAGS}""",
    "hc48": f"""Pasien tidak lagi memilih rumah sakit dari brosur atau rekomendasi tetangga. Mereka mengetik di Google, membaca ulasan, lalu memutuskan.

Ada sepuluh channel yang wajib dikelola: website, SEO, Google Maps, media sosial, video, email, WhatsApp, iklan, portal kesehatan, dan blog edukasi.

Selengkapnya: {LINK_10CHANNEL}

Menurut Anda, dari sepuluh channel itu mana yang paling sering diabaikan rumah sakit? Yuk diskusi di komentar. 👇

{TAGS}""",
}

SLIDE = {
    "hc37": "ss_hc37_edukasi", "hc38": "ss_hc38_website", "hc39": "ss_hc39_iklanfb",
    "hc40": "ss_hc40_klinikkecil", "hc41": "ss_hc41_analytics", "hc42": "ss_hc42_seoklinik",
    "hc43": "ss_hc43_dmrs26", "hc44": "ss_hc44_gbp", "hc45": "ss_hc45_kontenhc",
    "hc46": "ss_hc46_klinikcan", "hc47": "ss_hc47_pasienbaru", "hc48": "ss_hc48_channel10",
    "hc49": "ss_hc49_seoklinikcan", "hc50": "ss_hc50_seolokal", "hc20": "ss_hc20_edukasi",
    "hc22": "ss_hc22_digitalmkt", "hc23": "ss_hc23_googleads",
}

SLIDES = {
    "ss_hc37_edukasi": ["01_cover", "02_alasan", "03_ide", "04_platform", "05_cta"],
    "ss_hc38_website": ["01_cover", "02_kesalahan12", "03_kesalahan34", "04_solusi", "05_cta"],
    "ss_hc39_iklanfb": ["01_cover", "02_tidakboleh", "03_boleh", "04_targeting", "05_cta"],
    "ss_hc40_klinikkecil": ["01_cover", "02_mitos12", "03_mitos34", "04_langkah", "05_cta"],
    "ss_hc41_analytics": ["01_cover", "02_data", "03_contoh", "04_langkah", "05_cta"],
    "ss_hc42_seoklinik": ["01_cover", "02_keyword", "03_local", "04_teknis", "05_cta"],
    "ss_hc43_dmrs26": ["01_cover", "02_data", "03_risiko", "04_langkah", "05_cta"],
    "ss_hc44_gbp": ["01_cover", "02_kenapa", "03_langkah", "04_review", "05_cta"],
    "ss_hc45_kontenhc": ["01_cover", "02_edukasi", "03_trust", "04_layanan", "05_cta"],
    "ss_hc46_klinikcan": ["01_cover", "02_lokal", "03_website", "04_reputasi", "05_cta"],
    "ss_hc47_pasienbaru": ["01_cover", "02_website", "03_reputasi", "04_iklan", "05_cta"],
    "ss_hc48_channel10": ["01_cover", "02_awal", "03_medsos", "04_iklan", "05_cta"],
    "ss_hc49_seoklinikcan": ["01_cover", "02_kenapa", "03_fondasi", "04_lokal", "05_cta"],
    "ss_hc50_seolokal": ["01_cover", "02_penting", "03_gmb", "04_konten", "05_cta"],
    "ss_hc20_edukasi": ["01_cover", "02_kenapa", "03_isi", "04_langkah", "05_cta"],
    "ss_hc22_digitalmkt": ["01_cover", "02_kenapa", "03_isi", "04_langkah", "05_cta"],
    "ss_hc23_googleads": ["01_cover", "02_kenapa", "03_isi", "04_langkah", "05_cta"],
}

# (tanggal, jam, menit, jenis, seri/slide, judul)
ALBUM_PLAN = [
    ("2026-09-29", 17, 0, "hc37", "Website RS yang Bikin Pasien Kabur"),
    ("2026-09-29", 23, 0, "hc38", "5 Kesalahan Fatal Website RS & Klinik"),
    ("2026-09-30", 5, 0, "hc39", "Iklan Facebook & Instagram untuk RS: Etis dan Efektif"),
    ("2026-09-30", 11, 0, "hc40", "Klinik Kecil Juga Butuh Digital Marketing"),
    ("2026-09-30", 17, 0, "hc41", "Data Analytics untuk Memahami Kebutuhan Pasien"),
    ("2026-09-30", 23, 0, "hc42", "Panduan SEO untuk Klinik dan Rumah Sakit"),
    ("2026-10-01", 11, 0, "hc44", "Google Business Profile untuk Klinik"),
    ("2026-10-01", 17, 0, "hc45", "9 Contoh Konten Digital Marketing RS yang Etis"),
    ("2026-10-01", 23, 0, "hc46", "Klinik Kecantikan Surabaya Ditemukan Lebih Cepat"),
    ("2026-10-02", 5, 0, "hc47", "7 Strategi Menambah Pasien Setiap Bulan"),
    ("2026-10-02", 11, 0, "hc49", "Strategi SEO untuk Klinik Kecantikan Surabaya"),
    ("2026-10-02", 17, 0, "hc50", "Local SEO untuk Klinik dan Bengkel Surabaya"),
    ("2026-10-03", 5, 0, "hc20", "Pentingnya Konten Edukasi Kesehatan"),
    ("2026-10-03", 11, 0, "hc22", "Pasien Mencari di Google, Bukan Yellow Pages"),
    ("2026-10-03", 17, 0, "hc23", "Google Ads: Muncul Saat Pasien Butuh"),
]

REEL_PLAN = [
    ("2026-10-01", 20, 0, "hc43", "RS & Klinik Wajib Punya Strategi Digital Marketing 2026"),
    ("2026-10-03", 20, 0, "hc48", "10 Channel Digital Marketing RS yang Wajib Dikelola"),
]

STORY_PLAN = [
    ("2026-09-29", 16, 0, "ss_story_hc37.jpg"),
    ("2026-09-30", 12, 0, "ss_story_hc38.jpg"),
    ("2026-09-30", 18, 0, "ss_story_hc39.jpg"),
    ("2026-10-01", 12, 0, "ss_story_hc40.jpg"),
    ("2026-10-01", 18, 0, "ss_story_hc41.jpg"),
    ("2026-10-02", 12, 0, "ss_story_hc42.jpg"),
    ("2026-10-02", 18, 0, "ss_story_hc43.jpg"),
]


def to_utc(tgl, jam, menit):
    dt = datetime.fromisoformat(f"{tgl}T{jam:02d}:{menit:02d}:00+07:00")
    return dt.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")


def album_medias(seri):
    pre = SLIDE[seri]
    return [{"url": f"{BASE}{pre}_{suf}.jpg", "type": "image", "alt": f"{pre}_{suf}"}
            for suf in SLIDES[pre]]


def validasi():
    masalah = []
    for kode, cap in list(CAPS.items()) + list(CAPS_REEL.items()):
        if "@" in cap and re.search(r"@\w+", cap):
            masalah.append(f"{kode}: ada mention")
        besar = [t for t in re.findall(r"#([^\s#]+)", cap) if t != t.lower()]
        if besar:
            masalah.append(f"{kode}: hashtag huruf besar {besar}")
        if "komentar" not in cap.lower():
            masalah.append(f"{kode}: tanpa ajakan komentar")
        if "studiosoft.id" not in cap:
            masalah.append(f"{kode}: tanpa link studiosoft.id")
        if re.search(r"[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]", cap):
            masalah.append(f"{kode}: ada karakter CJK")
    for tgl, jam, menit, seri, judul in ALBUM_PLAN:
        if seri not in CAPS:
            masalah.append(f"{tgl} {seri}: caption belum ada")
    for tgl, jam, menit, seri, judul in REEL_PLAN:
        if seri not in CAPS_REEL:
            masalah.append(f"{tgl} {seri}: caption reel belum ada")
    return masalah


def semua_jadwal(c):
    docs, page = [], 1
    while page <= 200:
        r = None
        for a in range(6):
            try:
                r = c.get_schedules(page=page, limit=100)
                break
            except Exception:
                time.sleep(5 + 3 * a)
        if r is None:
            break
        b = r.get("docs") or []
        if not b:
            break
        docs += b
        if len(b) < 100:
            break
        page += 1
    return docs


def index_media(docs, akun=FB):
    idx = {}
    for d in docs:
        if d.get("accountId") != akun:
            continue
        if d.get("status") not in ("pending", "success", "processing", "draft"):
            continue
        for m in (d.get("medias") or []):
            fn = (m.get("url") or "").split("/")[-1].lower()
            if fn:
                idx.setdefault(fn, (d.get("_id"), d.get("status")))
    return idx


def main():
    go = "--go" in sys.argv
    masalah = validasi()
    for m in masalah:
        print("❗", m)
    print(f"album: {len(ALBUM_PLAN)} | reel: {len(REEL_PLAN)} | story: {len(STORY_PLAN)} "
          f"| masalah: {len(masalah)}")
    for tgl, jam, menit, seri, judul in ALBUM_PLAN:
        print(f"  {tgl} {jam:02d}:{menit:02d} WIB | album {seri:5} | {len(CAPS[seri]):4} char | {judul}")
    for tgl, jam, menit, seri, judul in REEL_PLAN:
        print(f"  {tgl} {jam:02d}:{menit:02d} WIB | reel  {seri:5} | {len(CAPS_REEL[seri]):4} char | {judul}")
    for tgl, jam, menit, f in STORY_PLAN:
        print(f"  {tgl} {jam:02d}:{menit:02d} WIB | story | {f}")
    if masalah:
        print("\nBATAL: perbaiki caption dulu.")
        return
    if not go:
        print("\n(dry-run — tambahkan --go untuk membuat jadwal)")
        return

    c = get_client()
    idx = index_media(semua_jadwal(c))
    dibuat = []

    def create(jenis, cap, at, judul, medias):
        for attempt in range(1, 5):
            try:
                res = c.create_schedule(FB, cap, at, title=judul, topic=TOPIC,
                                        type_=jenis, medias=medias, replies=[])
                return res.get("scheduleId") or res.get("_id") or res.get("id")
            except Exception as e:
                print(f"    ⚠️ percobaan {attempt} gagal: {str(e)[:120]}")
                time.sleep(10)
        return None

    for tgl, jam, menit, seri, judul in ALBUM_PLAN:
        medias = album_medias(seri)
        if any(m["url"].split("/")[-1].lower() in idx for m in medias):
            sudah = [m["url"].split("/")[-1] for m in medias if m["url"].split("/")[-1].lower() in idx]
            print(f"⏭️  album {seri}: sudah ada ({sudah[0]}) — SKIP")
            continue
        sid = create("album", CAPS[seri], to_utc(tgl, jam, menit), judul, medias)
        print(f"{'✅' if sid else '❌'} album {seri} {tgl} {jam:02d}:{menit:02d} id={sid}")
        if sid:
            dibuat.append((sid, f"album {seri}"))

    for tgl, jam, menit, seri, judul in REEL_PLAN:
        f = f"ss_reel_{seri}.mp4"
        if f.lower() in idx:
            print(f"⏭️  reel {seri}: sudah ada — SKIP")
            continue
        sid = create("reel", CAPS_REEL[seri], to_utc(tgl, jam, menit), judul,
                     [{"url": BASE + f, "type": "video", "alt": f}])
        print(f"{'✅' if sid else '❌'} reel {seri} {tgl} {jam:02d}:{menit:02d} id={sid}")
        if sid:
            dibuat.append((sid, f"reel {seri}"))

    for tgl, jam, menit, f in STORY_PLAN:
        if f.lower() in idx:
            print(f"⏭️  story {f}: sudah ada — SKIP")
            continue
        sid = create("story", "", to_utc(tgl, jam, menit), f"Mingguan FB {f}",
                     [{"url": BASE + f, "type": "image", "alt": f}])
        print(f"{'✅' if sid else '❌'} story {f} {tgl} {jam:02d}:{menit:02d} id={sid}")
        if sid:
            dibuat.append((sid, f"story {f}"))

    print("\n=== VERIFIKASI (baca ulang per ID) ===")
    for sid, label in dibuat:
        d = c.get_schedule(sid)
        d = d.get("data") or d
        if isinstance(d, dict) and "docs" in d:
            d = d["docs"][0]
        nm = len(d.get("medias") or [])
        print(f"  {'✅' if d.get('status') == 'pending' else '⚠️'} {label:14} {sid} "
              f"status={d.get('status')} type={d.get('type')} at={d.get('scheduleAt')} "
              f"medias={nm} replies={d.get('replies')}")


if __name__ == "__main__":
    main()
