#!/usr/bin/env python3
"""DMark — Batch Schedule 10 Hari
Generate + upload + jadwalin 10 hari alternatif Tips/Agency
Jam tayang: 08:00 WIB (01:00 UTC)
"""

from PIL import Image, ImageDraw, ImageFont
import base64, json, os, random, urllib.request
from datetime import datetime, timezone, timedelta

from repliz_client import upload_image_to_server, HEADERS, ACC
ACCOUNT_ID = ACC.DMARK_IG
BASE_URL = 'https://api.repliz.com'


# WP Credentials untuk upload gambar
WP_URL = "https://www.otomasibisnispintar.com"
WP_AUTH = base64.b64encode(b"bambangbot:VvC3 wNRB GDGM Yywb Vr2h 8fFY").decode()
WP_HEADERS = {"Authorization": f"Basic {WP_AUTH}", "User-Agent": "Mozilla/5.0"}

def upload_to_wp(filepath, filename):
    """FIXED 21/08: semua image → server OpenClaw (mantapserver), NO WP, NO base64."""
    from repliz_client import upload_image_to_server
    return upload_image_to_server(filepath, filename)

FONT_DIR = os.path.expanduser("~/.fonts")

# BESOK = 29 Jun 2026 (Agency Orange, Ganjil)
# Pola: ganjil=Orange(Agency), genap=Putih(Tips)
START_DATE = datetime(2026, 6, 29, 1, 0, 0, tzinfo=timezone.utc)  # 08:00 WIB

TIPS_CAPTION = "Ingin bisnis Anda makin berkembang di era digital? 🚀\n\nKami sudah merangkum tips-tips digital marketing terbaru yang bisa langsung kamu terapkan. Dari SEO sampai ide konten kreatif, semuanya ada di sini!"
TIPS_HASHTAG = "#DigitalMarketing #TipsDigital #DMARK #SEO #KontenKreatif #BisnisOnline #StrategiDigital"

AGENCY_CAPTION = "Bingung mulai digital marketing untuk bisnis Anda? 🤔\n\nDMARK siap bantu! Dari strategi konten, iklan berbayar, hingga branding — semua terukur dan profesional.\n\nYuk, konsultasi gratis!"
AGENCY_HASHTAG = "#DMARK #DigitalMarketing #Branding #StrategiDigital #AgencyLife #BisnisOnline"

