#!/usr/bin/env python3
"""Pasang ulang sisa 51 jadwal gagal 19-23 Okt (semua harus tayang).

Aturan penempatan (dijaga skrip ini):
- Lane asli dipertahankan: IG SS carousel 08:30 / story 08:40 / reel 11:00,
  TSC carousel 17:00 empat kanal, TS Law carousel 09:00 + mitos 11:00/19:30,
  TS Law & TSC story 12:00, SS FB story 07:00/14:00/20:00, Uky album 09:00.
- Story lama yang bentrok dengan story baru harian digeser ke 12:10 (TSC) supaya tidak
  menimpa jam yang sama.
- Akun Threads: maksimal 1 jadwal BARU per hari (aturan penjaga jaga_1post_threads).
- URL media dicek dulu (Range 0-2047, harus 200/206) sebelum dibuat.

Pakai: python3 pasang_ulang_sisa_okt.py [--run]
"""
import json
import ssl
import sys
import urllib.request
from datetime import datetime, timedelta, timezone

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

WIB = timezone(timedelta(hours=7))
RUN = "--run" in sys.argv

# id jadwal gagal → (tanggal, jam) WIB
PETA = {
    # IG StudioSoft (Kreasi Studiosoft): set 21 Okt lalu set 22 Okt
    "6ac102da1733078385cca54f": ("2026-11-04", "08:30"),  # carousel agencypartner
    "6ac102de07008e0e919e831a": ("2026-11-04", "08:40"),  # story mirror agencypartner
    "6abdf7d107008e0e912267e5": ("2026-11-04", "11:00"),  # reel putih ss_opt2_20
    "6ac102e61733078385cca81d": ("2026-11-05", "08:30"),  # carousel konsultanai
    "6ac102ec1733078385cca872": ("2026-11-05", "08:40"),  # story mirror konsultanai
    "6abdf7ee17330783851e1c70": ("2026-11-05", "11:00"),  # reel biru ss_opt2_05

    # TSC story harian 20-23 Okt (digeser 12:10, story baru tetap 12:00)
    "6ad1c96ea38329b44d1267f8": ("2026-11-04", "12:10"),
    "6ad1c96e0f680841e48ce52d": ("2026-11-05", "12:10"),
    "6ad1c96e0f680841e48ce541": ("2026-11-06", "12:10"),
    "6ad1c96e0f680841e48ce556": ("2026-11-07", "12:10"),

    # TSC carousel 17:00 empat kanal
    "6acf51973b7404ace3460b7c": ("2026-11-04", "17:00"),  # Facial di Sidoarjo, IG
    "6acf51a276bea2decc444dde": ("2026-11-04", "17:00"),  # Facial di Sidoarjo, Threads
    "6acf51ad3b7404ace34613ba": ("2026-11-04", "17:00"),  # Facial di Sidoarjo, FB
    "6acf51b776bea2decc44554f": ("2026-11-04", "17:00"),  # Facial di Sidoarjo, LinkedIn
    "6acf51c23b7404ace3461c8d": ("2026-11-05", "17:00"),  # Memilih klinik kecantikan, IG
    "6acf51cc3b7404ace34621a1": ("2026-11-05", "17:00"),  # Memilih klinik, Threads
    "6acf51d776bea2decc445def": ("2026-11-05", "17:00"),  # Memilih klinik, FB
    "6acf51e276bea2decc4461cd": ("2026-11-05", "17:00"),  # Memilih klinik, LinkedIn
    "6acf51ed76bea2decc446393": ("2026-11-06", "17:00"),  # Hapus tahi lalat, IG
    "6acf51f93b7404ace3462d06": ("2026-11-06", "17:00"),  # Hapus tahi lalat, Threads
    "6acf520476bea2decc446a9f": ("2026-11-06", "17:00"),  # Hapus tahi lalat, FB
    "6acf520f76bea2decc446d7f": ("2026-11-06", "17:00"),  # Hapus tahi lalat, LinkedIn

    # TS Law story 13, 17, 18, 19, 20 (IG + FB)
    "6ac108e107008e0e919fa366": ("2026-11-04", "12:00"),  # story 17, IG
    "6ac108e81733078385ce31d2": ("2026-11-04", "12:00"),  # story 17, FB
    "6ac108ec1733078385ce3247": ("2026-11-05", "12:00"),  # story 18, IG
    "6ac108f407008e0e919fa6f9": ("2026-11-05", "12:00"),  # story 18, FB
    "6ac108f91733078385ce3584": ("2026-11-06", "12:00"),  # story 19, IG
    "6ac108ff07008e0e919fa9f8": ("2026-11-06", "12:00"),  # story 19, FB
    "6ac1090907008e0e919faade": ("2026-11-07", "12:00"),  # story 20, IG
    "6ac1090e1733078385ce38de": ("2026-11-07", "12:00"),  # story 20, FB
    "6ad4b78b83496b501fbf05fc": ("2026-11-08", "12:00"),  # story 13, IG
    "6ad4b7f383496b501fbf2744": ("2026-11-08", "12:00"),  # story 13, FB

    # TS Law carousel 10 anggapan hukum (Threads + IG)
    "6ad4b7e3601f5a03611b468b": ("2026-11-04", "09:00"),
    "6ad4b7e4601f5a03611b46e3": ("2026-11-04", "09:00"),

    # TS Law Mitos atau Fakta: hak setelah mengundurkan diri
    "6ab10f3802078a414ace92df": ("2026-11-05", "09:00"),  # Threads
    "6ab10b7902078a414acd4bba": ("2026-11-05", "11:00"),  # IG
    "6ab10f383032e3a79cf453bf": ("2026-11-05", "19:30"),  # FB

    # Uky (akun Threads: 1 jadwal baru per hari)
    "6ac48acdefef33b9088a2f2b": ("2026-11-04", "09:00"),  # album 7 Hal Bikin Konten Rapi
    "6ab565a90723d7da88c214ab": ("2026-11-05", "09:30"),  # Data vs Intuisi
    "6ac48adb8bb99cea57aee07c": ("2026-11-06", "09:00"),  # album 8 Pertanyaan Sebelum Bayar Jasa
    "6ab6b70574292ea3cb7cfc8f": ("2026-11-07", "09:30"),  # Digital vs Tradisional

    # StudioSoft album
    "6ad6695801fb9d1f45a367ab": ("2026-11-04", "09:00"),  # Jasa Digital Marketing RS

    # Story FB StudioSoft (07:00 / 14:00 / 20:00)
    "6ad4007283496b501f7e1c24": ("2026-11-04", "07:00"),  # hc37
    "6ad40072601f5a0361e7a653": ("2026-11-04", "14:00"),  # hc38
    "6ad40072601f5a0361e7a658": ("2026-11-04", "20:00"),  # hc39
    "6ad551db601f5a036141ac48": ("2026-11-05", "07:00"),  # hc40
    "6ad551db601f5a036141ac4d": ("2026-11-05", "14:00"),  # hc41
    "6ad551db601f5a036141ac52": ("2026-11-05", "20:00"),  # hc42
    "6ad6a35a36250c04dcfd4fb2": ("2026-11-06", "07:00"),  # hc43
    "6ad2af11601f5a03618efdfb": ("2026-11-06", "14:00"),  # hc49 video
    "6ad2af1183496b501f0cfeb1": ("2026-11-06", "20:00"),  # hc50 video
}

