#!/usr/bin/env python3
"""
DNI Clinic / The Skin Code Clinic — Threads Scheduler.
Post nested thread tiap hari, minimal 2-3x sehari di jam prime time.
Konten dari artikel The Skin Code Clinic + perawatan kulit.
"""
import json, urllib.request, sys, os
from datetime import datetime, timezone, timedelta

from repliz_client import HEADERS, BASE
from threads_text_check import cek_teks_threads, ThreadsTextError
from diskusi_engine import tambahkan_diskusi  # pancingan diskusi (FIXED 7 Agt 2026)

LOG_FILE = "/home/mantapman/.hermes/profiles/atun/workspace/threads_log.txt"
STATE_FILE = "/home/mantapman/.hermes/profiles/atun/workspace/dni_threads_state.json"

WIB = timezone(timedelta(hours=7))

# Dua akun DNI Clinic
ACCOUNTS = {
    "dni_krian": {
        "id": "6a3b41ddc5ff4ce3a327542c",
        "name": "Klinik DNI Krian",
    },
    "skin_centre": {
        "id": "6a3b41e6c5ff4ce3a3275462",
        "name": "Surabaya Skin Centre",
    },
}

# === BANK KONTEN DNI CLINIC ===
# Masing-masing series = 3 post nested, ≤ 500 chars
CONTENT_SERIES = [
    # Series 1: Peran Dokter Kulit & Estetika
    [
        (
            "Kulit bermasalah tapi bingung harus ke dokter kulit atau dokter estetika? 🤔\n"
            "\n"
            "Gini bedanya:\n"
            "🔹 Dokter Kulit (Sp.KK) — urusan penyakit kulit, jerawat parah,\n"
            "   infeksi, alergi, kulit & kelamin\n"
            "🔹 Dokter Estetika — urusan kecantikan kulit, facial medis,\n"
            "   laser, filler, anti-aging\n"
            "\n"
            "Di The Skin Code Clinic, dokter kulit & estetika siap bantu\n"
            "kamu — konsultasi dulu, baru tentuin treatment! 👩‍⚕️✨\n"
            "\n"
            "#TheSkinCodeClinic #DokterKulit #DokterEstetika"
        ),
        (
            "Kapan harus ke dokter kulit? Ini tanda-tandanya 👇\n"
            "\n"
            "🔸 Jerawat meradang & bernanah — jangan dipencet sendiri!\n"
            "🔸 Gatal-gatal, ruam, atau eksim\n"
            "🔸 Tahi lalat berubah bentuk/warna\n"
            "🔸 Masalah kulit & kelamin (infeksi jamur, bakteri)\n"
            "🔸 Rambut rontok parah atau ketombe membandel\n"
            "\n"
            "Jangan tunggu parah baru periksa. Di Krian ada The Skin Code\n"
            "Clinic — dokter kulit profesional siap bantu! 🏥😊\n"
            "\n"
            "#TheSkinCodeClinic #DokterKulit #KlinikKulitKelamin"
        ),
        (
            "Dokter estetika itu dokter beneran loh — bukan terapis salon! 👩‍⚕️\n"
            "\n"
            "Banyak yang belum tau: dokter estetika adalah dokter umum\n"
            "yang ambil pendidikan tambahan di bidang estetika medis.\n"
            "\n"
            "Yang mereka tangani:\n"
            "✅ Facial medis — treatment dokter, bukan salon\n"
            "✅ Laser — prosedur medis, butuh keahlian\n"
            "✅ Suntik filler / botox — harus dokter!\n"
            "✅ Chemical peeling — disesuaikan kondisi kulit\n"
            "\n"
            "Jangan asal treatment ke salon. Percayakan kulitmu ke dokter! 💪\n"
            "\n"
            "#TheSkinCodeClinic #DokterEstetika #KlinikKecantikan"
        ),
    ],
    # Series 2: Perawatan Dermatologi
    [
        (
            "Dermatologi itu bukan cuma skincare mahal loh! 😊\n"
            "\n"
            "Dermatologi adalah ilmu kedokteran yang fokus ke:\n"
            "🔹 Kulit — jerawat, flek, infeksi jamur, bisul\n"
            "🔹 Rambut & kuku — rontok, ketombe, kuku rusak\n"
            "🔹 Kulit & kelamin — penyakit menular seksual\n"
            "🔹 Alergi kulit — eksim, biduran, dermatitis\n"
            "\n"
            "Semua ditangani dokter spesialis kulit & kelamin\n"
            "dengan diagnosis medis yang tepat.\n"
            "\n"
            "Punya keluhan kulit? Konsultasi dulu aja! 🏥✨\n"
            "\n"
            "#TheSkinCodeClinic #Dermatologi #DokterKulitKrian"
        ),
        (
            "Kenali jenis penyakit kulit yang sering muncul di Indonesia 🏝️\n"
            "\n"
            "Iklim tropis bikin kita rentan sama:\n"
            "🔸 Jamur kulit — panu, kurap, kadas (bercak putih/merah)\n"
            "🔸 Bisul & jerawat — infeksi bakteri karena keringat\n"
            "🔸 Eksim — kulit kering, gatal, merah\n"
            "🔸 Alergi — biduran karena makanan/udara\n"
            "\n"
            "Jangan dianggap remeh! Kalo dibiarin bisa makin parah.\n"
            "Di The Skin Code Clinic Krian, ada dokter yang siap diagnosa! 👩‍⚕️\n"
            "\n"
            "#TheSkinCodeClinic #PenyakitKulit #Dermatologi"
        ),
        (
            "Jerawat bandel gak sembuh-sembuh? Bisa jadi itu jerawat hormonal. 😣\n"
            "\n"
            "Ciri-cirinya:\n"
            "🔸 Muncul di area rahang & dagu\n"
            "🔸 Membesar pas sebelum/menstruasi\n"
            "🔸 Susah sembuh walau pake produk mahal\n"
            "🔸 Sering kambuh\n"
            "\n"
            "Solusinya: konsultasi ke dokter kulit. Kadang butuh obat oral\n"
            "atau treatment khusus — bukan cuma skincare doang!\n"
            "\n"
            "Jangan diagnose sendiri yaa. Ke dokter aja! 👩‍⚕️🏥\n"
            "\n"
            "#TheSkinCodeClinic #JerawatHormonal #Dermatologi"
        ),
    ],
    # Series 3: Estetika Medis
    [
        (
            "Estetika medis — perawatan kecantikan yang aman & ilmiah. ✨\n"
            "\n"
            "Bukan sembarang salon! Estetika medis dilakukan oleh dokter\n"
            'dengan:\n'
            "✅ Alat berstandar medis\n"
            "✅ Produk terdaftar BPOM\n"
            "✅ Prosedur steril\n"
            "✅ Diagnosis & analisis dokter\n"
            "\n"
            "Layanan estetika di The Skin Code Clinic:\n"
            "👉 Facial medis, chemical peeling, microneedling\n"
            "👉 Laser, filler, botox, anti-aging\n"
            "👉 Body contouring\n"
            "\n"
            "Mau cantik tapi tetap aman? Pilih estetika medis! 💅👩‍⚕️\n"
            "\n"
            "#TheSkinCodeClinic #EstetikaMedis #KlinikEstetika"
        ),
        (
            "Treatment estetika yang paling dicari di 2026 menurut data klinik 🔥\n"
            "\n"
            "1️⃣ Facial medis — paling populer, cocok buat semua\n"
            "2️⃣ Chemical peeling — bekas jerawat & flek\n"
            "3️⃣ Microneedling — kulit kencang alami\n"
            "4️⃣ Laser rejuvenation — kulit cerah merata\n"
            "5️⃣ Body contouring — bentuk tubuh ideal\n"
            "\n"
            "Yang penting: semua harus ditangani dokter!\n"
            "Jangan tertipu harga murah tanpa izin medis ya.\n"
            "\n"
            "Di The Skin Code Clinic Krian, semua aman & terpercaya. 😊\n"
            "\n"
            "#TheSkinCodeClinic #EstetikaMedis #KlinikKecantikan"
        ),
        (
            "Suntik putih — treatment yang lagi viral. Tapi aman gak sih? 🤔\n"
            "\n"
            "Faktanya:\n"
            "✅ Suntik putih AMAN kalo dilakukan dokter dengan\n"
            "   produk terdaftar BPOM & dosis tepat\n"
            "❌ Suntik putih di salon/klinik ilegal — BAHAYA!\n"
            "   Bisa rusak ginjal, alergi parah, infeksi\n"
            "\n"
            "Kuncinya: cek izin klinik, cek dokter, cek produk!\n"
            "\n"
            "Di The Skin Code Clinic, setiap prosedur estetika diawasi\n"
            "langsung dokter. Jangan ambil risiko! 💪🏥\n"
            "\n"
            "#TheSkinCodeClinic #SuntikPutih #EstetikaMedis"
        ),
    ],
    # Series 4: Dokter Kulit & Kelamin
    [
        (
            "Stigma soal klinik kulit & kelamin masih kuat di masyarakat.😔\n"
            "\n"
            "Padahal periksa ke dokter kulit & kelamin itu:\n"
            "✅ Biasa aja — sama kayak periksa dokter gigi\n"
            "✅ Penting — banyak penyakit kelamin gak bergejala awal\n"
            "✅ Rahasia — kerahasiaan pasien itu harga mati\n"
            "\n"
            "Jangan malu! Kesehatan reproduksi & seksual itu bagian\n"
            "dari kesehatan secara keseluruhan.\n"
            "\n"
            "The Skin Code Clinic — konsultasi aman, pribadi, & profesional. 💪\n"
            "\n"
            "#TheSkinCodeClinic #KulitKelamin #DokterKulit"
        ),
        (
            "Penyakit kelamin yang sering terjadi — dan cara mencegahnya! 🛡️\n"
            "\n"
            "🔸 Gonore (kencing nanah) — keluar nanah dari alat kelamin\n"
            "🔸 Sifilis (raja singa) — luka di kemaluan, bisa menyebar\n"
            "🔸 HPV (kutil kelamin) — muncul kutil, bisa cegah vaksin\n"
            "🔸 Herpes — luka lecet & melepuh\n"
            "\n"
            "Cegahnya:\n"
            "✅ Pake kondom dengan benar\n"
            "✅ Setia sama pasangan\n"
            "✅ Vaksin HPV (buat cewe & cowo)\n"
            "✅ Periksa rutin kalo aktif secara seksual\n"
            "\n"
            "#TheSkinCodeClinic #KulitKelamin #KesehatanSeksual"
        ),
        (
            "Mau periksa ke dokter kulit & kelamin tapi takut ketemu kenalan?\n"
            "Tenang, ini yang diterapin The Skin Code Clinic: 😊\n"
            "\n"
            "🔸 Privasi nomor 1 — gak ada data bocor\n"
            "🔸 Ruang periksa tertutup — cuma kamu & dokter\n"
            "🔸 Tanpa judgment — dokter profesional & empati\n"
            "🔸 Bisa konsultasi dulu lewat chat — kalo masih malu\n"
            "\n"
            "Jangan biarkan rasa malu menghalangi kesehatanmu.\n"
            "Klinik kulit & kelamin itu tempat penyembuhan, bukan penghakiman.\n"
            "\n"
            "Chat aja dulu! 💬😊\n"
            "\n"
            "#TheSkinCodeClinic #KulitKelamin #DokterKulitKrian"
        ),
    ],
    # Series 5: Kenali The Skin Code Clinic
    [
        (
            "Kenalin — The Skin Code Clinic Krian! 🏥✨\n"
            "\n"
            "Klinik kecantikan & kesehatan kulit terlengkap di Krian.\n"
            "\n"
            "Ada apa aja?\n"
            "✅ Dokter Kulit & Kelamin (Sp.KK)\n"
            "✅ Dokter Estetika medis\n"
            "✅ Pelayanan lengkap: facial medis, chemical peeling,\n"
            "   microneedling, laser, filler, botox, body contouring\n"
            "\n"
            "Lokasi strategis di Krian — gak perlu jauh-jauh\n"
            "ke Surabaya atau Sidoarjo! 🎉\n"
            "\n"
            "#TheSkinCodeClinic #KlinikKrian #DokterKulitKrian"
        ),
        (
            "Cari dokter kulit di Krian yang terpercaya? 🤔\n"
            "\n"
            "The Skin Code Clinic jawabannya!\n"
            "\n"
            "Kenapa harus kami?\n"
            "🔸 Ditangani dokter profesional & bersertifikat\n"
            "🔸 Alat medis standar — bukan alat salon\n"
            "🔸 Produk terdaftar BPOM — aman dipakai\n"
            "🔸 Konsultasi gratis — tanya apa aja dulu\n"
            "🔸 Harga transparan — gak ada biaya tersembunyi\n"
            "\n"
            "Kulit sehat adalah investasi. Pilih yang tepat! 💎\n"
            "\n"
            "Lokasi: Krian — dekat & aksesibel! 📍😊\n"
            "\n"
            "#TheSkinCodeClinic #DokterKulit #KlinikKrian"
        ),
        (
            "Yang bikin The Skin Code Clinic beda dari klinik lain: 🎯\n"
            "\n"
            "1️⃣ LENGKAP — dari dermatologi sampe estetika medis\n"
            "2️⃣ DOKTER ASLI — bukan terapis, beneran dokter!\n"
            "3️⃣ TERJANGKAU — harga bersahabat tanpa turun kualitas\n"
            "4️⃣ PRIVASI — nyaman & aman\n"
            "5️⃣ KONSULTASI GRATIS — tanya dulu, treatment kemudian\n"
            "\n"
            "Buat warga Krian & sekitarnya — gak perlu bingung lagi cari\n"
            "klinik kulit & kecantikan. Langsung chat aja! 💬✨\n"
            "\n"
            "#TheSkinCodeClinic #KlinikKecantikan #Krian"
        ),
    ],
]