POOL_TIPS = [
    ("SEO Lokal", "Optimalkan Google My Business dan Google Maps untuk pelanggan di sekitar."),
    ("AI di SEO", "Manfaatkan AI untuk riset kata kunci dan optimasi konten otomatis."),
    ("Voice Search", "Optimasi konten untuk pencarian suara yang makin populer."),
    ("Featured Snippet", "Buat konten yang menjawab pertanyaan agar muncul di posisi nol Google."),
    ("SEO Konten", "Konten yang relevan dan panjang bikin website Anda naik peringkat."),
    ("Site Speed", "Website lemot bikin pengunjung kabur \u2014 percepat loading."),
    ("Mobile SEO", "Mayoritas pencarian dari HP \u2014 pastikan situs Anda mobile-friendly."),
    ("Konten UGC", "Repost konten pelanggan \u2014 autentik dan gratis."),
    ("Behind the Scene", "Tunjukin proses di balik bisnis \u2014 lebih manusiawi dan dekat."),
    ("Konten Edukasi", "Bikin konten yang ngajarin sesuatu \u2014 disimpan, dibagikan."),
    ("Storytelling Brand", "Cerita brand yang jujur lebih menarik dari iklan sempurna."),
    ("Day in the Life", "Perlihatkan keseharian tim \u2014 personal branding yang kuat."),
    ("Challenge & Quiz", "Libatkan audiens dengan challenge seru atau kuis interaktif."),
    ("Mini Series", "Buat konten berseri biar audiens nungguin terus."),
    ("Meme Marketing", "Humor relevan yang relate dengan target pasar \u2014 viral potensial."),
    ("Trend Audio", "Gunakan audio viral di Reels/TikTok untuk jangkauan lebih luas."),
    ("Tutorial Kilat", "Tips cepat 15-30 detik yang langsung bisa dipraktekkin."),
    ("Affiliate Marketing", "Jual lewat afiliasi \u2014 modal kecil, untung besar."),
    ("Dropship & Reseller", "Bisnis tanpa stok barang \u2014 cocok buat pemula."),
    ("Thrift & Pre-loved", "Bisnis barang second makin naik daun di kalangan muda."),
    ("F&B Digital", "UMKM kuliner wajib go digital \u2014 dari menu sampai promosi."),
    ("Jasa Digital", "Skill kayak desain, konten, dan admin jadi komoditas panas."),
    ("AI for Business", "Gunakan AI tools untuk otomatisasi kerja dan hemat waktu."),
    ("E-commerce Lokal", "Tokopedia, Shopee, TikTok Shop \u2014 kuasai semua kanal jualan."),
    ("Personal Branding", "Bangun personal brand biar orang percaya sama Anda."),
    ("Niche Market", "Fokus ke pasar spesifik \u2014 lebih mudah menang."),
    ("Side Hustle", "Bisnis sampingan dari HP \u2014 makin banyak yang sukses."),
    ("TikTok Shop", "Live streaming jualan lagi gencar \u2014 jangan dilewatkan."),
    ("Content Creator", "Kreator konten makin banyak, peluang kerja sama terbuka lebar."),
    ("Kolaborasi Brand", "Kerja sama dengan brand lain buat jangkau audiens baru."),
    ("Giveaway Strategis", "Giveaway yang terarah \u2014 bukan asal bagi-bagi."),
    ("Retargeting", "Kejar yang udah lihat produk tapi belum beli."),
    ("Waktu Posting", "Posting di jam sibuk audiens \u2014 engagement naik drastis."),
    ("Konsistensi", "Lebih baik rutin daripada viral sekali lalu hilang."),
    ("Bangun Komunitas", "Bukan cuma follower \u2014 tapi komunitas yang aktif dan setia."),
]

TIPS_TITLES = [
    "TIPS DIGITAL MARKETING", "AUDIENS DAN BRANDING", "SEO DAN KONTEN",
    "STRATEGI VISUAL", "IKLAN BERBAYAR", "EMAIL MARKETING",
    "DATA DAN ANALITIK", "KOLABORASI", "OPTIMALISASI", "LANGKAH KONKRIT",
]
TIPS_HASHTAGS = ["#TipsDigital #DMARK", "#RisetPasar #DMARK", "#SEO #DMARK",
    "#KontenKreatif #DMARK", "#PaidAds #DMARK", "#EmailMarketing #DMARK",
    "#DataDriven #DMARK", "#Influencer #DMARK", "#Growth #DMARK", "#DigitalMarketing #DMARK"]


def wrap(draw, text, font, max_w):
    lines = []
    for para in text.split("\n"):
        words = para.split()
        cur = ""
        for w in words:
            test = cur + " " + w if cur else w
            if draw.textbbox((0,0), test, font=font)[2] > max_w - 30 and cur:
                lines.append(cur)
                cur = w
            else:
                cur = test
        if cur: lines.append(cur)
    return lines


