#!/usr/bin/env python3
"""EveryBe: selamatkan 14 postingan Threads yang gagal — pendekkan caption ≤480 karakter lalu jadwalkan ulang.
Pakai --apply untuk membuat jadwal baru; setelahnya jalankan --hapus-lama untuk membersihkan yang gagal."""
import json, re, sys
from datetime import datetime, timedelta, timezone

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

client = get_client()
BATAS = 480            # ambang aman di bawah 500

RINGKAS_PRODUK = {
    "Co Bloong": "krim pijat hangat untuk pegal linu dan otot kaku",
    "Feminine V Spray": "spray kesegaran area kewanitaan dengan bahan lembut",
    "Tone Up": "lotion untuk kulit yang tampak lebih merata",
}


def pendekkan(cap):
    """Susun ulang caption Threads agar ≤480 karakter tanpa kehilangan inti."""
    judul = re.search(r"Edukasi hari ini:\s*(.+?)(?:\.\s|\n)", cap)
    judul = (judul.group(1).strip() if judul else cap.strip().split("\n")[0])[:110]
    url = re.search(r"https?://\S+", cap)
    url = url.group(0) if url else ""
    produk = next((p for p in RINGKAS_PRODUK if p.lower() in cap.lower()), None)
    tagar = re.findall(r"#[\w]+", cap)
    tagar = [t for t in tagar if t.lower() in ("#everybe", "#cobloong", "#femininevspray",
                                               "#toneup", "#edukasikesehatan")][:3]

    baris = [f"Edukasi hari ini: {judul}. 🌿"]
    if produk:
        baris.append(f"{produk} dari EveryBe — {RINGKAS_PRODUK[produk]}.")
    baris.append("Kebiasaan sehat apa yang paling susah kamu jaga? Cerita di komentar.")
    if url:
        baris.append(f"Selengkapnya: {url}")
    if tagar:
        baris.append(" ".join(tagar))
    teks = "\n\n".join(baris)
    if len(teks) > BATAS and url:                     # kalau masih panjang, buang baris terakhir
        teks = "\n\n".join(baris[:-1])
    if len(teks) > BATAS:                             # terakhir: potong di batas kalimat
        teks = teks[:BATAS].rsplit(".", 1)[0] + "."
    return teks


semua, page = [], 1
while True:
    d = client.get_schedules(page=page, limit=100)
    rows = d.get("docs", []) if isinstance(d, dict) else []
    semua += rows
    if len(rows) < 100:
        break
    page += 1

gagal = [s for s in semua if s.get("accountId") == ACC.EVERYBE_THREADS and s.get("status") == "error"]
gagal.sort(key=lambda s: str(s.get("scheduleAt")))

sekarang = datetime.now(timezone.utc)
mulai = (sekarang + timedelta(hours=7)).date() + timedelta(days=1)
rencana = []
for i, s in enumerate(gagal):
    cap_baru = pendekkan(str(s.get("description") or ""))
    hari = mulai + timedelta(days=i)
    jam_utc = (19 - 7) % 24                                  # 19:00 WIB
    slot = datetime(hari.year, hari.month, hari.day, jam_utc, 12, 0, tzinfo=timezone.utc)
    rencana.append({"lama": s.get("_id"), "slot": slot.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
                    "wib": (slot + timedelta(hours=7)).strftime("%d %b %H:%M"),
                    "panjang": len(cap_baru), "caption": cap_baru})

print(f"postingan yang diselamatkan: {len(rencana)}\n")
for r in rencana:
    print(f"--- {r['wib']} | {r['panjang']} karakter ---")
    print(r["caption"])
    print()

if "--apply" in sys.argv:
    print("=== membuat jadwal baru ===")
    ok = gagal_buat = 0
    for r in rencana:
        try:
            hasil = client.schedule_text(ACC.EVERYBE_THREADS, r["caption"], r["slot"])
            sid = hasil.get("scheduleId") if isinstance(hasil, dict) else None
            cek = client.get_schedule(sid) if sid else {}
            benar = isinstance(cek, dict) and cek.get("status") == "pending"
            ok += 1 if benar else 0
            gagal_buat += 0 if benar else 1
            print(f"   {r['wib']} | {'✅' if benar else '⚠️'} | id {sid} | {cek.get('status') if isinstance(cek, dict) else '-'}")
        except Exception as e:
            gagal_buat += 1
            print(f"   ❌ {str(e)[:80]}")
    print(f"\nselesai: berhasil {ok} | gagal {gagal_buat}")
else:
    print("(dry run — pakai --apply untuk menjadwalkan)")