def enforce_max_chars(text, maxlen=500):
    """VALIDASI KETAT (FIXED 5 Agustus 2026): teks harus <= maxlen & semua link nyala.
    Kalau tidak lolos -> return None (JANGAN dipotong, JANGAN dikirim)."""
    try:
        return cek_teks_threads(text, label="Caption Threads", maxlen=maxlen)
    except ThreadsTextError as e:
        print(f"  SKIP: {e}")
        return None



def load_state():
    if not os.path.exists(STATE_FILE):
        return {"last_series": -1}
    with open(STATE_FILE) as f:
        return json.load(f)


def save_state(state):
    with open(STATE_FILE, "w") as f:
        json.dump(state, f)


def log_result(account_name, series_idx, date_str, ids):
    entry = f"DNI {account_name} | Series {series_idx+1} | {date_str} | IDs: {', '.join(ids)}\n"
    with open(LOG_FILE, "a") as f:
        f.write(entry)
    print(f"  📝 Logged")


def schedule(text, scheduleAt_iso, parentId=None, account_id=None):
    text = enforce_max_chars(text)
    if text is None:
        return None
    payload = {
        'title': '', 'description': text, 'topic': 'Kecantikan', 'type': 'text',
        'medias': [], 'meta': {'title': '', 'description': '', 'url': ''},
        'additionalInfo': {
            'isAiGenerated': False, 'isDraft': False,
            'collaborators': [], 'mentions': [],
            'music': {'id': '', 'artist': '', 'name': '', 'thumbnail': ''},
            'products': [], 'tags': []
        },
        'replies': [], 'accountId': account_id, 'scheduleAt': scheduleAt_iso,
    }
    if parentId:
        payload['replies'] = [parentId]

    body = json.dumps(payload).encode()
    req = urllib.request.Request(f'{BASE}/public/schedule', data=body, headers=HEADERS, method='POST')
    try:
        with urllib.request.urlopen(req) as r:
            result = json.loads(r.read())
            sid = result.get('scheduleId', '?')
            print(f'  ✅ {sid}')
            return sid
    except urllib.error.HTTPError as e:
        err = e.read().decode()
        print(f'  ❌ ERROR {e.code}: {err[:200]}')
        return None