def gen_tips(out_dir):
    os.makedirs(out_dir, exist_ok=True)
    W, H = 1080, 1350
    BG, TXT = (255,255,255), (255,106,0)
    M_L, M_R, M_T, M_B = 90, 50, 50, 60
    M_CONTENT = M_L  # teks rata kiri
    MAX_W = W - M_L - M_R  # ~940
    NO = 80

    TITLE = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 85)
    BODY = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 32)
    BOLD22 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 22)
    REG20 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 20)
    REG22 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 22)
    NUM = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 44)
    SEMI = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-SemiBold.ttf"), 28)
    COVER = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 128)
    BODY_LS = 1.55  # line spacing factor
    TITLE_LS = 1.25

    def fh(drw, text, font):
        b = drw.textbbox((0,0), text, font=font)
        return b[3] - b[1]

    files = []

    def hdr(d, p):
        d.text((M_L, M_T), "DMARK", font=BOLD22, fill=TXT)
        d.text((W-M_R, M_T), p, font=REG22, fill=TXT, anchor="rt")
    def ftr(d, l="www.dmark.id", r=""):
        d.text((M_L, H-M_B), l, font=REG20, fill=TXT)
        if r: d.text((W-M_R, H-M_B), r, font=REG20, fill=TXT, anchor="rt")
    def d_title(drw, texts, sy, font=COVER, max_w=MAX_W, ls=TITLE_LS):
        all_l = []
        for t in texts:
            all_l.extend(wrap(drw, t, font, max_w))
        cy = sy
        for line in all_l:
            drw.text((M_CONTENT, cy), line, font=font, fill=TXT)
            cy += int(fh(drw, line, font) * ls)
        return cy
    def d_body(drw, text, sy, font=BODY, ls=BODY_LS):
        for line in wrap(drw, text, font, MAX_W):
            drw.text((M_CONTENT, sy), line, font=font, fill=TXT)
            sy += int(fh(drw, line, font) * ls)
        return sy

    def cy_from_total(drw, total_h):
        hdr_bot = M_T + fh(drw, "DMARK", BOLD22) + 15
        ftr_top = H - M_B - fh(drw, "www.dmark.id", REG20) - 15
        return hdr_bot + (ftr_top - hdr_bot - total_h) // 2

    img = Image.new("RGB", (W, H), BG)
    d = ImageDraw.Draw(img)
    hdr(d, "01/10")
    # Cover: hitung total height
    cover_lines = ["TIPS DIGITAL", "MARKETING"]
    cover_body = ["Ingin mengembangkan bisnis Anda di era digital?",
                  "Kami hadirkan tips digital marketing yang bisa",
                  "langsung Anda terapkan. Dari DMARK untuk Anda."]
    cover_h = 0
    for line in cover_lines:
        cover_h += int(fh(d, line, COVER) * 1.25)
    cover_h += 120  # gap ke body
    for line in cover_body:
        cover_h += int(fh(d, line, BODY) * 1.55)
    sy = cy_from_total(d, cover_h)
    cy = d_title(d, cover_lines, sy, COVER)
    cy += 120
    for line in cover_body:
        cy = d_body(d, line, cy)
    ftr(d, "www.dmark.id", "#TipsDigital #DMARK")
    fp = os.path.join(out_dir, "01_cover.png")
    img.save(fp)
    files.append(fp)

    used = set()
    random.seed()
    for i in range(2, 11):
        img = Image.new("RGB", (W, H), BG)
        d = ImageDraw.Draw(img)
        pg = f"{i:02d}/10"
        hdr(d, pg)

        # Hitung total height konten slide
        all_items = []
        avail = [t for t in POOL_TIPS if t[0] not in used]
        if len(avail) < 2:
            used.clear()
            avail = POOL_TIPS
        n = min(random.randint(2,4), len(avail))
        sel = random.sample(avail, n)
        for tt, td in sel:
            used.add(tt)
            all_items.append((tt, td))

        # Calculate content height
        content_h = 0
        # section title
        content_h += int(fh(d, TIPS_TITLES[i-2], TITLE) * 1.2)
        content_h += 100  # gap to items
        for tt, td in all_items:
            # number row (keeps same line as title)
            content_h += int(fh(d, tt, SEMI) * 1.3) + 10
            # body lines
            for bline in wrap(d, td, BODY, MAX_W):
                content_h += int(fh(d, bline, BODY) * 1.55)
            content_h += 30  # gap antar item

        sy = cy_from_total(d, content_h)
        cy = d_title(d, [TIPS_TITLES[i-2]], sy, TITLE, 1.2)
        cy += 100

        avail = [t for t in POOL_TIPS if t[0] not in used]
        if len(avail) < 2:
            used.clear()
            avail = POOL_TIPS
        n = min(random.randint(2,4), len(avail))
        sel = random.sample(avail, n)

        for idx, (tt, td) in enumerate(sel):
            used.add(tt)
            # Number
            d.text((M_CONTENT, cy+5), f"{idx+1:02d}", font=NUM, fill=TXT)
            # Title
            d.text((M_CONTENT+NO, cy+2), tt, font=SEMI, fill=TXT)
            cy += int(fh(d, tt, SEMI) * 1.3) + 10
            # Description
            cy = d_body(d, td, cy)
            # Gap antar item
            cy += 30

        ftr(d, "www.dmark.id", TIPS_HASHTAGS[i-2])
        fp = os.path.join(out_dir, f"slide_{i:02d}.png")
        img.save(fp)
        files.append(fp)
    return files


