#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Dojo Ksatria IG — video Saladien Keane Handoko di Kejuaraan Karate International
Yogyakarta Open Tournament (SUDUT MERAH).

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

⚠️ STATUS 15 Sep 2026: FILE VIDEO BELUM ADA — kiriman Telegram 25,4 MB ditolak
(limit 20 MB). Bos diminta kirim ulang versi lebih kecil ATAU link MEGA.

Usage:
    python3 schedule_dojo_saladien_yogyakarta.py --mega "<url>"        # unduh dari MEGA
    python3 schedule_dojo_saladien_yogyakarta.py --src /path/video.mp4
    (dry-run default; tambahkan --schedule untuk benar-benar create)

Idempoten: kalau media dgn basename sama sudah ada (pending/success/processing/draft)
→ SKIP create. Status error TIDAK dihitung "sudah ada".
"""
import os, sys, re, shutil, subprocess
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")
SKILL_SCRIPTS = "/home/mantapman/.hermes/profiles/atun/skills/social-media/atun-social-automation/scripts"

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

CAPTION = (
    "Saladien Keane Handoko, anggota Dojo Ksatria, berlaga di sudut merah pada "
    "Kejuaraan Karate International Yogyakarta Open Tournament! 🥋🔥\n\n"
    "Berani tampil di tatami internasional itu bukan hal kecil — itu buah dari latihan "
    "panjang di dojo. Pengalaman seperti inilah yang menempa mental ksatria muda. 💪\n\n"
    "Terus melangkah, Saladien! Satu dojo, satu keluarga. Dari Balai RW 02, Ketintang "
    "Baru, Surabaya untuk karate Indonesia. Oss! 🙏\n\n"
    "Yuk doakan & dukung Saladien di kolom komentar 👇\n\n"
    "#dojoksatria #saladienkeanehandoko #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 tiap kali dipanggil (jangan pakai snapshot lama)."""
    out = []
    for x in fetch_all(c):
        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():
    args = sys.argv
    sched = "--schedule" in args
    client = ReplizClient()

    # --- sumber video ---
    if "--mega" in args:
        mega_url = args[args.index("--mega") + 1]
        print("⬇️  unduh dari MEGA...")
        subprocess.run(["python3", os.path.join(SKILL_SCRIPTS, "download_mega.py"),
                        mega_url, BASENAME, "/tmp/mega_dojo"], check=False)
        cand = [os.path.join("/tmp/mega_dojo", f) for f in os.listdir("/tmp/mega_dojo")]
        cand = [p for p in cand if p.lower().endswith((".mp4", ".mov", ".mkv", ".webm"))]
        if not cand:
            print("❌ tidak ada file video hasil unduhan MEGA"); return 1
        src = max(cand, key=os.path.getsize)
    elif "--src" in args:
        src = args[args.index("--src") + 1]
    else:
        src = DEFAULT_SRC

    if not os.path.exists(src):
        print(f"❌ FILE VIDEO BELUM ADA: {src}")
        print("   Kiriman Telegram 25,4 MB ditolak (limit 20 MB). Minta Bos kirim ulang "
              "versi lebih kecil atau pakai --mega \"<link>\".")
        return 1
    print(f"   sumber: {src} ({os.path.getsize(src)} bytes)")

    # --- 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, dst_v)
        print(f"✅ video disalin → {dst_v}")
    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)
        print(f"✅ thumbnail → {dst_t} {Image.open(dst_t).size}")
    Image.open(dst_t).verify()

    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 (lihat pitfall VIDEO BESAR/HEVC)"); return 1

    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}\n   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"); return 1

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

    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 ({[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

    r = client.create_schedule(
        ACC.DOJO_KSATRIA_IG, CAPTION, SCHEDULE_AT,
        title="Reels Dojo Ksatria — Saladien Keane Handoko (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 (Saladien): {str(r)[:200]}"); return 1
    log(f"✅ {VIDEO_NAME} (Saladien Keane Handoko — Yogyakarta Open, sudut merah) → {sid} | {SCHEDULE_AT} (23 Sep 2026 09:00 WIB)")

    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"])
    return 0 if len(hits) == 1 else 1


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