#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Pangkas `topic` jadwal Threads yang >50 karakter.

Sebab: Repliz mengirim field `topic` sebagai topic_tag Threads, dan API menolak
>50 karakter dengan error "Param topic_tag must be at most 50 characters long."
Jadwal tetap tersimpan (tanpa peringatan), BARU GAGAL saat jam tayang — kasus
7 Okt 08:00 WIB "Social Proof Itu Bernilai Lebih dari Iklan" (topic 208 char).
Bukti: 544 jadwal Threads yang sukses, topic terpanjang 48 char; 0 yang >50.

Dua mode:
  python3 perbaiki_topic_threads.py            # dry run (pakai ringkasan peta LABEL)
  python3 perbaiki_topic_threads.py --run      # eksekusi (PUT)
  python3 perbaiki_topic_threads.py --auto     # pangkas mekanis <=50 char (untuk yang
                                               # belum ada di peta LABEL)
"""
import datetime
import sys
import time

sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import (MAKS_TOPIC_THREADS, THREADS_ACCOUNT_IDS, get_client,
                           pangkas_topic)

STATUS_PENDING = ("pending", "draft", "scheduled", "")

# Ringkasan pokok bahasan <=50 char (tulis tangan supaya enak dibaca, perintah Bos
# 4 Okt: topic = pokok bahasan isi).
LABEL = {
    "6aaad98a9aa606c3bd7bd21f": "Personal branding = aset, bukan logo",
    "6ac53791411e0d496439bfd9": "Tim dulu, baru klien: tim happy, hasil bagus",
    "6aac2ae99aa606c3bd9be374": "Mindset bisnis: gagal itu data",
    "6aad7c88fc107e4fe5110e33": "Modal bukan alasan: waktu, lapar, jaringan",
    "6aaece7c02078a414a63237b": "Karakter klien ideal yang aku cari",
    "6ab0fe943032e3a79ceeae30": "Retensi klien = 90% komunikasi",
    "6ab1711d02078a414af47373": "Diferensiasi brand: berani beda",
    "6ab2c2742801585400698770": "Belajar dari kegagalan sendiri",
    "6ab4141e0723d7da888447de": "Kualitas konten di era AI",
    "6ab565a90723d7da88c214ab": "Keputusan bisnis: data + intuisi",
    "6ab6b70574292ea3cb7cfc8f": "Digital vs tradisional: pilih sesuai audiens",
    "6ab808a874292ea3cbcbce05": "Kritik klien = hadiah, bukan musuh",
    "6ab959f39a8564a8eba3ea37": "Fokus satu niche: healthcare & branding",
    "6abaab7d7a036ffb50d5dbc1": "Growth mindset: kunci bertahan",
    "6abbfd091733078385acf63e": "Harga vs value: kompetisi di hasil",
    "6abd4eb01246a403edac9f3c": "Branding = investasi, bukan biaya",
    "6abe9fe5173307838542452b": "Networking = aset paling underrated",
    "6abff17c17330783858926a3": "Konsistensi brand: repetisi = kepercayaan",
    "6ac1430007008e0e91a93b86": "Bisnis itu sistem, bukan orang kunci",
    "6ac2948207008e0e91e2d762": "Slow business: pelan tapi berkualitas",
}


def fetch_all(c):
    r = c.get_schedules(page=1, limit=100)
    pages = (r["totalDocs"] + 99) // 100
    docs = list(r["docs"])
    for p in range(2, pages + 1):
        docs.extend(c.get_schedules(page=p, limit=100)["docs"])
    return docs


def wib(iso):
    dt = datetime.datetime.fromisoformat(iso.replace("Z", "+00:00"))
    return (dt + datetime.timedelta(hours=7)).strftime("%d %b %H:%M")


def main():
    run = "--run" in sys.argv
    auto = "--auto" in sys.argv
    c = get_client()
    docs = fetch_all(c)
    rusak = []
    for d in docs:
        a = d.get("account") or {}
        aid = d.get("accountId") or a.get("_id")
        if aid not in THREADS_ACCOUNT_IDS:
            continue
        if (d.get("status") or "").lower() not in STATUS_PENDING:
            continue
        sid = d.get("_id") or d.get("id")
        t = d.get("topic") or ""
        if len(t) <= MAKS_TOPIC_THREADS:
            continue
        baru = LABEL.get(sid) or (pangkas_topic(t) if auto else None)
        rusak.append((wib(d.get("scheduleAt", "")), a.get("name", "?"), sid, t, baru))

    rusak.sort()
    print(f"jadwal Threads pending dengan topic >{MAKS_TOPIC_THREADS}: {len(rusak)}")
    belum = [r for r in rusak if not r[4]]
    for w, nama, sid, t, baru in rusak:
        tanda = "✅" if baru else "⚠️ belum ada ringkasan"
        print(f"  {tanda} {w}  {nama:<18} {len(t):>3}ch -> {baru!r}  ({sid})")
    if belum:
        print(f"\n{len(belum)} jadwal belum punya ringkasan di peta LABEL "
              f"(jalankan dengan --auto untuk pangkas mekanis).")
    if not rusak:
        return
    target = [(w, nama, sid, t, baru) for w, nama, sid, t, baru in rusak if baru]
    if not run:
        print(f"\n(dry run — {len(target)} akan diubah; tambahkan --run untuk eksekusi)")
        return

    ok = gagal = 0
    for w, nama, sid, t, baru in target:
        try:
            c.update_schedule(sid, {"topic": baru})
            ok += 1
        except Exception as e:  # noqa: BLE001
            gagal += 1
            print("❌", sid, type(e).__name__, str(e)[:140])
        time.sleep(0.3)

    salah = []
    for w, nama, sid, t, baru in target:
        cur = c.get_schedule(sid) or {}
        if cur.get("topic") != baru:
            salah.append((sid, cur.get("topic"), baru))
    print(f"\nselesai: ok {ok} | gagal {gagal} | tidak sesuai setelah verifikasi: {len(salah)}")
    for s in salah:
        print("  ", s)


if __name__ == "__main__":
    main()