def gen_agency(out_dir):
    os.makedirs(out_dir, exist_ok=True)
    W, H = 1080, 1350
    BG, TXT = (249,115,22), (255,255,255)
    M = 65

    TITLE = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 120)
    BODY = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 40)
    BOLD24 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Bold.ttf"), 24)
    REG20 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 20)
    REG22 = ImageFont.truetype(os.path.join(FONT_DIR, "Poppins-Regular.ttf"), 22)

    files = []

    def _fh(drw, text, font):
        b = drw.textbbox((0,0), text, font=font)
        return b[3] - b[1]

    def wr(drw, text, font, max_w=920):
        lines = []
        for p in text.split("\n"):
            ws = p.split()
            cur = ""
            for w in ws:
                t = cur + " " + w if cur else w
                if drw.textbbox((0,0),t,font=font)[2] > max_w and cur:
                    lines.append(cur)
                    cur = w
                else:
                    cur = t
            if cur: lines.append(cur)
        return lines

    def dt(drw, texts, sy, font=TITLE, max_w=920, ls=1.35):
        all_l = []
        for t in texts: all_l.extend(wr(drw, t, font, max_w))
        cy = sy
        for line in all_l:
            drw.text((M, cy), line, font=font, fill=TXT)
            lh = drw.textbbox((0,0),line,font=font)[3] - drw.textbbox((0,0),line,font=font)[1]
            cy += int(lh*ls)
        return cy

    def db(drw, texts, sy, font=BODY, ls=1.6):
        all_l = []
        for t in texts: all_l.extend(wr(drw, t, font))
        cy = sy
        for line in all_l:
            drw.text((M, cy), line, font=font, fill=TXT)
            lh = drw.textbbox((0,0),line,font=font)[3] - drw.textbbox((0,0),line,font=font)[1]
            cy += int(lh*ls)
        return cy

    def hdr(drw, p):
        drw.text((M, S20), "DMARK", font=BOLD24, fill=TXT)
        drw.text((W-M, S20), p, font=REG22, fill=TXT, anchor="rt")
    def ftr(drw, l="www.dmark.id", r=""):
        drw.text((M, H-S20-5), l, font=REG20, fill=TXT)
        if r: drw.text((W-M, H-S20-5), r, font=REG20, fill=TXT, anchor="rt")
    def div_h():
        return 5  # divider line height
    def chk_h(drw, items):
        total = 0
        for item in items:
            total += int(_fh(drw, item, BODY) * 1.5)
        return total
    def chk(drw, items, sy):
        cy = sy
        for item in items:
            drw.text((M, cy), "\u2611", font=BODY, fill=TXT)
            drw.text((M+48, cy+2), item, font=BODY, fill=TXT)
            cy += int(_fh(drw, item, BODY) * 1.5)

    S20 = 20  # safe zone
    slides = [
        (["PILIH"], ["PLATFORM"], True, "#MediaSosial #DMARK", 
         ["IG: visual & storytelling", "LinkedIn: B2B & profesional", "TikTok: audiens muda & viral", "FB: jangkauan luas semua usia", "X: berita & opini"]),
        (["DMARK"], ["BUKAN SEKEDAR", "AGENCY"], False, "",
         ["Digital marketing agency yang fokus", "pada strategi terukur untuk bisnis", "Anda. Kreatif. Strategis. Profesional."]),
        (["MENGAPA"], ["DIGITAL", "MARKETING?"], False, "",
         ["Karena 90% konsumen mencari bisnis", "secara online sebelum membeli.", "Tanpa strategi digital yang tepat,", "Anda kehilangan peluang besar."]),
        (["APA YANG"], ["KAMI", "LAKUKAN?"], True, "#DMARK #DigitalMarketing",
         ["Strategi konten & SEO", "Iklan Google & Meta Ads", "Branding & desain visual", "Manajemen media sosial", "Analitik & optimalisasi"]),
        (["KENAPA"], ["MEMILIH", "DMARK?"], False, "",
         ["Kami tidak sekedar membuat konten.", "Kami merancang strategi yang", "berdampak pada pertumbuhan bisnis", "Anda. Terukur. Profesional."]),
        (["BRANDING"], ["YANG KUAT"], False, "",
         ["Merek yang kuat adalah aset", "paling berharga bisnis Anda.", "Kami bangun identitas visual yang", "konsisten dan mudah diingat."]),
        (["KONTEN"], ["BERKUALITAS"], False, "#DMARK #KontenKreatif",
         ["Konten yang relevan menarik audiens", "yang tepat. Artikel, video, dan desain", "yang informatif meningkatkan kepercayaan", "dan konversi bisnis Anda."]),
        (["BERDASARKAN"], ["DATA"], False, "",
         ["Setiap keputusan marketing harus", "berdasarkan data, bukan perasaan.", "Kami pantau, ukur, dan optimalkan", "setiap kampanye untuk hasil maksimal."]),
        (["SIAP"], ["TUMBUH?"], False, "#DMARK #Growth",
         ["Bersama DMARK, wujudkan pertumbuhan", "digital bisnis Anda. Strategi tepat,", "eksekusi profesional, hasil", "yang terukur."]),
        (["SIAP MULAI?"], ["KONSULTASI", "GRATIS"], False, "",
         ["Hubungi kami untuk diskusi strategi", "digital marketing bisnis Anda."]),
    ]

    for i, (l1, l2, is_check, htag, content) in enumerate(slides):
        img = Image.new("RGB", (W, H), BG)
        d = ImageDraw.Draw(img)
        hdr(d, f"{i+1:02d}/10")

        # Hitung total height konten
        total_h = 0
        # l1 titles
        for t in l1:
            total_h += int(_fh(d, t, TITLE) * 1.35)
        # divider gap
        total_h += 30 + div_h() + 25
        # l2 titles
        for t in l2:
            total_h += int(_fh(d, t, TITLE) * 1.35)
        # gap before content
        total_h += 60
        # content
        if is_check:
            total_h += chk_h(d, content)
        else:
            for line in content:
                total_h += int(_fh(d, line, BODY) * 1.6)

        # Header/footer area
        hdr_bot = S20 + _fh(d, "DMARK", BOLD24) + 15
        ftr_top = H - S20 - _fh(d, "www.dmark.id", REG20) - 15
        content_area = ftr_top - hdr_bot
        start_y = hdr_bot + (content_area - total_h) // 2

        # Render dari start_y
        ey = dt(d, l1, start_y)
        d.line([(M, ey+30), (M+280, ey+30)], fill=TXT, width=2)
        ey += 30 + 5 + 25
        if len(l2) == 1:
            ey = dt(d, l2, ey)
        else:
            ey = dt(d, [l2[0]], ey)
            ey = dt(d, l2[1:], ey)
        ey += 60
        if is_check:
            chk(d, content, ey)
        else:
            db(d, content, ey)
        ftr(d, "www.dmark.id", htag)

        fname = "01_cover.png" if i == 0 else f"slide_{i+1:02d}.png"
        fp = os.path.join(out_dir, fname)
        img.save(fp)
        files.append(fp)
    return files


