#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""FB The Skin Code Clinic — penuhi tugas mingguan Facebook (27 Sep - 3 Okt 2026).

Perintah Bos 29 Sep 2026 (screenshot: 6 postingan, 6 reel, 5 balas komentar,
6 postingan berfoto, tambah 300 tayangan).

Isi: 6 REEL (type=reel) + 3 POST FOTO (type=image) = 9 item.
  - 2 reel dari video lama TSC (`tsc_video2.mp4`, `tsc_glowxigen_video.mp4`) yang
    di-upscale ke 1080x1920 (aslinya 480x848, di bawah minimum FB 540x960).
  - 4 reel rakit dari slide carousel lama (flek, bau kaki, keringat, tahi lalat) —
    pola "rakit seperti TS Law", bukan bikin desain baru.
  - 3 post foto pakai desain lama `tsc_design_01/05/09` yang belum pernah tayang di FB.
Balasan komentar FB tidak bisa lewat API Repliz. `replies=[]` WAJIB untuk Facebook.

Pakai:
  python3 tsc_fb_mingguan_20260929.py            # daftar + validasi caption
  python3 tsc_fb_mingguan_20260929.py --go       # buat jadwal + verifikasi
"""
import re
import sys
import time
from datetime import datetime, timezone, timedelta

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

FB = "6a3b41ddc5ff4ce3a327542c"          # The Skin Code Clinic (Facebook)
BASE = "https://mantapserver.tail3947bb.ts.net/openclaw-img/"
WIB = timezone(timedelta(hours=7))
TOPIC = "Mingguan FB The Skin Code"
WA = "📲 Konsultasi & booking via WhatsApp: 0851-1744-4417"

CAP_GLOW = f"""Yuk rawat kulitmu, dan biarkan hasilnya bicara. ✨

Penanganan di The Skin Code Clinic selalu dimulai dari diagnosis dokter spesialis, bukan asumsi. Konsultasi dulu, baru tindakan, supaya perawatan yang kamu jalani benar-benar sesuai kondisi kulitmu.

Tonton videonya sampai habis ya.

Perawatan kulit apa yang paling ingin kamu coba? Tulis di komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #dokterkulit #klinikkulit #perawatankulit #kulitsehat #skincare #dermatologi #estetikamedis"""

CAP_TREATMENT = f"""Setiap tindakan di klinik kami dikerjakan oleh dokter spesialis, dengan alat dan bahan yang sesuai standar. 🧑‍⚕️

Kulit tiap orang berbeda, jadi penanganannya juga tidak bisa disamakan. Langkah pertama selalu konsultasi: dokter menilai kondisi kulitmu, lalu menyusun perawatan yang tepat.

Simpan videonya, lalu tanyakan kebutuhan kulitmu ke dokter kami.

Ada pertanyaan soal alur konsultasi atau perawatan di klinik kami? Tulis di komentar. 👇

{WA}

#theskincodeclinic #dokterkulit #klinikkulit #perawatankulit #kulitsehat #skincaretreatment #dermatologi #estetikamedis"""

CAP_FLEK = f"""Flek di wajah bikin nggak percaya diri? Mencegahnya bisa dimulai dari kebiasaan sederhana! ✨

3 KEBIASAAN MENCEGAH FLEK:
1️⃣ Gunakan sunscreen setiap pagi, termasuk saat di dalam ruangan
2️⃣ Reapply saat banyak beraktivitas di luar ruangan
3️⃣ Hindari memencet jerawat & iritasi berulang

RAWAT KULIT DENGAN LEMBUT:
• Pilih skincare sesuai kebutuhan kulit
• Jaga kelembapan kulit setiap hari
• Konsultasikan flek yang menetap dengan ahlinya

Kulit sehat dimulai dari kebiasaan kecil yang konsisten.

Punya pengalaman dengan flek? Cerita di komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #flek #hiperpigmentasi #dokterkulit #klinikkulit #perawatankulit #kulitsehat #sunscreen"""

CAP_BAUKAKI = f"""Bau kaki bikin nggak pede, apalagi saat harus melepas sepatu? Ternyata solusinya sederhana! 🦶✨

3 KEBIASAAN YANG WAJIB DILAKUKAN:
1️⃣ Cuci kaki setiap hari dan keringkan sampai sela jari
2️⃣ Ganti kaus kaki secara rutin
3️⃣ Pilih alas kaki yang memiliki sirkulasi udara baik

Kaki bersih dan kering membantu menjaga kenyamanan sepanjang hari. Mulai dari kebiasaan sederhana setiap hari.

JANGAN DIABAIKAN: kalau bau kaki menetap atau disertai gatal dan perubahan kulit, konsultasikan dengan dokter kulit. Jangan dipaksa dengan produk yang belum tentu cocok.

Kamu punya tips lain mengatasi bau kaki? Cerita di komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #baukaki #kesehatankulit #dokterkulit #klinikkulit #tipskesehatan #perawatankulit #kulitsehat #dermatologi #estetikamedis"""

