#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Templek musik instrumental ke video reel IG StudioSoft (dibakar ke MP4 sebelum upload).

Kenapa dibakar: Repliz/IG Graph API tidak punya pilihan musik — yang tayang hanya audio
di dalam berkas video. Jadi musik harus jadi bagian MP4-nya.

Pakai:
  /usr/bin/python3 ss_reel_musik.py --uji ss_reel_biru_07.mp4                       # tes 1 video
  /usr/bin/python3 ss_reel_musik.py --semua --bed musik/kalem_24s.wav --go          # semua reel
Opsi: --volume 0.32 (kekuatan musik), --out-dir (folder hasil), --suffix _musik
"""
import argparse
import os
import subprocess
import sys

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
IMG = f"{WS}/openclaw-img"


def durasi(path):
    p = subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration",
                        "-of", "csv=p=0", path], capture_output=True, text=True)
    return float((p.stdout or "0").strip() or 0)


def campur(video, bed, out, volume=0.32, fade_in=0.6, fade_out=1.4, bitrate="192k"):
    d = durasi(video)
    st_out = max(0.1, d - fade_out)
    flt = (f"[1:a]volume={volume},afade=t=in:st=0:d={fade_in},"
           f"afade=t=out:st={st_out:.2f}:d={fade_out}[a]")
    cmd = ["ffmpeg", "-y", "-v", "error", "-i", video,
           "-stream_loop", "-1", "-i", bed, "-filter_complex", flt,
           "-map", "0:v", "-map", "[a]", "-c:v", "copy", "-c:a", "aac",
           "-b:a", bitrate, "-ar", "44100", "-shortest", "-movflags", "+faststart", out]
    subprocess.run(cmd, check=True)
    return out


def cek_audio(path):
    p = subprocess.run(["ffprobe", "-v", "error", "-select_streams", "a",
                        "-show_entries", "stream=codec_name,bit_rate,channels,duration",
                        "-of", "csv=p=0", path], capture_output=True, text=True)
    return (p.stdout or "").strip().splitlines()


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--uji", help="nama berkas video di openclaw-img (tes satu video)")
    ap.add_argument("--semua", action="store_true", help="semua ss_reel_*.mp4")
    ap.add_argument("--bed", required=True, help="berkas WAV bed musik")
    ap.add_argument("--volume", type=float, default=0.32)
    ap.add_argument("--out-dir", default=None)
    ap.add_argument("--suffix", default="_musik")
    ap.add_argument("--go", action="store_true", help="tanpa ini = hanya rencana")
    a = ap.parse_args()

    bed = a.bed if os.path.isabs(a.bed) else f"{WS}/{a.bed}"
    if not os.path.exists(bed):
        sys.exit(f"❌ bed tidak ada: {bed}")

    if a.uji:
        berkas = [os.path.join(IMG, a.uji) if not os.path.isabs(a.uji) else a.uji]
    elif a.semua:
        berkas = sorted(os.path.join(IMG, f) for f in os.listdir(IMG)
                        if f.startswith("ss_reel_") and f.endswith(".mp4")
                        and a.suffix not in f)
    else:
        sys.exit("pilih --uji <berkas> atau --semua")

    out_dir = a.out_dir or IMG
    os.makedirs(out_dir, exist_ok=True)
    print(f"musik: {os.path.basename(bed)} · volume {a.volume} · {len(berkas)} video")
    if not a.go:
        for v in berkas:
            print("  rencana:", os.path.basename(v), "->",
                  os.path.basename(v).replace(".mp4", f"{a.suffix}.mp4"))
        return

    ok = gagal = 0
    for v in berkas:
        if not os.path.exists(v):
            print("  ❌ tidak ada:", os.path.basename(v))
            gagal += 1
            continue
        out = os.path.join(out_dir, os.path.basename(v).replace(".mp4", f"{a.suffix}.mp4"))
        try:
            campur(v, bed, out, volume=a.volume)
        except subprocess.CalledProcessError as e:
            print("  ❌ gagal campur:", os.path.basename(v), e)
            gagal += 1
            continue
        info = cek_audio(out)
        if not info or "aac" not in info[0]:
            print("  ⚠️ audio tidak terbaca:", os.path.basename(out), info)
            gagal += 1
            continue
        ok += 1
        print(f"  ✔ {os.path.basename(out)} · video {durasi(out):.1f} dtk · audio {info[0]}")
    print(f"selesai: {ok} ok, {gagal} gagal")


if __name__ == "__main__":
    main()