def upload(files, schedule_utc, caption, hashtag):
    medias = []
    for fp in files:
        fname = os.path.basename(fp)
        # Upload ke WP dulu
        wp_url = upload_to_wp(fp, fname)
        if wp_url:
            medias.append({"url": wp_url, "type": "image", "alt": fname})
        else:
            # Upload ke server OpenClaw (FIX 21/08)
            img_url = upload_image_to_server(fp)
            # FIX 21/08: no base64 — image via server OpenClaw
            medias.append({"url": img_url, "type": "image", "alt": fname})

    payload = {
        "title": "", "description": f"{caption}\n\n{hashtag}",
        "topic": "Digital Marketing", "type": "album",
        "medias": medias,
        "meta": {"title":"","description":"","url":""},
        "additionalInfo": {"isAiGenerated":False,"isDraft":False,"collaborators":[],"mentions":[],
            "music":{"id":"","artist":"","name":"","thumbnail":""},"products":[],"tags":[]},
        "replies": [], "accountId": ACCOUNT_ID, "scheduleAt": schedule_utc,
    }

    body = json.dumps(payload).encode()
    req = urllib.request.Request(f"{BASE_URL}/public/schedule", data=body, headers=HEADERS, method="POST")
    try:
        with urllib.request.urlopen(req) as r:
            return json.loads(r.read()).get("scheduleId", "?")
    except urllib.error.HTTPError as e:
        print(f"  ERROR {e.code}: {e.read().decode()}")
        return None