CAP_KERINGAT = f"""Bau keringat yang muncul berulang meski sudah mandi dan pakai deodoran? Bukan sekadar masalah kosmetik, bisa jadi tanda kulit butuh penanganan yang tepat. 🌿

MULAI DARI KEBIASAAN HARIAN:
1️⃣ Bersihkan area lipatan tubuh secara teratur
2️⃣ Keringkan kulit setelah mandi dan setelah beraktivitas
3️⃣ Pilih produk perawatan yang sesuai kondisi kulit

Kalau bau keringat terus berulang atau disertai keluhan kulit lain, jangan diabaikan. Konsultasikan kondisi kulit Anda dengan dr. Avril Novianto, Sp.D.V.E. di The Skin Code Clinic untuk penanganan yang sesuai.

Pernah ngalamin bau keringat yang susah hilang? Cerita di komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #baukeringat #kesehatankulit #dokterkulit #klinikkulit #perawatankulit #kulitsehat #tipskesehatan #dermatologi #estetikamedis"""

CAP_TAHILALAT = f"""Tahi lalat sering dianggap bagian alami kulit. Tapi kalau letaknya mengganggu penampilan atau terasa tidak nyaman, menghilangkannya tidak boleh asal. 🔍

KENALI PILIHAN PERAWATAN YANG TEPAT:
• Periksa terlebih dahulu untuk menentukan penanganan yang sesuai
• Hindari memotong, mengikat, atau memakai bahan rumahan
• Konsultasikan dengan tenaga profesional, langkah pertama yang benar

Setiap tahi lalat perlu dinilai secara tepat oleh tenaga profesional. Ada yang aman dibiarkan, ada juga yang perlu diwaspadai, misalnya bila berubah bentuk, warna, atau ukuran, terasa gatal, atau mudah berdarah.

Simpan postingan ini, lalu konsultasikan pilihan perawatannya ke klinik.

Punya pengalaman atau pertanyaan soal tahi lalat? Tulis di kolom komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #tahilalat #dokterkulit #klinikkulit #perawatankulit #kulitsehat #kesehatankulit #estetikamedis"""

CAP_D01 = f"""Kulit sehat itu bukan tentang produk paling mahal, tapi tentang perawatan yang paling tepat untuk kondisi kulitmu.

Di The Skin Code Clinic, setiap penanganan dimulai dari diagnosis dokter, bukan asumsi.

Yuk konsultasikan masalah kulitmu ke dokter spesialis kami, penanganan yang tepat dimulai dari pemeriksaan yang benar.

Keluhan kulit apa yang sedang kamu alami sekarang? Tulis di komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #dokterkulit #klinikkulit #perawatankulit #kulitsehat #skinclinic #dermatology #estetikamedis"""

CAP_D05 = f"""Konsultasi yang nyaman sering jadi awal dari hasil yang tepat.

Kami percaya setiap pasien berhak didengar, dipahami, dan mendapat penanganan yang sesuai. Datang dengan keluhan, pulang dengan kejelasan, itu yang kami usahakan di setiap konsultasi.

Menurut kamu, hal apa yang paling penting dari sebuah konsultasi di klinik kulit? Tulis di komentar. 👇

{WA}

#theskincodeclinic #konsultasikulit #dokterkulit #klinikkulit #skinhealth #perawatankulit #kulitsehat"""

CAP_D09 = f"""Kulit sehat adalah cermin dari perawatan yang konsisten dan tepat. Tidak perlu rumit, yang penting sesuai dengan kondisi kulitmu.

Tim dokter kami siap membantu menemukan perawatan terbaik untukmu.

Rutinitas skincare-mu sekarang sudah sesuaikah dengan jenis kulitmu? Cerita di komentar, yuk diskusi! 👇

{WA}

#theskincodeclinic #klinikkulit #perawatankulit #kulitsehat #skincareroutine #dokterkulit #estetikamedis"""