KOSONGKAN = {"_id", "id", "createdAt", "updatedAt", "__v", "status", "postId", "account", "userId"}
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE


def url_hidup(url):
    try:
        req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0", "Range": "bytes=0-2047"})
        with urllib.request.urlopen(req, timeout=25, context=ctx) as r:
            return r.status in (200, 206)
    except Exception:
        return False


c = get_client()
hasil, gagal = [], []
for sid, (tgl, jam) in PETA.items():
    lama = c.get_schedule(sid) or {}
    acc = lama.get("account") or {}
    if not lama.get("accountId"):
        gagal.append((sid, "tidak terbaca"))
        print(f"  ❌ {sid} tidak terbaca")
        continue
    medias = [dict(m) for m in (lama.get("medias") or [])]
    for m in medias:
        if not m.get("type"):
            m["type"] = "video" if str(m.get("url", "")).lower().endswith((".mp4", ".mov")) else "image"
    mati = [m["url"] for m in medias if not url_hidup(m.get("url", ""))]
    if mati:
        gagal.append((sid, f"media mati: {mati[0]}"))
        print(f"  ❌ {sid} media tidak bisa diunduh: {mati[0]}")
        continue
    dt_wib = datetime.strptime(f"{tgl} {jam}", "%Y-%m-%d %H:%M").replace(tzinfo=WIB)
    at = (dt_wib - timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%S.000Z")
    print(f"  {dt_wib:%d %b %H:%M} WIB | {acc.get('name')} [{acc.get('type')}] | {str(lama.get('title'))[:50]} | {len(medias)} media")
    if not RUN:
        continue
    baru = c.create_schedule(
        lama["accountId"], lama.get("description") or "", at,
        title=lama.get("title") or "", topic=lama.get("topic") or "",
        type_=lama.get("type") or "text", medias=medias,
        replies=lama.get("replies") or [], meta=lama.get("meta"),
        additional_info=lama.get("additionalInfo"),
    )
    sid_baru = (baru or {}).get("scheduleId") or (baru or {}).get("_id")
    if sid_baru:
        hasil.append({"baru": sid_baru, "lama": sid, "waktu_wib": dt_wib.strftime("%Y-%m-%d %H:%M"),
                      "akun": f"{acc.get('name')} [{acc.get('type')}]"})
    else:
        gagal.append((sid, str(baru)[:120]))
        print(f"     ❌ {str(baru)[:120]}")

print(f"\ntotal: {len(PETA)} | dibuat: {len(hasil)} | gagal: {len(gagal)}")
if RUN and hasil:
    json.dump(hasil, open("catatan/pasang_ulang_sisa_okt.json", "w"), indent=1, ensure_ascii=False)
    print("catatan: catatan/pasang_ulang_sisa_okt.json")