def post_for_account(account_key, account_info, series_idx, today_date, slots):
    """Post 3 nested threads untuk satu akun"""
    series = CONTENT_SERIES[series_idx]
    name = account_info["name"]
    aid = account_info["id"]

    print(f'\n📋 {name} — Series {series_idx+1}')
    print('=' * 40)

    ids = []
    prev = None
    for i, (post, slot) in enumerate(zip(series, slots)):
        # Pancingan diskusi di post utama (i==0)
        if i == 0:
            post = tambahkan_diskusi(post, "threads", "klinik")
        print(f'  Post {i+1} ({slot[11:16]} WIB):')
        print(f'    "{post[:50]}..."')
        sid = schedule(post, slot, parentId=prev, account_id=aid)
        if sid:
            ids.append(sid)
            prev = sid
        else:
            print(f'    ❌ Gagal di post {i+1}')
            break
        print()

    if len(ids) == 3:
        print(f'  ✅ {name} SUCCESS!')
        for i, sid in enumerate(ids):
            print(f'    {slots[i][11:16]} WIB → ID: {sid}')
        log_result(name, series_idx, str(today_date), ids)
        return True
    return False


def main():
    print('🌸 DNI Clinic / The Skin Code Clinic — Daily Scheduler')
    print('=' * 50)

    state = load_state()
    last_series = state.get("last_series", -1)
    next_series = (last_series + 1) % len(CONTENT_SERIES)

    today = datetime.now(WIB).date()
    slots = [
        f'{today.isoformat()}T17:00:00+07:00',
        f'{today.isoformat()}T20:00:00+07:00',
        f'{today.isoformat()}T23:00:00+07:00',
    ]

    print(f'\n📅 {today.isoformat()}')
    print(f'📋 Series {next_series + 1} of {len(CONTENT_SERIES)}')
    print()

    success_all = True

    # Post untuk Klinik DNI Krian
    if not post_for_account("dni_krian", ACCOUNTS["dni_krian"], next_series, today, slots):
        success_all = False

    # Post untuk Surabaya Skin Centre
    if not post_for_account("skin_centre", ACCOUNTS["skin_centre"], next_series, today, slots):
        success_all = False

    if success_all:
        state["last_series"] = next_series
        save_state(state)
        print(f'\n{"="*50}')
        print('✅ SEMUA SELESAI — 2 akun × 3 post = 6 post hari ini!')
        print(f'{">"*50}')


if __name__ == "__main__":
    main()