# ===== MAIN =====
if __name__ == '__main__':
    BASE = os.path.expanduser("~/.openclaw/workspace-atun")
    results = []

    for day_off in range(10):
        dt = START_DATE + timedelta(days=day_off)
        utc = dt.strftime("%Y-%m-%dT%H:%M:%S.000Z")
        wib = dt + timedelta(hours=7)
        wib_d = wib.strftime("%d %b %Y")
        wib_t = wib.strftime("%H:%M WIB")

        is_tips = (dt.day % 2 == 0)
        variant = "TIPS (Putih)" if is_tips else "AGENCY (Orange)"

        print(f"\n{'='*60}")
        print(f"📅 {wib_d} {wib_t} — {variant}")

        out_dir = os.path.join(BASE, f"dmark_batch/{dt.strftime('%Y%m%d')}")
        if is_tips:
            files = gen_tips(out_dir)
            cap, tag = TIPS_CAPTION, TIPS_HASHTAG
        else:
            files = gen_agency(out_dir)
            cap, tag = AGENCY_CAPTION, AGENCY_HASHTAG

        print(f"  📂 {len(files)} files generated")
        sid = upload(files, utc, cap, tag)
        if sid:
            print(f"  ✅ Uploaded! ID: {sid}")
            results.append((wib_d, wib_t, variant, "✅", sid))
        else:
            print(f"  ❌ Upload failed!")
            results.append((wib_d, wib_t, variant, "❌", "-"))

    print(f"\n\n{'='*60}")
    print("📊 SCHEDULE 10 HARI DMARK")
    print(f"{'='*60}")
    for d, t, v, s, sid in results:
        print(f"  {d} {t:>8s} | {v:25s} | {s} {sid[:12] if sid != '-' else ''}")
    print(f"\n✅ {sum(1 for r in results if r[3]=='✅')}/{len(results)} sukses!")

