#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Promosi 5 artikel SEO "dokter kulit krian" — The Skin Code Clinic
Platform: Threads (@dniclinic_krian), Facebook (Klinik DNI Krian), LinkedIn (TSC)
Semua caption UNIK (anti-duplikasi), validasi ketat Threads (<=500, link nyala, 1 paragraf sebelum link).
Jadwalkan ke slot kosong berikutnya sesuai aturan slot posting.
"""
import sys, os, time
from datetime import datetime, timezone, timedelta

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from repliz_client import get_client
from threads_text_check import cek_teks_threads, ThreadsTextError, cek_link

WIB = timezone(timedelta(hours=7))
client = get_client()

# ── Akun TSC ──
ACC_TSC = {
    "threads": "6a4bbc5920e4f4f195e52960",   # @dniclinic_krian
    "fb": "6a3b41ddc5ff4ce3a327542c",         # Klinik DNI Krian (FB)
    "linkedin": "6a4da7f520e4f4f195e796e1",   # TSC LinkedIn organization
}

# ── 5 Artikel live ──
ARTIKEL = [
    {"judul": "Panduan Memilih Dokter Kulit di Krian",
     "url": "https://www.theskincodeclinic.com/panduan-memilih-dokter-kulit-krian/"},
    {"judul": "10 Masalah Kulit yang Wajib Ditangani Dokter Kulit di Krian",
     "url": "https://www.theskincodeclinic.com/masalah-kulit-wajib-dokter-kulit-krian/"},
    {"judul": "Proses Perawatan di Dokter Kulit Krian",
     "url": "https://www.theskincodeclinic.com/proses-perawatan-dokter-kulit-krian/"},
    {"judul": "Kenapa dr. Avril & The Skin Code Clinic",
     "url": "https://www.theskincodeclinic.com/kenapa-dr-avril-the-skin-code-clinic/"},
    {"judul": "FAQ Dokter Kulit di Krian",
     "url": "https://www.theskincodeclinic.com/faq-dokter-kulit-krian/"},
]

# ── Caption THREADS (<=500 char, humble, humanis pakai "saya", 1 paragraf sebelum link) ──
THREADS = [
    "Memilih dokter kulit itu tidak bisa asal-asalan, apalagi di Krian yang kliniknya makin banyak. Saya baru baca panduan lengkapnya dan ternyata ada 8 hal utama yang wajib diperhatikan — mulai dari sertifikasi spesialis sampai teknologi kliniknya. Buat yang sedang cari dokter kulit Krian yang tepat, ini bacaan yang pas sebelum memutuskan.\n\n" + ARTIKEL[0]["url"],
    "Banyak yang mengira semua masalah kulit cukup diatasi skincare. Padahal ada kondisi yang justru butuh dokter — seperti jerawat membandel, bekas bopeng, infeksi, sampai masalah kulit kelamin. Artikel ini merangkum 10 masalah kulit yang sebaiknya langsung ditangani dokter kulit di Krian biar tidak makin parah.\n\n" + ARTIKEL[1]["url"],
    "Pernah penasaran apa yang terjadi saat konsultasi ke dokter kulit? Ternyata ada alur yang jelas: dari konsultasi, pemeriksaan, diagnosis, sampai perawatan dan evaluasi. Saya rasa ini penting diketahui biar tidak takut dan lebih siap. Simak prosesnya lengkap di artikel ini ya.\n\n" + ARTIKEL[2]["url"],
    "Kenapa The Skin Code Clinic sering jadi rekomendasi dokter kulit di Krian? Salah satunya karena ditangani dr. Avril Novianto, Sp.DVE/Sp.KK — yang sebelumnya membangun Klinik DNI di Krian. Punya layanan lengkap dari dermatologi, kelamin, sampai estetika, dengan teknologi modern. Penasaran, simak ulasannya di sini.\n\n" + ARTIKEL[3]["url"],
    "Buat yang masih ragu konsultasi ke dokter kulit, banyak pertanyaan yang sering muncul di kepala — soal biaya, jadwal, sampai apakah kliniknya sama dengan DNI dulu. Artikel ini menjawab 12 pertanyaan paling sering ditanyakan pasien. Cocok dibaca sebelum memutuskan konsultasi.\n\n" + ARTIKEL[4]["url"],
]

# ── Caption FACEBOOK (minimal 2-4 paragraf + link + hashtags) ──
FACEBOOK = [
    "Mencari dokter kulit di Krian yang tepat memang butuh pertimbangan matang. Banyak klinik bermunculan, tapi tidak semuanya ditangani oleh dokter spesialis kulit yang benar-benar kompeten.\n\nDalam artikel terbaru ini, kami merangkum 8 hal penting yang wajib Anda perhatikan sebelum memilih dokter kulit di Krian — mulai dari sertifikasi spesialis, rekam jejak klinik, kelengkapan teknologi, hingga pendekatan edukasi pasien. Semua bisa jadi panduan agar Anda tidak salah pilih.\n\nSebagai referensi, di The Skin Code Clinic (yang sebelumnya dikenal sebagai Klinik DNI Krian), perawatan ditangani langsung oleh dr. Avril Novianto, Sp.DVE/Sp.KK — dokter spesialis kulit, kelamin, dan estetika.\n\nBaca selengkapnya di sini: " + ARTIKEL[0]["url"] + "\n\n#DokterKulitKrian #TheSkinCodeClinic #DrAvrilNovianto #KlinikDNIKrian #KlinikKulitKrian #Dermatologi",
    "Tidak semua masalah kulit bisa diatasi hanya dengan skincare. Ada kondisi tertentu yang membutuhkan penanganan medis dari dokter — dan menunda konsultasi justru bikin masalah makin parah serta meninggalkan bekas permanen.\n\nArtikel ini memuat 10 masalah kulit yang wajib Anda bawa ke dokter kulit di Krian, mulai dari jerawat membandel, bekas jerawat, flek hitam, eksim, hingga penyakit kulit kelamin. Setiap kondisi dijelaskan dengan gamblang agar Anda tahu kapan waktunya konsultasi.\n\nDi The Skin Code Clinic, dr. Avril Novianto menerapkan pendekatan evidence-based, artinya setiap tindakan didasarkan pada diagnosis dan kondisi pasien — bukan sekadar tren. Klinik ini adalah pengembangan dari Klinik DNI yang sudah akrab di Krian dan Sidoarjo.\n\nSelengkapnya di sini: " + ARTIKEL[1]["url"] + "\n\n#DokterKulitKrian #PerawatanKulit #TheSkinCodeClinic #KlinikKulitKrian #AntiJerawat",
    "Masih banyak yang merasa takut atau bingung saat hendak berkonsultasi ke dokter kulit. Padahal prosesnya sebenarnya terstruktur dan menenangkan — asal Anda paham alurnya.\n\nArtikel ini mengupas proses perawatan di dokter kulit dari awal hingga akhir: konsultasi awal, pemeriksaan kulit, diagnosis, penyusunan rencana perawatan personal, edukasi pasien, tindakan, sampai kontrol dan evaluasi. Dengan memahami alurnya, Anda akan lebih siap dan percaya diri.\n\nThe Skin Code Clinic — pengembangan dari Klinik DNI Krian — menyediakan layanan lengkap seperti facial medis, chemical peeling, laser, microneedling, botox & filler, hingga body contouring, semuanya di bawah dr. Avril Novianto.\n\nBaca proses lengkapnya di sini: " + ARTIKEL[2]["url"] + "\n\n#DokterKulitKrian #FacialMedis #TheSkinCodeClinic #PerawatanKulit #Laser",
    "Kenapa The Skin Code Clinic sering menjadi rekomendasi dokter kulit di Krian? Jawabannya ada pada kombinasi dokter spesialis yang berpengalaman, layanan yang lengkap, dan teknologi yang modern.\n\ndr. Avril Novianto, Sp.DVE/Sp.KK adalah dokter spesialis kulit, kelamin, dan estetika yang membawa pengalaman panjang membangun Klinik DNI di Krian sebelum mengembangkannya menjadi The Skin Code Clinic. Klinik ini menggabungkan empat pilar: diagnosis tepat, teknologi modern, edukasi pasien, dan perawatan personalisasi.\n\nDengan layanan mulai dari penanganan jerawat, flek hitam, eksim, hingga botox, filler, laser, dan body contouring — klinik ini hadir untuk menjawab kebutuhan kulit warga Krian dan Sidoarjo.\n\nSimak ulasan lengkapnya di sini: " + ARTIKEL[3]["url"] + "\n\n#DrAvrilNovianto #TheSkinCodeClinic #DokterKulitKrian #KlinikEstetikaKrian",
    "Banyak pertanyaan yang sering muncul di benak sebelum konsultasi ke dokter kulit — soal biaya, jadwal, hingga apakah klinik ini sama dengan Klinik DNI yang dulu. Semua itu wajar!\n\nArtikel ini menjawab 12 pertanyaan paling sering ditanyakan pasien di The Skin Code Clinic. Mulai dari kapan harus konsultasi, apakah prosedur estetika aman, bagaimana menjaga privasi masalah kulit kelamin, sampai hal yang perlu disiapkan sebelum datang.\n\nSemoga dengan membaca artikel ini, keraguan Anda terjawab dan langkah menuju kulit sehat jadi lebih mudah.\n\nBaca selengkapnya di sini: " + ARTIKEL[4]["url"] + "\n\n#FAQKulit #DokterKulitKrian #TheSkinCodeClinic #KonsultasiKulit #KlinikKulitKrian",
]

# ── Caption LINKEDIN (profesional, teks + link) ──
LINKEDIN = [
    "Panduan memilih dokter kulit di Krian kini semakin relevan seiring bertambahnya klinik kecantikan di kawasan tersebut. Namun, tidak semua klinik ditangani oleh dokter spesialis kulit yang kompeten.\n\nArtikel ini memaparkan 8 pertimbangan penting sebelum memilih dokter kulit di Krian — dari kredensial spesialis, rekam jejak, kelengkapan layanan, hingga pendekatan edukasi pasien. Sebagai referensi praktik yang baik, The Skin Code Clinic (pengembangan Klinik DNI Krian) menempatkan dr. Avril Novianto, Sp.DVE/Sp.KK sebagai penanggung jawab layanan.\n\nBaca selengkapnya: " + ARTIKEL[0]["url"],
    "Menunda penanganan masalah kulit karena menganggap skincare cukup, seringkali berakhir dengan biaya yang lebih besar dan bekas yang permanen. Kesadaran akan kapan harus ke dokter spesialis menjadi kunci.\n\nArtikel ini merinci 10 kondisi kulit yang wajib ditangani dokter kulit di Krian, termasuk jerawat membandel, bekas jerawat, flek hitam, eksim, hingga masalah kulit kelamin. Pendekatan evidence-based yang diterapkan dr. Avril di The Skin Code Clinic menjadi contoh bagaimana diagnosis yang tepat menentukan kualitas perawatan.\n\nDetail artikel: " + ARTIKEL[1]["url"],
    "Transparansi proses menjadi salah satu faktor yang menumbuhkan kepercayaan pasien terhadap layanan kesehatan. Sayangnya, alur konsultasi ke dokter kulit masih sering menjadi misteri bagi banyak orang.\n\nArtikel ini menjelaskan proses perawatan di dokter kulit dari konsultasi awal, pemeriksaan, diagnosis, hingga evaluasi. Di The Skin Code Clinic, alur ini didukung teknologi modern seperti laser, microneedling, dan chemical peeling, dengan pengawasan dr. Avril Novianto.\n\nBaca proses lengkapnya: " + ARTIKEL[2]["url"],
    "Keberlanjutan sebuah praktik klinik sering menjadi indikator kepercayaan pasien. Klinik DNI yang telah lama melayani warga Krian kini berkembang menjadi The Skin Code Clinic, dengan standar layanan yang lebih baik.\n\nArtikel ini mengulas alasan The Skin Code Clinic dipercaya sebagai dokter kulit di Krian: dikelola dr. Avril Novianto, Sp.DVE/Sp.KK, memiliki layanan dermatologi hingga estetika yang lengkap, dan menerapkan diagnosis yang personal. Transformasi dari Klinik DNI menjadi langkah peningkatan kualitas yang patut diapresiasi.\n\nBaca selengkapnya: " + ARTIKEL[3]["url"],
    "Keputusan berkonsultasi ke dokter kulit sering tertunda karena berbagai pertanyaan yang belum terjawab — mulai dari biaya, jadwal, hingga keamanan prosedur. Menyediakan informasi yang jelas adalah bagian dari pelayanan kesehatan yang baik.\n\nArtikel ini menyajikan 12 pertanyaan paling sering diajukan pasien di The Skin Code Clinic, dirangkum sebagai FAQ yang mudah dipahami. Diharapkan mampu membantu calon pasien di Krian mengambil keputusan dengan lebih tenang.\n\nBaca FAQ selengkapnya: " + ARTIKEL[4]["url"],
]


def cek_platform_link(teks, platform):
    """Validasi link untuk semua platform (link wajib nyala)."""
    import re
    urls = re.findall(r'https?://[^\s]+', teks)
    for u in urls:
        ok, msg = cek_link(u.strip())
        if not ok:
            raise Exception(f"Link mati di {platform}: {u} ({msg})")


def schedule_text(account_id, text, schedule_at, topic, platform):
    try:
        return client.schedule_text(account_id, text, schedule_at, topic=topic)
    except Exception as e:
        print(f"  ⚠️ Gagal {platform}: {e}")
        return {"_error": str(e)}


def main():
    # Pilih slot kosong berikutnya
    now = datetime.now(WIB)
    slots = [5, 8, 11, 14, 17, 20, 23]  # jam WIB
    next_dates = []
    for i in range(7):
        d = now + timedelta(days=i)
        for h in slots:
            slot_dt = d.replace(hour=h, minute=0, second=0, microsecond=0)
            if slot_dt > now:
                next_dates.append(slot_dt)

    print("=" * 60)
    print("PROMOSI 5 ARTIKEL 'dokter kulit krian' — TSC (Threads+FB+LinkedIn)")
    print("=" * 60)

    used_slots = 0
    # Jadwalkan bergantian platform agar rapi: tiap artikel 3 platform di slot berbeda
    for i in range(len(ARTIKEL)):
        # Threads
        t_th = THREADS[i]
        cek_platform_link(t_th, "Threads")
        try:
            t_th = cek_teks_threads(t_th, label=f"Threads TSC #{i+1}", maxlen=500)
        except ThreadsTextError as e:
            print(f"  ❌ Threads #{i+1} gagal validasi: {e}")
            continue
        slot = next_dates[used_slots]
        sid = schedule_text(ACC_TSC["threads"], t_th, (slot - timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%S.000Z"), "Dokter Kulit Krian", "Threads")
        if isinstance(sid, dict) and sid.get("_error"):
            continue
        print(f"  ✅ Threads #{i+1} {ARTIKEL[i]['judul'][:35]} slot {slot.strftime('%d %b %H:%M')} WIB id={str(sid)[:40]}")
        used_slots += 1
        time.sleep(1.5)

        # Facebook
        t_fb = FACEBOOK[i]
        cek_platform_link(t_fb, "Facebook")
        slot = next_dates[used_slots]
        sid2 = schedule_text(ACC_TSC["fb"], t_fb, (slot - timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%S.000Z"), "Dokter Kulit Krian", "FB")
        if isinstance(sid2, dict) and sid2.get("_error"):
            continue
        print(f"  ✅ FB #{i+1} {ARTIKEL[i]['judul'][:35]} slot {slot.strftime('%d %b %H:%M')} WIB id={str(sid2)[:40]}")
        used_slots += 1
        time.sleep(1.5)

        # LinkedIn
        t_li = LINKEDIN[i]
        cek_platform_link(t_li, "LinkedIn")
        slot = next_dates[used_slots]
        sid3 = schedule_text(ACC_TSC["linkedin"], t_li, (slot - timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%S.000Z"), "Dokter Kulit Krian", "LinkedIn")
        if isinstance(sid3, dict) and sid3.get("_error"):
            continue
        print(f"  ✅ LinkedIn #{i+1} {ARTIKEL[i]['judul'][:35]} slot {slot.strftime('%d %b %H:%M')} WIB id={str(sid3)[:40]}")
        used_slots += 1
        time.sleep(1.5)

    print("\n✅ Selesai jadwalkan promosi TSC.")


if __name__ == "__main__":
    main()
