#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""PASANG bank konten growth Threads (uky + StudioSoft) ke slor kosong.

Pakai:
  python3 pasang_bank_growth_threads.py plan      # validasi + rencana (tanpa create)
  python3 pasang_bank_growth_threads.py run       # create (idempoten: slot terisi -> skip)
"""
import json, re, sys, datetime, time
from repliz_client import get_client, ReplizClient

ACC = {
    "uky": ("6a334e89c5ff4ce3a3225a48", "uky"),
    "ss": ("6a335b9ec5ff4ce3a3225c2a", "StudioSoft"),
}
# slot per akun (WIB) -> utc = wib-7
SLOT = {"uky": [11, 17, 20], "ss": [11, 20]}
PER_HARI = {"uky": 3, "ss": 2}
MULAI = datetime.date(2026, 10, 4)
HARI = 10

HASHTAG = {
    "uky": "#bisnisdigital #personalbranding #umkm",
    "ss": "#seo #digitalmarketing #umkm #surabaya",
}
CTA_RE = re.compile(
    r"komentar|tulis di|ceritakan|share di|menurut (kamu|anda)|pendapatmu|pengalamanmu|"
    r"setuju|kamu pilih|versi kamu|saranmu|kamu pilih mana|tim mana",
    re.I)
MENTION_RE = re.compile(r"@\w+")
CJK = re.compile(r"[\u3000-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]")

import importlib.util
spec = importlib.util.spec_from_file_location("bank", "bank_threads_growth_20261005.py")
bank = importlib.util.module_from_spec(spec)
spec.loader.exec_module(bank)


CTA_TAIL = {
    "uky": [
        "Tulis pendapatmu di komentar, ya.",
        "Ceritakan pengalamanmu di komentar.",
        "Menurut kamu bagaimana? Tulis di komentar.",
        "Punya cerita soal ini? Share di komentar.",
        "Setuju? Beda pendapat? Tulis di komentar.",
    ],
    "ss": [
        "Menurut kamu bagaimana? Tulis di komentar.",
        "Ceritakan pengalamanmu di komentar.",
        "Pendapatmu apa? Tulis di kolom komentar.",
        "Beda pendapat? Sampaikan di komentar.",
        "Pengalamanmu bagaimana? Share di komentar.",
    ],
}


def validasi(acc, teks, css=0):
    t = teks.strip()
    if not CTA_RE.search(t[-120:]):
        pilihan = CTA_TAIL[acc][css % len(CTA_TAIL[acc]):] + CTA_TAIL[acc][:css % len(CTA_TAIL[acc])]
        pilihan = pilihan + ["Ceritakan di komentar.", "Tulis di komentar."]
        for tail in pilihan:
            if len(t) + 2 + len(tail) <= 498:
                t = t + "\n\n" + tail
                break
    tambahan = ""
    if not re.search(r"#\w", t):
        kandidat = "\n\n" + HASHTAG[acc]
        if len(t) + len(kandidat) <= 498:
            tambahan = kandidat
    full = t + tambahan
    tag_list = re.findall(r"#(\w+)", full)
    masalah = []
    if len(full) > 500:
        masalah.append(f"len={len(full)}")
    if not CTA_RE.search(full[-120:]):
        masalah.append("tanpa-CTA-komentar")
    if MENTION_RE.search(full):
        masalah.append("ada-mention")
    if CJK.search(full):
        masalah.append("CJK")
    if any(x != x.lower() for x in tag_list):
        masalah.append("hashtag-besar")
    return full, masalah


def rencana():
    tugas = []
    idx = {"uky": 0, "ss": 0}
    # jangan sampai entri bank terpakai dua kali
    hari_pakai = min(
        HARI,
        len(bank.UKY) // PER_HARI["uky"],
        len(bank.SS) // PER_HARI["ss"],
    )
    print(f"bank: uky={len(bank.UKY)} ss={len(bank.SS)} -> hari dipakai={hari_pakai}")
    for i in range(hari_pakai):
        tgl = MULAI + datetime.timedelta(days=i)
        css = 0
        for acc in ("uky", "ss"):
            bank_acc = bank.UKY if acc == "uky" else bank.SS
            n = PER_HARI[acc]
            for j in range(n):
                ent = bank_acc[idx[acc] % len(bank_acc)]
                idx[acc] += 1
                jam = SLOT[acc][j]
                full, masalah = validasi(acc, ent["text"], css)
                css += 1
                tugas.append({
                    "akun": acc, "tgl": tgl.isoformat(), "jam": jam,
                    "tipe": ent["tipe"], "text": full, "masalah": masalah,
                })
    return tugas


def main():
    mode = sys.argv[1] if len(sys.argv) > 1 else "plan"
    tugas = rencana()
    bad = [t for t in tugas if t["masalah"]]
    print(f"total tugas: {len(tugas)} | bermasalah: {len(bad)}")
    for t in tugas:
        flag = "❌ " + ",".join(t["masalah"]) if t["masalah"] else "✅"
        print(f"  {t['tgl']} {t['jam']:02d}:00 WIB {t['akun']:3} [{t['tipe']}] "
              f"len={len(t['text']):3}  {flag}  {t['text'][:58]!r}")
    if bad:
        print("\n⛔ Ada entri tidak valid — perbaiki dulu sebelum run.")
        if mode != "run":
            return
        print("   (mode run: entri bermasalah DILEWATI)")
    if mode != "run":
        return

    c = get_client()
    docs = []
    page = 1
    while True:
        r = c.get_schedules(page=page, limit=100)
        d = r.get("docs") or []
        docs.extend(d)
        if not d or len(docs) >= (r.get("totalDocs") or 0) or page > 40:
            break
        page += 1
    print(f"jadwal existing: {len(docs)}")

    terisi = set()
    for d in docs:
        aid = (d.get("account") or {}).get("_id") or d.get("accountId")
        if aid not in (ACC["uky"][0], ACC["ss"][0]):
            continue
        st = d.get("status")
        if st in ("error", "draft", "canceled"):
            continue
        iso = d.get("scheduleAt") or ""
        terisi.add((aid, iso[:16]))

    hasil = []
    for t in tugas:
        if t["masalah"]:
            hasil.append((t, "SKIP-invalid", None))
            continue
        aid = ACC[t["akun"]][0]
        hh = t["jam"] - 7
        iso = f"{t['tgl']}T{hh:02d}:00"
        if (aid, iso) in terisi:
            hasil.append((t, "SKIP-slot-terisi", None))
            continue
        jadwal_dt = datetime.datetime.fromisoformat(iso + ":00") + datetime.timedelta(hours=7)
        if jadwal_dt <= datetime.datetime.utcnow() + datetime.timedelta(hours=7):
            hasil.append((t, "SKIP-sudah-lewat", None))
            continue
        # Label/kategori jadwal — JANGAN pakai kata "growth" untuk uky
        # (perintah Bos 4 Okt 2026: "Itu threads jangan kategori growth uky").
        # Aturan terbaru: label + judul = POKOK BAHASAN isi post (Bos: "semisal bahas AI ya seputaran AI").
        # Peta label resmi: `label_ulang_threads_isi.py`.
        LABEL_UKY = {"Q": "Diskusi & Tanya", "O": "Opini Bisnis", "T": "Tips & Pengalaman"}
        res = c.create_schedule(aid, t["text"], f"{iso}:00.000Z",
                                title=(f"uky {t['tipe']} {t['tgl']}" if t["akun"] == "uky"
                                       else f"Growth {t['akun']} {t['tipe']} {t['tgl']}"),
                                topic=(LABEL_UKY.get(t["tipe"], "Diskusi & Tanya") if t["akun"] == "uky"
                                       else f"Growth {t['akun']}"),
                                type_="text", medias=[], replies=[])
        sid = res.get("scheduleId") or res.get("_id") or res.get("id")
        terisi.add((aid, iso))
        hasil.append((t, "CREATED" if sid else "GAGAL", sid))
        print(f"  {t['tgl']} {t['jam']:02d}:00 {t['akun']} -> {hasil[-1][1]} {sid}")
        time.sleep(0.4)

    ok = sum(1 for _, s, _ in hasil if s == "CREATED")
    print(f"\nSELESAI: created {ok} | skip {len(hasil)-ok}")
    json.dump([{**t, "status": s, "id": i} for t, s, i in hasil],
              open("growth_threads_hasil_20261005.json", "w"), ensure_ascii=False, indent=1)
    print("-> growth_threads_hasil_20261005.json")


if __name__ == "__main__":
    main()
