#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Dojo Ksatria IG — video Muhammad Bintang di Kejuaraan Karate International
Yogyakarta Open Tournament (sudut biru).

Perintah Bos 15 Sep 2026: "pasang ini sesuaikan urutan akhir / antrian akhir untuk
ig ksatriadojo". Antrean pending terakhir IG ksatriadojo = 21 Sep 2026 09:00 WIB
(dojo_07) → video ini ditempatkan di slot berikutnya: 22 Sep 2026 09:00 WIB
(2026-09-22T02:00:00.000Z) — 1 post/hari, tanpa menyela antrean lama.

Idempoten: kalau media dengan basename sama sudah ada (status pending/success/
processing/draft), SKIP create. Error TIDAK dihitung sebagai "sudah ada".
"""
import os, sys, shutil, subprocess, json
from datetime import datetime, timezone, timedelta
from PIL import Image

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from repliz_client import ReplizClient, ACC, IMG_BASE_URL

WIB = timezone(timedelta(hours=7))
ROOT = os.path.dirname(os.path.abspath(__file__))
IMG_DIR = os.path.join(ROOT, "openclaw-img")
LOG_FILE = os.path.join(ROOT, "dojo_ksatria_log.txt")

SRC_VIDEO = "/home/mantapman/.hermes/profiles/atun/cache/videos/video_e6a7d27e528c.mp4"
BASENAME = "dojo_bintang_yogyakarta_01"
VIDEO_NAME = BASENAME + ".mp4"
THUMB_NAME = BASENAME + "_thumb.jpg"
SCHEDULE_AT = "2026-09-22T02:00:00.000Z"   # 22 Sep 2026 09:00 WIB
INGRESS = ["103.84.155.153", "103.84.155.217"]

CAPTION = (
    "Muhammad Bintang, anggota Dojo Ksatria, berlaga di sudut biru pada Kejuaraan "
    "Karate International Yogyakarta Open Tournament! 🥋🔥\n\n"
    "Tampil di tatami internasional mewakili Dojo Ksatria — keberanian untuk berani "
    "tampil itu sendiri sudah sebuah kemenangan. Pengalaman inilah yang membentuk "
    "mental juara sejak dini. 💪\n\n"
    "Terus melangkah, Bintang! Satu dojo, satu keluarga. Dari Balai RW 02, Ketintang "
    "Baru, Surabaya untuk karate Indonesia. Oss! 🙏\n\n"
    "Yuk doakan & dukung Bintang di kolom komentar 👇\n\n"
    "#dojoksatria #muhammadbintang #karateindonesia #yogyakartaopen #karatekids "
    "#senseierwinsyauridhani #karatesurabaya #karateanak #ketintang #surabaya #oss"
)


def log(msg):
    line = f"{datetime.now(WIB).strftime('%Y-%m-%d %H:%M:%S')} WIB | {msg}"
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(line + "\n")
    print(line)


def fetch_all(c):
    docs, page = [], 1
    while True:
        r = c.get_schedules(page=page, limit=100)
        d = r.get("docs") or r.get("data") or []
        docs += d
        if not d or page >= (r.get("totalPages") or 1):
            break
        page += 1
    return docs


def list_dojo_media(c):
    """Fetch ULANG dari API (jangan pakai snapshot lama)."""
    docs = fetch_all(c)
    out = []
    for x in docs:
        if (x.get("accountId") == ACC.DOJO_KSATRIA_IG
                or (x.get("account") or {}).get("id") == ACC.DOJO_KSATRIA_IG):
            for m in (x.get("medias") or []):
                u = (m.get("url") or "").split("?")[0]
                out.append({"id": x.get("_id"), "status": x.get("status"),
                            "scheduleAt": x.get("scheduleAt"),
                            "base": os.path.basename(u).lower()})
    return out


def verify_url(url):
    ok = True
    for ip in INGRESS:
        r = subprocess.run(
            ["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "25",
             "--resolve", f"mantapserver.tail3947bb.ts.net:443:{ip}", url],
            capture_output=True, text=True)
        code = r.stdout.strip()
        print(f"    ingress {ip}: {code}")
        if code != "200":
            ok = False
    return ok


def main():
    sched = "--schedule" in sys.argv
    client = ReplizClient()

    # 1. siapkan media
    dst_v = os.path.join(IMG_DIR, VIDEO_NAME)
    dst_t = os.path.join(IMG_DIR, THUMB_NAME)
    if not os.path.exists(dst_v):
        shutil.copy2(SRC_VIDEO, dst_v)
        print(f"✅ video disalin → {dst_v} ({os.path.getsize(dst_v)} bytes)")
    if not os.path.exists(dst_t):
        subprocess.run(["ffmpeg", "-v", "error", "-y", "-ss", "20", "-i", dst_v,
                        "-frames:v", "1", "-vf", "scale=1080:-2", dst_t], check=True)
        im = Image.open(dst_t)
        print(f"✅ thumbnail → {dst_t} {im.size}")
    else:
        print(f"ℹ️  thumbnail sudah ada: {dst_t}")

    # validasi ukuran/kodec
    pr = subprocess.run(["ffprobe", "-v", "error", "-show_entries",
                         "format=size,duration", "-show_entries",
                         "stream=width,height,codec_name,bit_rate",
                         "-of", "default=noprint_wrappers=1", dst_v],
                        capture_output=True, text=True)
    print("   ffprobe:", " ".join(pr.stdout.split()))
    if os.path.getsize(dst_v) > 40 * 1024 * 1024:
        print("❌ video > 40 MB — encode ulang dulu"); return 1
    Image.open(dst_t).verify()

    url_v = f"{IMG_BASE_URL}/openclaw-img/{VIDEO_NAME}"
    url_t = f"{IMG_BASE_URL}/openclaw-img/{THUMB_NAME}"
    print(f"   video : {url_v}")
    print(f"   thumb : {url_t}")
    print("🔎 verifikasi jalur INTERNET (2 ingress)...")
    if not (verify_url(url_v) and verify_url(url_t)):
        print("❌ URL belum 200 di semua ingress — STOP, jangan create"); return 1

    # 2. cek caption
    n = len(CAPTION)
    import re
    tags = re.findall(r"#(\w+)", CAPTION)
    bad = [t for t in tags if t != t.lower()]
    print(f"   caption {n} char | hashtag {len(tags)} | kapital: {bad or 'tidak ada'}")
    if bad:
        print("❌ ada hashtag huruf besar — perbaiki dulu"); return 1

    # 3. idempotensi
    existing = [m for m in list_dojo_media(client) if m["base"] == VIDEO_NAME.lower()]
    live = [m for m in existing if m["status"] in ("pending", "success", "processing", "draft")]
    if live:
        print(f"ℹ️  sudah ada jadwal (status {[m['status'] for m in live]}) → SKIP create")
        for m in live:
            print("   ", m["id"], m["scheduleAt"])
        return 0

    if not sched:
        print("🧪 DRY RUN — tambahkan --schedule untuk create")
        return 0

    # 4. create
    r = client.create_schedule(
        ACC.DOJO_KSATRIA_IG, CAPTION, SCHEDULE_AT,
        title="Reels Dojo Ksatria — Muhammad Bintang (Yogyakarta Open)",
        topic="Karate",
        type_="video",
        medias=[{"type": "video", "url": url_v, "thumbnail": url_t}],
        replies=[],
    )
    sid = r.get("scheduleId") or r.get("_id") or r.get("id")
    print(f"   create → {r}")
    if not sid:
        log(f"❌ create GAGAL: {str(r)[:200]}"); return 1
    log(f"✅ {VIDEO_NAME} (Muhammad Bintang — Yogyakarta Open, sudut biru) → {sid} | {SCHEDULE_AT} (22 Sep 2026 09:00 WIB)")

    # 5. verifikasi ULANG dari API
    hits = [m for m in list_dojo_media(client) if m["base"] == VIDEO_NAME.lower()]
    print(f"🔁 verifikasi ulang: {len(hits)} jadwal dgn media {VIDEO_NAME}")
    for m in hits:
        print("   ", m["id"], m["status"], m["scheduleAt"])
    if len(hits) != 1:
        print("⚠️  hasil verifikasi tidak pas 1 — cek API manual")
        return 1
    print("✅ SELESAI")
    return 0


if __name__ == "__main__":
    sys.exit(main())
