#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TSC (The Skin Code Clinic) — Instagram Feed Scheduler.
1 gambar feed (1080x1350) per hari, konten unik, mulai besok (atau --mulai DD/MM/YYYY).
Jadwal via Repliz schedule_image ke ACC.TSC_IG (gambar wajib URL, di-upload ke WP dulu).

Pemakaian:
    python3 tsc_ig_scheduler.py                 # jadwalkan 30 hari mulai besok
    python3 tsc_ig_scheduler.py --hari 15       # 15 hari
    python3 tsc_ig_scheduler.py --mulai 21/08/2026 --hari 30
    python3 tsc_ig_scheduler.py --dry           # generate gambar saja, tanpa jadwal
"""
import json, os, sys, io
from datetime import datetime, timedelta, timezone
from PIL import Image, ImageDraw, ImageFont

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from repliz_client import ReplizClient, ACC

WIB = timezone(timedelta(hours=7))
ROOT = os.path.dirname(os.path.abspath(__file__))
OUT_DIR = os.path.join(ROOT, "tsc_ig_images")
STATE_FILE = os.path.join(ROOT, "tsc_ig_state.json")
LOG_FILE = os.path.join(ROOT, "tsc_ig_log.txt")
FONT_BOLD = os.path.join(ROOT, "fonts", "Poppins-Bold.ttf")
FONT_REG = os.path.join(ROOT, "fonts", "Poppins-Regular.ttf")

W, H = 1080, 1350  # 4:5 feed
MARGIN = 60
SAFE = 20

# ── Palette per topik (klinik estetika, konsisten dgn gen_tsc_images.py) ──
PALETTES = [
    ("#1E3A5F", "#4A90D9"),  # Facial Medis — Deep Blue
    ("#5B2C6F", "#A569BD"),  # Botox Filler — Purple
    ("#0E6251", "#45B39D"),  # Chemical Peeling — Teal
    ("#154360", "#5DADE2"),  # Laser — Dark Blue
    ("#6E2C00", "#EB984E"),  # Microneedling — Orange Brown
    ("#4A235A", "#AF7AC5"),  # Kulit Berminyak — Deep Purple
    ("#1B4F72", "#5499C7"),  # Body Contouring — Steel Blue
    ("#78281F", "#E74C3C"),  # Anti Aging — Red
    ("#0E6655", "#52BE80"),  # Manfaat Facial — Green
    ("#2C3E50", "#7F8C8D"),  # Tips Klinik — Dark Gray
]

# ── BANK KONTEN 30 HARI — unik, topik sesuai 15 niche TSC ──
# tiap entri: judul (pendek), poin (3-4, ringkas), caption (2 paragraf + hashtag)
CONTENT = [
    {
        "judul": "Jerawat Aktif Jangan Dipencet!",
        "poin": [
            "☑ Pencet jerawat = infeksi makin menyebar",
            "☑ Risiko bekas luka & noda hitam (PIH)",
            "☑ Bakteri masuk lebih dalam ke kulit",
            "☑ Biarkan dokter yang menangani dengan steril",
        ],
        "caption": "Jerawat aktif memang mengganggu, tapi memencetnya justru memperparah peradangan dan meninggalkan bekas yang sulit hilang. Penanganan jerawat yang benar dimulai dari diagnosis dokter, bukan dari tangan sendiri.\n\nPunya masalah jerawat yang tak kunjung membaik? Konsultasikan ke dokter kulit kami — diagnosis tepat, penanganan aman. 📍 theskincodeclinic.com\n\n#TSCClinic #TheSkinCodeClinic #Jerawat #AcneTreatment #KlinikKulit",
        "pal": 0,
    },
    {
        "judul": "Bekas Jerawat Bisa Hilang?",
        "poin": [
            "☑ Noda hitam (PIH) bisa pudar dengan peeling & laser",
            "☑ Bekas cekung (scar) butuh microneedling / laser",
            "☑ Semakin cepat ditangani, semakin mudah hilang",
            "☑ Konsistensi perawatan adalah kuncinya",
        ],
        "caption": "Bekas jerawat terdiri dari dua jenis: noda hitam (PIH) dan bekas cekung (scar). Keduanya bisa membaik drastis dengan perawatan yang tepat seperti chemical peeling, microneedling, atau laser — selama dilakukan dokter.\n\nJangan biarkan bekas jerawat menurunkan rasa percaya diri. Konsultasi dulu, dapatkan rencana perawatan yang sesuai kondisi kulitmu. ✨\n\n#TSCClinic #BekasJerawat #AcneScar #Microneedling #PerawatanKulit",
        "pal": 1,
    },
    {
        "judul": "Flek Hitam & Melasma",
        "poin": [
            "☑ Dipicu paparan sinar matahari & hormon",
            "☑ Butuh tabir surya rutin, bukan hanya saat panas",
            "☑ Bisa diringankan dengan peeling / laser",
            "☑ Jangan pakai produk pemutih tanpa pengawasan",
        ],
        "caption": "Flek hitam dan melasma muncul karena produksi melanin berlebih — dipicu sinar UV, hormon, atau iritasi produk. Perlindungan utama adalah tabir surya harian, lalu perawatan dokter untuk memudarkan noda yang sudah ada.\n\nKulit tampak belang karena flek? Yuk konsultasi ke The Skin Code Clinic, kami bantu kulitmu lebih merata dan cerah. 💛\n\n#TSCClinic #Melasma #FlekHitam #KulitSehat #TabirSurya",
        "pal": 2,
    },
    {
        "judul": "Kulit Kusam? Ini Penyebabnya",
        "poin": [
            "☑ Sel kulit mati menumpuk di permukaan",
            "☑ Kurang tidur & dehidrasi bikin wajah redup",
            "☑ Paparan polusi merusak tekstur kulit",
            "☑ Eksfoliasi teratur + pelembap = kulit bercahaya",
        ],
        "caption": "Kulit kusam adalah sinyal bahwa sel kulit mati menumpuk dan kelembapan menurun. Solusinya bukan hanya skincare mahal, tapi rutinitas yang benar: pembersih lembut, eksfoliasi terjadwal, pelembap, dan tabir surya.\n\nMau kulit kembali bercahaya? Mulai dari konsultasi kulit di The Skin Code Clinic — diagnosis tepat, hasil optimal. 🌟\n\n#TSCClinic #KulitKusam #Skincare #GlowingSkin #DokterKulit",
        "pal": 3,
    },
    {
        "judul": "Kulit Sensitif, Jangan Asal Coba",
        "poin": [
            "☑ Kenali dulu pemicu iritasimu",
            "☑ Hindari produk dengan pewangi & alkohol",
            "☑ Pilih pembersih pH seimbang",
            "☑ Perawatan dokter lebih aman untuk kulit sensitif",
        ],
        "caption": "Kulit sensitif mudah merah, perih, dan gatal saat terkena produk yang salah. Kuncinya adalah meminimalkan iritasi dan memperbaiki skin barrier — bukan terus mengganti-ganti produk baru.\n\nKulitmu gampang iritasi? Konsultasikan ke dokter kulit kami agar perawatannya tepat dan aman. 💆‍♀️\n\n#TSCClinic #KulitSensitif #SkinBarrier #PerawatanKulit #DokterKulit",
        "pal": 4,
    },
    {
        "judul": "Kontrol Minyak Berlebih",
        "poin": [
            "☑ Jangan cuci muka berlebihan — malah makin berminyak",
            "☑ Gunakan pelembap ringan (gel/water based)",
            "☑ Niacinamide bantu kontrol produksi sebum",
            "☑ Facial medis rutin = pori bersih, minyak terkontrol",
        ],
        "caption": "Kulit berminyak bukan berarti tidak perlu pelembap. Justru saat kulit kering karena terlalu sering dicuci, kelenjar minyak memproduksi lebih banyak sebum sebagai kompensasi. Kuncinya: rutinitas seimbang dan perawatan rutin.\n\nMinyak berlebih bikin makeup cepat luntur? Konsultasi ke klinik kami untuk solusi facial medis yang tepat. 💧\n\n#TSCClinic #KulitBerminyak #OilySkin #FacialMedis #Skincare",
        "pal": 5,
    },
    {
        "judul": "Komedo & Pori-Pori Besar",
        "poin": [
            "☑ Komedo = sumbatan minyak & sel kulit mati",
            "☑ Ekstraksi steril di klinik lebih aman",
            "☑ Pori besar bisa dikecilkan dengan laser / peeling",
            "☑ Konsisten facial = pori tampak lebih halus",
        ],
        "caption": "Komedo membandel dan pori-pori besar sering bikin tekstur wajah terasa kasar. Ekstraksi di rumah dengan alat sembarangan justru berisiko infeksi dan memperlebar pori. Di klinik, ekstraksi dilakukan steril oleh dokter.\n\nSudah coba banyak produk tapi komedo tetap ada? Saatnya konsultasi profesional di The Skin Code Clinic. ✨\n\n#TSCClinic #Komedo #PoriBesar #FacialMedis #PerawatanWajah",
        "pal": 6,
    },
    {
        "judul": "Mata Panda, Bukan Cuma Kurang Tidur",
        "poin": [
            "☑ Bisa karena faktor genetik & kebiasaan gesek mata",
            "☑ Alergi & sinus bikin lingkaran gelap makin pekat",
            "☑ Krim mata membantu, tapi butuh waktu",
            "☑ Konsultasi dokter untuk penyebab yang pasti",
        ],
        "caption": "Lingkaran gelap di bawah mata tidak selalu berarti kurang tidur. Bisa dipicu alergi, kebiasaan menggosok mata, atau faktor genetik. Mengetahui penyebabnya penting agar perawatannya tepat sasaran.\n\nPenampilan lelah seharian karena mata panda? Konsultasikan ke dokter kulit kami untuk solusinya. 👀\n\n#TSCClinic #MataPanda #DarkCircle #PerawatanKulit #DokterKulit",
        "pal": 7,
    },
    {
        "judul": "Facial Medis vs Facial Biasa",
        "poin": [
            "☑ Facial medis: diagnosis dokter sebelum tindakan",
            "☑ Produk medis & alat steril berstandar klinik",
            "☑ Hasil lebih terarah sesuai kondisi kulit",
            "☑ Facial biasa: perawatan umum, tanpa diagnosis",
        ],
        "caption": "Facial medis berbeda dari facial biasa di salon. Di klinik, perawatan diawali analisis kulit oleh dokter, menggunakan produk medis dan alat steril. Hasilnya lebih tepat sasaran dan aman untuk semua jenis kulit.\n\nIngin facial yang benar-benar sesuai kondisi kulitmu? Coba facial medis di The Skin Code Clinic. 💆‍♀️✨\n\n#TSCClinic #FacialMedis #PerawatanWajah #KlinikKecantikan",
        "pal": 8,
    },
    {
        "judul": "Chemical Peeling Aman?",
        "poin": [
            "☑ Dilakukan dokter = pengelupasan terkontrol",
            "☑ Angkat sel kulit mati & cerahkan wajah",
            "☑ Bantu bekas jerawat & flek memudar",
            "☑ Tingkat peeling disesuaikan kondisi kulit",
        ],
        "caption": "Chemical peeling bukan sekadar 'mengelupas kulit' — ini prosedur medis yang merangsang regenerasi kulit dengan larutan kimia khusus, dilakukan dokter sesuai kondisi dan kebutuhan kulit Anda.\n\nKulit kusam, bekas jerawat, atau flek? Chemical peeling di klinik kami bisa jadi jawabannya. 🧪\n\n#TSCClinic #ChemicalPeeling #KulitCerah #BekasJerawat #PerawatanKulit",
        "pal": 9,
    },
    {
        "judul": "Laser untuk Kulit: Apa Saja?",
        "poin": [
            "☑ Laser rejuvenation: meremajakan & kencangkan kulit",
            "☑ Laser fraksional: bekas jerawat & pori besar",
            "☑ Laser pigmen: flek & melasma",
            "☑ Semua harus dengan dokter & proteksi mata",
        ],
        "caption": "Laser kini jadi andalan perawatan kulit modern: meremajakan, menghaluskan bekas jerawat, hingga memudarkan flek. Keamanannya bergantung pada tenaga medis dan jenis laser yang tepat untuk kondisi kulit Anda.\n\nPenasaran treatment laser mana yang cocok untukmu? Konsultasi dulu di The Skin Code Clinic. 💡\n\n#TSCClinic #LaserTreatment #LaserRejuvenation #KlinikKulit #Estetika",
        "pal": 0,
    },
    {
        "judul": "Microneedling untuk Bekas Jerawat",
        "poin": [
            "☑ Merangsang produksi kolagen alami kulit",
            "☑ Bekas cekung (scar) tampak rata bertahap",
            "☑ Jarum steril sekali pakai — aman",
            "☑ Hasil maksimal dengan rangkaian rutin",
        ],
        "caption": "Microneedling bekerja dengan merangsang kulit memproduksi kolagen baru, sehingga bekas jerawat yang cekung perlahan terisi dan kulit tampak lebih rata. Prosedurnya aman selama dilakukan dokter dengan jarum steril.\n\nBekas jerawat mengganggu penampilan? Microneedling di klinik kami bisa membantu. ✨\n\n#TSCClinic #Microneedling #BekasJerawat #Kolagen #PerawatanKulit",
        "pal": 1,
    },
    {
        "judul": "Botox: Fakta & Mitos",
        "poin": [
            "☑ Mitos: botox bikin wajah beku — fakta: dosis tepat = natural",
            "☑ Bukan cuma kerutan, botox juga untuk keringat berlebih",
            "☑ Efek bertahan 3-6 bulan",
            "☑ Wajib dokter berpengalaman & produk BPOM",
        ],
        "caption": "Banyak yang takut botox bikin wajah kaku. Faktanya, dengan dosis yang tepat dan dokter berpengalaman, hasilnya tetap natural — kerutan halus di dahi dan sekitar mata justru lebih lembut.\n\nIngin wajah lebih fresh tanpa terlihat 'berubah'? Konsultasikan botox bersama dokter kami. 💉\n\n#TSCClinic #Botox #AntiAging #Estetika #DokterEstetika",
        "pal": 2,
    },
    {
        "judul": "Filler: Volume & Kontur Wajah",
        "poin": [
            "☑ Isi jaringan yang kendur — pipi, bibir, dagu",
            "☑ Hasil 6-18 bulan tergantung jenis",
            "☑ Produk asli & tersertifikasi itu wajib",
            "☑ Natural > berlebihan, ikuti saran dokter",
        ],
        "caption": "Filler digunakan untuk mengembalikan volume wajah yang berkurang seiring usia — pipi, bibir, dagu, hingga kontur rahang. Hasil terbaik selalu natural, sesuai proporsi wajah, bukan sekadar 'banyak'.\n\nIngin wajah lebih segar dan proporsional? Konsultasi filler di The Skin Code Clinic bersama dokter estetika. 💎\n\n#TSCClinic #Filler #EstetikaWajah #KlinikKecantikan #DokterEstetika",
        "pal": 3,
    },
    {
        "judul": "Body Contouring: Bentuk Tubuh Ideal",
        "poin": [
            "☑ Bantu kencangkan area perut, lengan, paha",
            "☑ Non-invasif: tanpa operasi, minim downtime",
            "☑ Hasil bertahap — butuh rangkaian treatment",
            "☑ Tetap wajib diimbangi pola hidup sehat",
        ],
        "caption": "Body contouring membantu membentuk dan mengencangkan area tubuh yang sulit diatasi hanya dengan olahraga, seperti perut, lengan, dan paha. Prosedurnya non-invasif dan dilakukan dokter sesuai kebutuhan Anda.\n\nIngin tubuh lebih kencang dan proporsional? Tanyakan opsi body contouring di klinik kami. 💪\n\n#TSCClinic #BodyContouring #BodySlimming #Estetika #KlinikKecantikan",
        "pal": 4,
    },
    {
        "judul": "Anti Aging: Mulai dari Kapan?",
        "poin": [
            "☑ Perawatan anti aging bisa mulai sejak 20-an",
            "☑ Tabir surya = anti aging termurah & terbaik",
            "☑ Retinol & antioksidan bantu regenerasi kulit",
            "☑ Konsultasi dokter untuk kebutuhan spesifik",
        ],
        "caption": "Anti aging bukan menunggu keriput muncul. Pencegahan sejak dini — terutama tabir surya harian dan perawatan yang tepat — jauh lebih efektif daripada mengobati setelah tanda penuaan terlihat.\n\nMau kulit awet muda lebih lama? Mulai dari konsultasi rutinitas anti aging di The Skin Code Clinic. ⏳\n\n#TSCClinic #AntiAging #AwetMuda #Skincare #DokterKulit",
        "pal": 5,
    },
    {
        "judul": "Sunscreen: Wajib Setiap Hari!",
        "poin": [
            "☑ Di dalam ruangan pun kulit tetap kena sinar UV",
            "☑ Pakai SPF 30+ dan ulangi tiap 3-4 jam",
            "☑ Jumlah cukup: 2 ruas jari untuk wajah",
            "☑ Melindungi dari flek, penuaan, & risiko kanker kulit",
        ],
        "caption": "Sinar UV tetap menembus jendela dan langit mendung, jadi tabir surya wajib dipakai setiap hari — bahkan di dalam ruangan. Gunakan SPF 30+ dengan jumlah cukup dan ulangi pemakaian berkala.\n\nKulit sehat berawal dari perlindungan yang benar. Konsultasikan kebutuhan tabir suryamu ke dokter kami. ☀️\n\n#TSCClinic #Sunscreen #TabirSurya #SkinProtection #Skincare",
        "pal": 6,
    },
    {
        "judul": "Skin Barrier: Perisai Kulitmu",
        "poin": [
            "☑ Lapisan pelindung kulit dari kuman & iritasi",
            "☑ Rusak = kering, merah, mudah perih",
            "☑ Ceramide & niacinamide bantu perbaiki",
            "☑ Hindari eksfoliasi berlebihan",
        ],
        "caption": "Skin barrier adalah perisai alami kulit yang menjaga kelembapan dan menangkal iritasi. Saat rusak, kulit jadi kering, sensitif, dan mudah merah. Perbaikannya butuh kesabaran: rutinitas lembut dan bahan yang menenangkan.\n\nKulitmu terasa perih dan mudah iritasi? Cek kondisi skin barrier-mu bersama dokter kami. 🛡️\n\n#TSCClinic #SkinBarrier #KulitSehat #SkincareRoutine #DokterKulit",
        "pal": 7,
    },
    {
        "judul": "Retinol: Si Anti Aging Andal",
        "poin": [
            "☑ Turunan vitamin A — merangsang regenerasi sel",
            "☑ Bantu haluskan garis halus & bekas jerawat",
            "☑ Mulai dari konsentrasi rendah, gunakan malam hari",
            "☑ Wajib sunscreen di pagi hari saat pakai retinol",
        ],
        "caption": "Retinol adalah salah satu bahan paling efektif untuk anti aging dan bekas jerawat. Namun ia butuh adaptasi: mulai dari dosis rendah, gunakan malam hari, dan jangan lupa tabir surya di pagi hari.\n\nIngin mulai retinol tapi bingung caranya? Konsultasikan dulu ke dokter kulit kami agar aman dan optimal. 🌙\n\n#TSCClinic #Retinol #AntiAging #Skincare #DokterKulit",
        "pal": 8,
    },
    {
        "judul": "Vitamin C untuk Kulit Cerah",
        "poin": [
            "☑ Antioksidan — lawan radikal bebas & polusi",
            "☑ Bantu cerahkan & ratakan warna kulit",
            "☑ Merangsang produksi kolagen",
            "☑ Gunakan pagi hari, simpan di tempat sejuk",
        ],
        "caption": "Vitamin C adalah antioksidan andalan untuk kulit cerah dan kencang. Dipakai pagi hari sebelum tabir surya, ia membantu melawan efek polusi dan mencerahkan warna kulit secara bertahap.\n\nKulit tampak kusam dan tidak merata? Lengkapi rutinitasmu dengan vitamin C yang tepat — konsultasi dulu ya. 🍊\n\n#TSCClinic #VitaminC #Skincare #KulitCerah #Antioksidan",
        "pal": 9,
    },
    {
        "judul": "Niacinamide: Serba Bisa",
        "poin": [
            "☑ Kontrol minyak & kecilkan pori",
            "☑ Cerahkan noda bekas jerawat",
            "☑ Perkuat skin barrier",
            "☑ Cocok untuk hampir semua jenis kulit",
        ],
        "caption": "Niacinamide (vitamin B3) adalah bahan serba bisa: mengontrol minyak, memperbaiki tekstur, mencerahkan noda, sekaligus memperkuat skin barrier. Kecocokannya luas, termasuk kulit sensitif.\n\nSedang mencari skincare yang aman dan multifungsi? Niacinamide bisa jadi pilihan — konsultasikan dulu ke dokter kami. ✨\n\n#TSCClinic #Niacinamide #Skincare #KulitSehat #DokterKulit",
        "pal": 0,
    },
    {
        "judul": "Mitos: Kulit Berminyak Tak Perlu Pelembap",
        "poin": [
            "☑ FAKTA: tanpa pelembap, minyak makin banyak",
            "☑ Kulit kering 'dibalas' produksi sebum berlebih",
            "☑ Pilih pelembap gel yang ringan",
            "☑ Hasilnya: kulit lebih seimbang & tidak kilap",
        ],
        "caption": "Ini mitos skincare paling umum: kulit berminyak justru butuh pelembap. Saat kulit terasa kering, kelenjar minyak bekerja lebih keras memproduksi sebum. Pelembap ringan membantu menyeimbangkan kondisi kulit.\n\nMasih bingung dengan rutinitas kulit berminyakmu? Konsultasi di The Skin Code Clinic, kami bantu urutannya. 💧\n\n#TSCClinic #SkincareMyth #KulitBerminyak #MitosFakta #DokterKulit",
        "pal": 1,
    },
    {
        "judul": "Mitos: Skincare Mahal Pasti Bagus",
        "poin": [
            "☑ FAKTA: harga tidak menjamin cocok dengan kulitmu",
            "☑ Kandungan & konsentrasi yang lebih penting",
            "☑ Skincare murah dengan bahan tepat bisa efektif",
            "☑ Yang terbaik = sesuai jenis & masalah kulitmu",
        ],
        "caption": "Skincare mahal belum tentu bagus untuk kulit Anda — yang menentukan adalah kandungan, konsentrasi, dan kecocokan dengan kondisi kulit. Bahkan produk terjangkau dengan bahan yang tepat bisa bekerja sangat baik.\n\nBingung memilih produk yang benar-benar cocok? Konsultasi ke dokter kulit kami untuk rekomendasi yang tepat. 💡\n\n#TSCClinic #SkincareMyth #MitosFakta #SkincareRoutine #DokterKulit",
        "pal": 2,
    },
    {
        "judul": "Mitos: Facial Bikin Kulit Menipis",
        "poin": [
            "☑ FAKTA: facial medis merangsang regenerasi, bukan menipiskan",
            "☑ Pengelupasan terkontrol justru menebalkan lapisan sehat",
            "☑ Yang menipiskan = eksfoliasi berlebihan & produk keras",
            "☑ Lakukan sesuai saran dokter, bukan tiap hari",
        ],
        "caption": "Banyak yang khawatir facial atau peeling membuat kulit menipis. Faktanya, perawatan yang dilakukan dokter justru merangsang regenerasi sel sehingga kulit tampak lebih sehat — selama frekuensinya sesuai kebutuhan, bukan berlebihan.\n\nMau facial yang aman dan tidak merusak kulit? Datang ke The Skin Code Clinic. 🌸\n\n#TSCClinic #SkincareMyth #FacialMedis #MitosFakta #KlinikKulit",
        "pal": 3,
    },
    {
        "judul": "Tips Memilih Klinik Estetika",
        "poin": [
            "☑ Pastikan ada dokter kulit/estetika yang menangani",
            "☑ Cek legalitas & izin klinik",
            "☑ Tanya produk yang digunakan (BPOM?)",
            "☑ Hindari harga murah mencurigakan di tempat abal-abal",
        ],
        "caption": "Memilih klinik estetika tidak boleh asal. Pastikan ditangani dokter, klinik berizin, produk tersertifikasi, dan ada pemeriksaan sebelum tindakan. Keselamatan Anda jauh lebih berharga daripada harga murah.\n\nIngin perawatan estetika yang aman dan profesional? The Skin Code Clinic siap membantu — diagnosis tepat, teknologi modern. 🏥\n\n#TSCClinic #TipsKlinik #KlinikEstetika #KlinikKulit #AmanBersamaDokter",
        "pal": 4,
    },
    {
        "judul": "Kapan Harus ke Dokter Kulit?",
        "poin": [
            "☑ Jerawat tak membaik meski sudah pakai skincare",
            "☑ Gatal, kemerahan, atau perih berkepanjangan",
            "☑ Muncul tahi lalat/benjolan yang berubah",
            "☑ Masalah kulit mengganggu aktivitas & percaya diri",
        ],
        "caption": "Jangan menunggu masalah kulit makin parah untuk menemui dokter. Jika skincare rumahan tidak membawa perubahan, kulit terasa tidak nyaman, atau muncul kelainan yang berubah — segera konsultasi.\n\nGejala kulitmu mengganggu? Jangan tunda, konsultasikan ke dokter kulit The Skin Code Clinic. 👨‍⚕️\n\n#TSCClinic #DokterKulit #KonsultasiKulit #KulitSehat #KlinikKulit",
        "pal": 5,
    },
    {
        "judul": "Kenalan dengan Dokter Kami",
        "poin": [
            "☑ dr. Avril Novianto, Sp.DVE / Sp.KK",
            "☑ Spesialis kulit, kelamin & estetika",
            "☑ Diagnosis tepat, edukasi pasien, perawatan personal",
            "☑ Teknologi modern, pendekatan evidence-based",
        ],
        "caption": "Di balik setiap perawatan di The Skin Code Clinic, ada dr. Avril Novianto, Sp.DVE / Sp.KK — dokter spesialis yang mengedepankan diagnosis tepat dan edukasi pasien. Setiap pasien mendapat perawatan yang personal.\n\nIngin ditangani langsung dokter spesialis kulit & estetika? Kunjungi The Skin Code Clinic. 👩‍⚕️✨\n\n#TSCClinic #DokterKulit #SpKK #KlinikKulit #TheSkinCodeClinic",
        "pal": 6,
    },
    {
        "judul": "Rutinitas Pagi yang Benar",
        "poin": [
            "☑ Cuci muka dengan pembersih lembut",
            "☑ Serum sesuai kebutuhan (vitamin C / niacinamide)",
            "☑ Pelembap untuk mengunci hidrasi",
            "☑ Tabir surya — langkah yang tidak boleh dilewatkan",
        ],
        "caption": "Rutinitas pagi yang benar tidak perlu ribet: bersihkan, beri serum sesuai kebutuhan, kunci dengan pelembap, dan akhiri dengan tabir surya. Konsistensi lebih penting daripada jumlah produk.\n\nMulai rutinitas yang tepat dari sekarang. Butuh panduan sesuai kulitmu? Konsultasi di klinik kami. ☀️\n\n#TSCClinic #SkincareRoutine #MorningRoutine #Sunscreen #KulitSehat",
        "pal": 7,
    },
    {
        "judul": "Rutinitas Malam: Waktu Perbaikan",
        "poin": [
            "☑ Bersihkan makeup & kotoran sampai tuntas",
            "☑ Gunakan treatment aktif (retinol/AHA) di malam hari",
            "☑ Pelembap lebih kaya untuk regenerasi",
            "☑ Tidur cukup = kulit memperbaiki diri",
        ],
        "caption": "Malam adalah waktu kulit memperbaiki diri. Pastikan wajah bersih sempurna, beri treatment aktif seperti retinol bila sesuai, dan jangan lupa pelembap. Tidur cukup melengkapi seluruh proses regenerasi.\n\nRutinitas malam yang benar membuat perbedaan besar. Konsultasikan kebutuhan kulitmu ke dokter kami. 🌙\n\n#TSCClinic #NightRoutine #SkincareRoutine #Retinol #KulitSehat",
        "pal": 8,
    },
    {
        "judul": "Bibir Gelap? Ini Penyebabnya",
        "poin": [
            "☑ Kebiasaan menjilat bibir & paparan matahari",
            "☑ Merokok & kafein berlebih ikut berperan",
            "☑ Gesekan berulang (menggigit bibir)",
            "☑ Perawatan dokter bisa bantu cerahkan secara aman",
        ],
        "caption": "Bibir gelap bisa disebabkan kebiasaan menjilat bibir, paparan sinar matahari, merokok, hingga gesekan berulang. Menghindari pemicunya adalah langkah awal sebelum perawatan lanjutan.\n\nIngin bibir lebih cerah dan sehat? Konsultasikan penyebabnya ke dokter kulit kami. 💋\n\n#TSCClinic #BibirGelap #PerawatanBibir #KlinikKulit #DokterKulit",
        "pal": 9,
    },
    {
        "judul": "Rambut Rontok & Kulit Kepala",
        "poin": [
            "☑ Rontok normal 50-100 helai per hari",
            "☑ Lebih dari itu? Bisa tanda masalah kesehatan",
            "☑ Stres, hormon, & kekurangan zat besi berpengaruh",
            "☑ Konsultasi dokter untuk diagnosis akurat",
        ],
        "caption": "Rambut rontok 50-100 helai sehari itu normal. Namun jika berlebihan, bisa menjadi tanda gangguan hormonal, stres, atau kekurangan nutrisi. Penanganan yang tepat dimulai dari diagnosis dokter.\n\nRambut makin menipis dan mengkhawatirkan? Konsultasikan ke dokter kulit The Skin Code Clinic. 💇‍♀️\n\n#TSCClinic #RambutRontok #KesehatanKulitKepala #KlinikKulit #DokterKulit",
        "pal": 0,
    },
    {
        "judul": "Perawatan Kulit Pria Juga Penting",
        "poin": [
            "☑ Kulit pria lebih tebal & lebih berminyak",
            "☑ Cukup 3 langkah: cuci, pelembap, sunscreen",
            "☑ Jerawat & bekas cukur butuh perawatan dokter",
            "☑ Perawatan rutin = tampil lebih percaya diri",
        ],
        "caption": "Perawatan kulit bukan hanya untuk wanita. Kulit pria pun butuh perhatian: pembersih yang tepat, pelembap, dan tabir surya. Masalah seperti jerawat atau iritasi bekas cukur bisa ditangani dokter.\n\nPria juga berhak kulit sehat. Konsultasi perawatan kulitmu di The Skin Code Clinic. 👔\n\n#TSCClinic #SkincarePria #KulitSehat #KlinikKulit #DokterKulit",
        "pal": 1,
    },
]

# ── Helper teks: wrap + cek overflow ──
def wrap_text(draw, text, font, max_width):
    words = text.split()
    lines, cur = [], ""
    for w in words:
        t = (cur + " " + w).strip()
        if draw.textlength(t, font=font) <= max_width:
            cur = t
        else:
            if cur:
                lines.append(cur)
            cur = w
    if cur:
        lines.append(cur)
    return lines

def generate_image(item, idx):
    """Render feed 1080x1350 — header brand, judul besar, poin, footer."""
    bg1, bg2 = PALETTES[item["pal"] % len(PALETTES)]
    img = Image.new("RGB", (W, H), bg1)
    draw = ImageDraw.Draw(img)

    # gradasi halus dari bg1 ke bg2
    bg1 = bg1.lstrip('#')
    bg2 = bg2.lstrip('#')
    for y in range(H):
        ratio = y / H
        c = tuple(int(bg1[i:i+2], 16) * (1 - ratio) + int(bg2[i:i+2], 16) * ratio for i in (0, 2, 4))
        draw.line([(0, y), (W, y)], fill=(int(c[0]), int(c[1]), int(c[2])))

    fb = ImageFont.truetype(FONT_BOLD, 30)
    fr = ImageFont.truetype(FONT_REG, 26)
    f_judul = ImageFont.truetype(FONT_BOLD, 88)
    f_poin = ImageFont.truetype(FONT_REG, 42)
    f_foot = ImageFont.truetype(FONT_REG, 24)

    # header
    draw.text((MARGIN, SAFE + 10), "THE SKIN CODE CLINIC", font=fb, fill="#FFFFFF")
    tag = "@theskincode_clinic"
    tw = draw.textlength(tag, font=fr)
    draw.text((W - MARGIN - tw, SAFE + 14), tag, font=fr, fill="#FFFFFF")

    # judul (di area tengah)
    title_lines = wrap_text(draw, item["judul"], f_judul, W - 2 * MARGIN)
    # kalau judul terlalu panjang, turunkan ukuran font
    while len(title_lines) > 3 and f_judul.size > 55:
        f_judul = ImageFont.truetype(FONT_BOLD, f_judul.size - 8)
        title_lines = wrap_text(draw, item["judul"], f_judul, W - 2 * MARGIN)

    # poin
    point_lines = []
    for p in item["poin"]:
        point_lines.extend(wrap_text(draw, p, f_poin, W - 2 * MARGIN))

    # kalau poin overflow, kecilkan font
    while (len(title_lines) * f_judul.size + len(point_lines) * f_poin.size) > 900 and f_poin.size > 30:
        f_poin = ImageFont.truetype(FONT_REG, f_poin.size - 4)
        point_lines = []
        for p in item["poin"]:
            point_lines.extend(wrap_text(draw, p, f_poin, W - 2 * MARGIN))

    # total tinggi konten
    title_h = len(title_lines) * (f_judul.size + 12)
    gap = 50
    point_h = len(point_lines) * (f_poin.size + 18)

    # posisi vertikal tengah antara header & footer
    header_bottom = SAFE + 10 + 40
    footer_top = H - SAFE - 34
    avail = footer_top - header_bottom - 40
    start_y = header_bottom + (avail - (title_h + gap + point_h)) // 2
    if start_y < header_bottom + 30:
        start_y = header_bottom + 30

    y = start_y
    for ln in title_lines:
        draw.text((MARGIN, y), ln, font=f_judul, fill="#FFFFFF")
        y += f_judul.size + 12
    y += gap
    for ln in point_lines:
        draw.text((MARGIN, y), ln, font=f_poin, fill="#FFFFFF")
        y += f_poin.size + 18

    # footer
    draw.text((MARGIN, H - SAFE - 34), "theskincodeclinic.com", font=f_foot, fill="#FFFFFF")
    htag = "#TSCClinic #KlinikKulit"
    tw2 = draw.textlength(htag, font=f_foot)
    draw.text((W - MARGIN - tw2, H - SAFE - 34), htag, font=f_foot, fill="#FFFFFF")

    # verifikasi safe zone (kiri/kanan/atas/bawah >= 20px)
    assert start_y >= SAFE, "Judul keluar safe zone atas"
    assert y <= footer_top, "Konten menabrak footer"
    for x in (MARGIN, W - MARGIN):
        pass  # margin sudah aman

    path = os.path.join(OUT_DIR, f"tsc_ig_{idx+1:02d}.png")
    img.save(path)
    return path

# ── State & jadwal ──
def load_state():
    if os.path.exists(STATE_FILE):
        with open(STATE_FILE) as f:
            return json.load(f)
    return {"last_index": -1, "scheduled_until": None}

def save_state(st):
    with open(STATE_FILE, "w") as f:
        json.dump(st, f, indent=2, ensure_ascii=False)

def log(msg):
    with open(LOG_FILE, "a") as f:
        f.write(f"[{datetime.now(WIB).isoformat()}] {msg}\n")

def main():
    import argparse
    ap = argparse.ArgumentParser()
    ap.add_argument("--hari", type=int, default=30)
    ap.add_argument("--mulai", default=None, help="DD/MM/YYYY (default besok)")
    ap.add_argument("--dry", action="store_true", help="Generate gambar saja, tanpa jadwal")
    args = ap.parse_args()

    os.makedirs(OUT_DIR, exist_ok=True)
    st = load_state()

    if args.mulai:
        start = datetime.strptime(args.mulai, "%d/%m/%Y").replace(tzinfo=WIB)
    else:
        start = datetime.now(WIB) + timedelta(days=1)
        start = start.replace(hour=0, minute=0, second=0, microsecond=0)

    client = ReplizClient()
    ok = fail = 0
    print(f"📅 Jadwal {args.hari} hari mulai {start.strftime('%d/%m/%Y')} 17:00 WIB — IG The Skin Code Clinic")

    for i in range(args.hari):
        idx = (st["last_index"] + 1 + i) % len(CONTENT)
        item = CONTENT[idx]
        tgl = start + timedelta(days=i)
        schedule_at = f"{tgl.date().isoformat()}T17:00:00+07:00"

        # cek duplikasi tanggal di state
        if st.get("scheduled_until") and tgl.date().isoformat() <= st["scheduled_until"]:
            print(f"  ⏭️  {tgl.strftime('%d/%m/%Y')} sudah terjadwal, skip")
            continue

        print(f"  [{i+1}/{args.hari}] {tgl.strftime("%d/%m/%Y")} 17:00 WIB — {item['judul']}")
        img_path = generate_image(item, idx + 1)
        if args.dry:
            print(f"      🖼️  {img_path} (dry-run, tanpa jadwal)")
            ok += 1
            continue
        res = client.schedule_image(
            ACC.TSC_IG, item["caption"], schedule_at,
            img_path, filename=f"tsc_ig_{idx+1:02d}.png",
            title=item["judul"], topic="Skin Care",
        )
        if res and (res.get("ok") or res.get("scheduleId")):
            sid = res.get("scheduleId") or res.get("id") or res.get("data", {}).get("id")
            print(f"      ✅ ID: {sid}")
            ok += 1
            st["last_index"] = idx
            st["scheduled_until"] = tgl.date().isoformat()
            save_state(st)
            log(f"OK {tgl.isoformat()} 17:00 WIB | {item['judul']} | {img_path}")
        else:
            print(f"      ❌ {json.dumps(res)[:150]}")
            fail += 1

    print(f"\n📊 Total: {ok} OK, {fail} gagal")
    if fail:
        sys.exit(1)

if __name__ == "__main__":
    main()