# (tanggal, jam, menit, jenis, berkas media, judul, caption)
PLAN = [
    ("2026-09-29", 11, 0, "reel", "tsc_reel_glow_01.mp4",
     "TSC — Yuk Rawat Kulitmu, dan Glow", CAP_GLOW),
    ("2026-09-29", 19, 30, "image", "tsc_design_01.jpg",
     "TSC — Perawatan Tepat Dimulai dari Diagnosis", CAP_D01),
    ("2026-09-30", 11, 0, "reel", "tsc_reel_treatment_01.mp4",
     "TSC — Penanganan oleh Dokter Spesialis", CAP_TREATMENT),
    ("2026-10-01", 11, 0, "reel", "tsc_reel_flek_01.mp4",
     "TSC — 3 Kebiasaan Mencegah Flek", CAP_FLEK),
    ("2026-10-01", 19, 30, "image", "tsc_design_05.jpg",
     "TSC — Konsultasi yang Nyaman", CAP_D05),
    ("2026-10-01", 20, 0, "reel", "tsc_reel_baukaki_01.mp4",
     "TSC — Solusi Bau Kaki", CAP_BAUKAKI),
    ("2026-10-02", 11, 0, "reel", "tsc_reel_keringat_01.mp4",
     "TSC — Bau Keringat Berulang", CAP_KERINGAT),
    ("2026-10-03", 11, 0, "reel", "tsc_reel_tahilalat_01.mp4",
     "TSC — Menghilangkan Tahi Lalat dengan Aman", CAP_TAHILALAT),
    ("2026-10-03", 19, 30, "image", "tsc_design_09.jpg",
     "TSC — Perawatan yang Konsisten", CAP_D09),
]


def to_utc(tgl, jam, menit):
    dt = datetime.fromisoformat(f"{tgl}T{jam:02d}:{menit:02d}:00+07:00")
    return dt.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z")


def validasi():
    masalah = []
    for tgl, jam, menit, jenis, f, judul, cap in PLAN:
        if re.search(r"@\w+", cap):
            masalah.append(f"{f}: ada mention")
        besar = [t for t in re.findall(r"#([^\s#]+)", cap) if t != t.lower()]
        if besar:
            masalah.append(f"{f}: hashtag huruf besar {besar}")
        if "komentar" not in cap.lower():
            masalah.append(f"{f}: tanpa ajakan komentar")
        if "0851-1744-4417" not in cap:
            masalah.append(f"{f}: tanpa nomor WhatsApp")
        if re.search(r"[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]", cap):
            masalah.append(f"{f}: ada karakter CJK")
    return masalah


def semua_jadwal(c):
    docs, page = [], 1
    while page <= 200:
        r = None
        for a in range(6):
            try:
                r = c.get_schedules(page=page, limit=100)
                break
            except Exception:
                time.sleep(5 + 3 * a)
        if r is None:
            break
        b = r.get("docs") or []
        if not b:
            break
        docs += b
        if len(b) < 100:
            break
        page += 1
    return docs


def index_media(docs, akun=FB):
    idx = {}
    for d in docs:
        if d.get("accountId") != akun:
            continue
        if d.get("status") not in ("pending", "success", "processing", "draft"):
            continue
        for m in (d.get("medias") or []):
            fn = (m.get("url") or "").split("/")[-1].lower()
            if fn:
                idx.setdefault(fn, (d.get("_id"), d.get("status")))
    return idx


def main():
    go = "--go" in sys.argv
    masalah = validasi()
    for m in masalah:
        print("❗", m)
    print(f"item: {len(PLAN)} | masalah caption: {len(masalah)}")
    for tgl, jam, menit, jenis, f, judul, cap in PLAN:
        print(f"  {tgl} {jam:02d}:{menit:02d} WIB | {jenis:5} | {f:28} | {len(cap):4} char | {judul}")
    if masalah:
        print("\nBATAL: perbaiki caption dulu.")
        return
    if not go:
        print("\n(dry-run — tambahkan --go untuk membuat jadwal)")
        return

    c = get_client()
    idx = index_media(semua_jadwal(c))
    dibuat = []
    for tgl, jam, menit, jenis, f, judul, cap in PLAN:
        if f.lower() in idx:
            print(f"⏭️  {f}: sudah ada {idx[f.lower()]} — SKIP")
            continue
        at = to_utc(tgl, jam, menit)
        sid = None
        for attempt in range(1, 5):
            try:
                res = c.create_schedule(FB, cap, at, title=judul, topic=TOPIC,
                                        type_=jenis,
                                        medias=[{"url": BASE + f,
                                                 "type": "video" if jenis == "reel" else "image",
                                                 "alt": f}],
                                        replies=[])
                sid = res.get("scheduleId") or res.get("_id") or res.get("id")
                break
            except Exception as e:
                print(f"    ⚠️ percobaan {attempt} gagal: {str(e)[:120]}")
                time.sleep(10)
        print(f"{'✅' if sid else '❌'} {jenis:5} {f:28} {tgl} {jam:02d}:{menit:02d} id={sid}")
        if sid:
            dibuat.append((sid, f))

    print("\n=== VERIFIKASI ===")
    for sid, f in dibuat:
        d = c.get_schedule(sid)
        d = d.get("data") or d
        if isinstance(d, dict) and "docs" in d:
            d = d["docs"][0]
        ok = (d.get("status") == "pending"
              and (d.get("medias") or [{}])[0].get("url", "").endswith(f))
        print(f"  {'✅' if ok else '⚠️'} {f:28} {sid} status={d.get('status')} "
              f"type={d.get('type')} at={d.get('scheduleAt')} replies={d.get('replies')}")


if __name__ == "__main__":
    main()
