#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Soto Semarang Pak Otto — IG Story + Feed Scheduler (klien baru 20/08/2026).
- Story: 1080×1920, type "story", 1×/hari jam 17:00 WIB
- Feed: 1080×1350, type "image", 1×/hari jam 17:05 WIB (setelah story)
- Caption humanis, humble, khas Suroboyoan, CTA 081230777713 + hashtags
- Mulai hari ini, 7 hari (default) — bisa --hari N / --mulai DD/MM/YYYY / --dry
- Gambar generate via PIL (Poppins), upload ke WP dulu (URL publik, bukan base64)

Akun: ACC.SOTO_IG = 6a86d6e962caae1e04ffedaa
"""
import json, os, sys
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, "soto_ig_images")
STATE_FILE = os.path.join(ROOT, "soto_ig_state.json")
LOG_FILE = os.path.join(ROOT, "soto_ig_log.txt")
FONT_BOLD = os.path.join(ROOT, "fonts", "Poppins-Bold.ttf")
FONT_REG = os.path.join(ROOT, "fonts", "Poppins-Regular.ttf")

STORY_W, STORY_H = 1080, 1920   # 9:16 story
FEED_W, FEED_H = 1080, 1350     # 4:5 feed
SAFE = 30

# ── Palette per topik (hangat, khas kuliner) ──
PALETTES = [
    ("#B45309", "#F59E0B"),  # Amber — kuah soto
    ("#9A3412", "#F97316"),  # Orange gelap — sate
    ("#7C2D12", "#EA580C"),  # Cokelat hangat — ayam kampung
    ("#14532D", "#22C55E"),  # Hijau — seledri/pelengkap
    ("#7C2D12", "#F59E0B"),  # Kuning keemasan — kaldu
    ("#9F1239", "#FB7185"),  # Merah muda — sambal
    ("#1E3A8A", "#60A5FA"),  # Biru — info/lokasi
]

# ── 7 KONTEN (unik) — story + feed pakai topik sama tapi desain beda ──
CONTENT = [
    {
        "judul": "SOTO AYAM KAMPUNG",
        "sub": "Kuah Bening Khas Semarang",
        "poin": ["Ayam kampung asli, empuk & gurih", "Kuah bening segar, gak bikin enek", "Soun, tauge & bawang goreng lengkap"],
        "feed_judul": "Soto Ayam Kampung",
        "feed_poin": ["Ayam kampung asli — empuk, gurih, juicy", "Kuah bening khas Semarang, segar & ringan", "Lengkap: soun, tauge, bawang goreng, jeruk nipis", "Cocok buat sarapan & makan siang"],
        "story_caption": "Soto Ayam Kampung Pak Otto 🍜\nKuah bening khas Semarang, ayam kampung empuk, lengkap dengan soun & tauge. Hangat, segar, bikin kenyang!\n\nMampir yuk, cak! 📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n\n📲 081230777713\n#SotoSemarangPakOtto #SotoAyamKampung #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Lagi cari yang seger-seger buat makan siang? 🥣\n\nSoto Ayam Kampung Pak Otto jawabannya! Kuah beningnya ringan tapi rempahnya berasa, ayam kampungnya empuk, plus soun, tauge & bawang goreng yang lengkap. Dijamin balikin mood kamu!\n\nPenasaran? Mampir langsung ke Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo (Selasa–Minggu 10.00–21.00 WIB).\n\n📲 081230777713\n\n#SotoSemarangPakOtto #SotoAyamKampung #KulinerSidoarjo #HiddenGemSidoarjo #SotoSemarang #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
    {
        "judul": "NASI GORENG BABAT & KULIT",
        "sub": "Spesial Favorit Pelanggan",
        "poin": ["Babat empuk, kulit kenyal", "Bumbu meresap, pedas bisa diatur", "Porsi pas, harga bersahabat"],
        "feed_judul": "Nasi Goreng Babat & Kulit",
        "feed_poin": ["Babat empuk gak amis, kulit kenyal", "Bumbu diracik pas — gurih & nendang", "Level pedas bisa disesuaikan", "Favorit pecinta jeroan se-Sidoarjo"],
        "story_caption": "Nasi Goreng Babat & Kulit 🍳\nBabatnya empuk, kulitnya kenyal, bumbunya meresap. Favorit pelanggan!\n\nMampir yuk, cak! 📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n\n📲 081230777713\n#NasiGorengBabat #KulinerSidoarjo #SotoSemarangPakOtto #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Pecinta jeroan merapat! 🍳\n\nNasi Goreng Babat & Kulit Pak Otto beda dari yang lain: babatnya empuk tanpa amis, kulitnya kenyal, dan bumbunya meresap sampai dalam. Mau level pedas berapa pun bisa diatur!\n\nYuk cobain langsung di Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo (Selasa–Minggu 10.00–21.00 WIB).\n\n📲 081230777713\n\n#NasiGorengBabat #NasiGorengKulit #KulinerSidoarjo #SotoSemarangPakOtto #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
    {
        "judul": "SATE KERANG",
        "sub": "Juara & Bikin Nagih",
        "poin": ["Kerang fresh, gak amis", "Bakar pas, bumbu kecap meresap", "Wajib coba sekali seumur hidup"],
        "feed_judul": "Sate Kerang Juara",
        "feed_poin": ["Kerang segar pilihan, gak amis", "Dibakar pas dengan bumbu kecap manis-gurih", "Tekstur kenyal, rasa juara", "Pendamping soto yang gak boleh dilewatkan"],
        "story_caption": "Sate Kerang Pak Otto 🦪\nFresh, gak amis, bumbu kecapnya meresap. Wajib coba!\n\nMampir yuk, cak! 📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n\n📲 081230777713\n#SateKerang #KulinerSidoarjo #SotoSemarangPakOtto #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Sate kerang juara ada di Sidoarjo! 🦪\n\nBuat yang belum pernah coba sate kerang — ini saatnya. Kerangnya segar, gak amis, dibakar dengan bumbu kecap yang meresap. Dijamin nagih dan bikin pengen nambah terus!\n\nMampir di Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo (Selasa–Minggu 10.00–21.00 WIB).\n\n📲 081230777713\n\n#SateKerang #KulinerSidoarjo #HiddenGemSidoarjo #SotoSemarangPakOtto #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
    {
        "judul": "HIDDEN GEM SIDOARJO",
        "sub": "Soto Semarang Asli",
        "poin": ["Soto Semarang otentik di Sidoarjo", "Udah direview banyak food vlogger", "Harga bersahabat, rasa juara"],
        "feed_judul": "Hidden Gem Sidoarjo",
        "feed_poin": ["Soto Semarang otentik di tengah Sidoarjo", "Dikunjungi & direview banyak food vlogger", "Harga ramah di kantong, rasa gak ngecewain", "Lokasi strategis di Ruko Graha Anggrek Mas"],
        "story_caption": "Hidden gem Sidoarjo 🤫\nSoto Semarang asli udah ada di Sidoarjo — banyak food vlogger yang mampir!\n\nMampir yuk, cak! 📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n\n📲 081230777713\n#HiddenGemSidoarjo #SotoSemarangPakOtto #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Jarang yang tau — Soto Semarang Pak Otto itu hidden gem Sidoarjo! 🤫\n\nSoto Semarang asli dengan ayam kampung, kuah bening, dan sate kerang juara. Udah banyak food vlogger yang mampir & kasih review positif. Harga bersahabat, rasa gak ngecewain!\n\nLokasi: Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo (Selasa–Minggu 10.00–21.00 WIB).\n\n📲 081230777713\n\n#HiddenGemSidoarjo #SotoSemarangPakOtto #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
    {
        "judul": "INFO LOKASI & JAM BUKA",
        "sub": "Gampang Dicari, Parkir Mudah",
        "poin": ["Jl. Graha Anggrek Mas No. C-16, Pagerwojo", "Selasa–Minggu 10.00–21.00 WIB", "Senin tutup — jangan sampai kecewa"],
        "feed_judul": "Lokasi & Jam Buka",
        "feed_poin": ["📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo", "⏰ Selasa–Minggu: 10.00–21.00 WIB", "❌ Senin tutup (istirahat dapur 😄)", "Parkir luas, gampang dicari"],
        "story_caption": "Info lokasi Pak Otto 📍\nJl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\nBuka Selasa–Minggu 10.00–21.00 WIB (Senin tutup)\n\n📲 081230777713\n#SotoSemarangPakOtto #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Simpan info ini, cak! 📍\n\nBiar gak nyasar, catat lokasi Soto Semarang Pak Otto:\n\n📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n⏰ Selasa–Minggu: 10.00–21.00 WIB\n❌ Senin tutup\n\nParkirnya luas, gampang dicari, di area ruko yang strategis. Yuk mampir!\n\n📲 Mau tanya-tanya dulu? 📲 081230777713\n\n#SotoSemarangPakOtto #KulinerSidoarjo #InfoLokasi #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
    {
        "judul": "AYAM KAMPUNG ASLI",
        "sub": "Fresh Setiap Hari",
        "poin": ["Ayam kampung pilihan, bukan negeri", "Dimasak fresh tiap hari", "Tekstur kenyal & gurih alami"],
        "feed_judul": "Ayam Kampung Asli",
        "feed_poin": ["100% ayam kampung, bukan ayam negeri", "Fresh, dimasak setiap hari", "Tekstur kenyal, gurih alami tanpa MSG berlebih", "Kuah lebih ringan & sehat"],
        "story_caption": "Ayam kampung asli, fresh tiap hari 🐔\nTekstur kenyal, gurih alami — beda sama ayam negeri!\n\nMampir yuk, cak! 📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n\n📲 081230777713\n#AyamKampung #SotoSemarangPakOtto #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Kenapa soto kami beda? Karena pakai ayam kampung asli! 🐔\n\nAyam kampung punya tekstur lebih kenyal dan rasa lebih gurih alami dibanding ayam negeri. Kami masak fresh setiap hari — gak ada cerita masak seminggu sekali!\n\nHasilnya: kuah lebih ringan, rasanya lebih otentik. Yuk buktikan sendiri!\n\n📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo (Selasa–Minggu 10.00–21.00 WIB)\n\n📲 081230777713\n\n#AyamKampung #SotoSemarangPakOtto #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
    {
        "judul": "TERIMA KASIH 🙏",
        "sub": "Dukungan Kalian Berarti",
        "poin": ["Makasih buat semua pelanggan setia", "Kami terus belajar & berkembang", "Sampai ketemu di mangkuk soto berikutnya"],
        "feed_judul": "Terima Kasih, Sidoarjo!",
        "feed_poin": ["Terima kasih buat semua yang udah mampir 🙏", "Dukungan kalian bikin kami semangat", "Masukan selalu kami dengar", "Sampai ketemu di mangkuk soto berikutnya 🍜"],
        "story_caption": "Terima kasih, cak & mbak! 🙏\nBuat semua yang udah mampir ke Pak Otto — kalian luar biasa!\n\nSampai ketemu lagi ya! 📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo\n\n📲 081230777713\n#SotoSemarangPakOtto #KulinerSidoarjo #kulinermalamsidoarjo #kulinermurahsidoarjo",
        "feed_caption": "Terima kasih buat semua yang udah mampir ke Soto Semarang Pak Otto! 🙏\n\nKami masih baru, tapi dukungan kalian luar biasa. Setiap mangkuk yang habis, setiap senyum pelanggan — itu yang bikin kami makin semangat masak dengan sepenuh hati.\n\nKalau ada masukan, jangan ragu bilang ya. Kami pasti dengar! 😊\n\n📍 Jl. Graha Anggrek Mas No. C-16, Ruko Pagerwojo, Buduran, Sidoarjo (Selasa–Minggu 10.00–21.00 WIB)\n\n📲 081230777713\n\n#SotoSemarangPakOtto #KulinerSidoarjo #TerimaKasih #kulinermalamsidoarjo #kulinermurahsidoarjo",
    },
]


def hex2rgb(h):
    h = h.lstrip("#")
    return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))


def draw_gradient(draw, w, h, c1, c2):
    top, bot = hex2rgb(c1), hex2rgb(c2)
    for y in range(h):
        t = y / max(h - 1, 1)
        col = tuple(int(top[i] + (bot[i] - top[i]) * t) for i in range(3))
        draw.line([(0, y), (w, y)], fill=col)


def text_wrap(draw, text, font, max_w):
    words = text.split()
    lines, cur = [], ""
    for wd in words:
        test = (cur + " " + wd).strip()
        if draw.textlength(test, font=font) <= max_w:
            cur = test
        else:
            if cur:
                lines.append(cur)
            cur = wd
    if cur:
        lines.append(cur)
    return lines


def render_story(item, idx, pal):
    img = Image.new("RGB", (STORY_W, STORY_H))
    draw = ImageDraw.Draw(img)
    draw_gradient(draw, STORY_W, STORY_H, pal[0], pal[1])

    # Header
    f_h = ImageFont.truetype(FONT_BOLD, 34)
    draw.text((SAFE, SAFE), "SOTO SEMARANG", font=f_h, fill=(255, 255, 255))
    draw.text((SAFE, SAFE + 44), "PAK OTTO 🍜", font=f_h, fill=(255, 255, 255))

    # Page number
    draw.text((STORY_W - SAFE - 60, SAFE), f"{idx+1}/7", font=f_h, fill=(255, 255, 255))

    # Judul besar — tengah
    f_title = ImageFont.truetype(FONT_BOLD, 95)
    title_lines = text_wrap(draw, item["judul"], f_title, STORY_W - 2 * SAFE)
    f_sub = ImageFont.truetype(FONT_REG, 48)
    f_poin = ImageFont.truetype(FONT_REG, 42)
    f_foot = ImageFont.truetype(FONT_REG, 30)

    # Ukur total tinggi konten
    th = sum(draw.textlength(l, font=f_title) and 1 for l in title_lines) * 0  # placeholder
    total_h = 0
    for l in title_lines:
        total_h += 100
    total_h += 60 + 60  # sub + jarak
    sub_lines = text_wrap(draw, item["sub"], f_sub, STORY_W - 2 * SAFE)
    total_h += len(sub_lines) * 58
    total_h += 50
    for p in item["poin"]:
        pl = text_wrap(draw, p, f_poin, STORY_W - 2 * SAFE - 70)
        total_h += len(pl) * 52
    total_h += 60

    y = max((STORY_H - total_h) // 2, 300)
    for l in title_lines:
        draw.text((SAFE, y), l, font=f_title, fill=(255, 255, 255))
        y += 100
    y += 30
    for l in sub_lines:
        draw.text((SAFE, y), l, font=f_sub, fill=(255, 235, 200))
        y += 58
    y += 30
    for p in item["poin"]:
        pl = text_wrap(draw, p, f_poin, STORY_W - 2 * SAFE - 70)
        draw.text((SAFE, y), "☑", font=f_poin, fill=(255, 255, 255))
        yy = y
        for l in pl:
            draw.text((SAFE + 70, yy), l, font=f_poin, fill=(255, 255, 255))
            yy += 52
        y = yy + 8

    # Footer
    y_foot = STORY_H - SAFE - 90
    draw.text((SAFE, y_foot), "Jl. Graha Anggrek Mas No. C-16, Pagerwojo, Sidoarjo", font=f_foot, fill=(255, 255, 255))
    draw.text((SAFE, y_foot + 38), "Selasa–Minggu 10.00–21.00 WIB", font=f_foot, fill=(255, 235, 200))
    draw.text((SAFE, y_foot + 76), "📲 081230777713", font=f_foot, fill=(255, 255, 255))
    draw.text((STORY_W - SAFE - 260, y_foot + 76), "#SotoSemarangPakOtto", font=ImageFont.truetype(FONT_REG, 26), fill=(255, 235, 200))

    return img


def render_feed(item, idx, pal):
    img = Image.new("RGB", (FEED_W, FEED_H))
    draw = ImageDraw.Draw(img)
    draw_gradient(draw, FEED_W, FEED_H, pal[0], pal[1])

    f_header = ImageFont.truetype(FONT_BOLD, 32)
    f_title = ImageFont.truetype(FONT_BOLD, 80)
    f_body = ImageFont.truetype(FONT_REG, 38)
    f_foot = ImageFont.truetype(FONT_REG, 28)

    # Header
    draw.text((SAFE, SAFE), "SOTO SEMARANG PAK OTTO", font=f_header, fill=(255, 255, 255))
    draw.text((FEED_W - SAFE - 80, SAFE), f"{idx+1}/7", font=f_header, fill=(255, 255, 255))

    # Judul
    y = 180
    tl = text_wrap(draw, item["feed_judul"], f_title, FEED_W - 2 * SAFE)
    for l in tl:
        draw.text((SAFE, y), l, font=f_title, fill=(255, 255, 255))
        y += 92
    y += 20

    # Divider putus-putus
    x = SAFE
    while x < FEED_W - SAFE:
        draw.line([(x, y), (x + 16, y)], fill=(255, 255, 255), width=3)
        x += 26
    y += 40

    # Poin
    for p in item["feed_poin"]:
        pl = text_wrap(draw, p, f_body, FEED_W - 2 * SAFE - 70)
        draw.text((SAFE, y), "☑", font=f_body, fill=(255, 255, 255))
        yy = y
        for l in pl:
            draw.text((SAFE + 70, yy), l, font=f_body, fill=(255, 255, 255))
            yy += 50
        y = yy + 14

    # Footer
    y_foot = FEED_H - SAFE - 80
    draw.text((SAFE, y_foot), "📍 Graha Anggrek Mas C-16, Pagerwojo, Sidoarjo", font=f_foot, fill=(255, 255, 255))
    draw.text((SAFE, y_foot + 36), "⏰ Selasa–Minggu 10.00–21.00 WIB", font=f_foot, fill=(255, 235, 200))
    draw.text((SAFE, y_foot + 72), "📲 081230777713", font=f_foot, fill=(255, 255, 255))
    draw.text((FEED_W - SAFE - 300, y_foot + 72), "#SotoSemarangPakOtto", font=ImageFont.truetype(FONT_REG, 24), fill=(255, 235, 200))

    return img


def main():
    import argparse
    ap = argparse.ArgumentParser()
    ap.add_argument("--hari", type=int, default=7)
    ap.add_argument("--mulai", default=None, help="DD/MM/YYYY")
    ap.add_argument("--dry", action="store_true")
    args = ap.parse_args()

    os.makedirs(OUT_DIR, exist_ok=True)
    client = ReplizClient()

    start = datetime.now(WIB).date()
    if args.mulai:
        start = datetime.strptime(args.mulai, "%d/%m/%Y").date()

    state = {}
    if os.path.exists(STATE_FILE):
        try:
            state = json.load(open(STATE_FILE))
        except Exception:
            state = {}

    # Cek jadwal yang sudah ada (anti dobel): cek state sampai tanggal berapa
    last_date = state.get("scheduled_until")
    if last_date:
        last_dt = datetime.strptime(last_date, "%Y-%m-%d").date()
        if start <= last_dt:
            start = last_dt + timedelta(days=1)
            print(f"⚠️ Jadwal sudah ada sampai {last_date} — mulai dari {start}")

    print(f"📅 Jadwal {args.hari} hari mulai {start.strftime('%d/%m/%Y')} — IG Soto Semarang Pak Otto")
    ok = fail = 0
    used_idx = state.get("last_index", -1)

    for i in range(args.hari):
        tgl = start + timedelta(days=i)
        idx = (used_idx + 1 + i) % len(CONTENT)
        item = CONTENT[idx]
        pal = PALETTES[idx % len(PALETTES)]

        story_path = os.path.join(OUT_DIR, f"soto_story_{idx+1:02d}.png")
        feed_path = os.path.join(OUT_DIR, f"soto_feed_{idx+1:02d}.png")

        # Generate
        render_story(item, idx, pal).save(story_path)
        render_feed(item, idx, pal).save(feed_path)
        print(f"  [{i+1}/{args.hari}] {tgl.strftime('%d/%m/%Y')} — {item['judul']}")

        if args.dry:
            print(f"      🖼️ DRY: {story_path}, {feed_path}")
            continue

        # Story 17:00 WIB
        res_s = client.schedule_image(
            ACC.SOTO_IG, item["story_caption"], f"{tgl.isoformat()}T17:00:00+07:00",
            story_path, filename=f"soto_story_{idx+1:02d}.png",
            title="Soto Story", topic="Story")
        sid_s = res_s.get("scheduleId") if res_s and (res_s.get("ok") or res_s.get("scheduleId")) else None
        if sid_s:
            print(f"      ✅ Story 17:00 → {sid_s}")
        else:
            print(f"      ❌ Story: {str(res_s)[:120]}")
            fail += 1

        # Feed 17:05 WIB
        res_f = client.schedule_image(
            ACC.SOTO_IG, item["feed_caption"], f"{tgl.isoformat()}T17:05:00+07:00",
            feed_path, filename=f"soto_feed_{idx+1:02d}.png",
            title="Soto Feed", topic="Feed")
        sid_f = res_f.get("scheduleId") if res_f and (res_f.get("ok") or res_f.get("scheduleId")) else None
        if sid_f:
            print(f"      ✅ Feed 17:05 → {sid_f}")
        else:
            print(f"      ❌ Feed: {str(res_f)[:120]}")
            fail += 1

        if sid_s and sid_f:
            ok += 1

    # Simpan state
    state["last_index"] = (used_idx + args.hari) % len(CONTENT)
    state["scheduled_until"] = (start + timedelta(days=args.hari - 1)).isoformat()
    state["updated"] = datetime.now(WIB).isoformat()
    json.dump(state, open(STATE_FILE, "w"), indent=2)

    print(f"\n📊 Total: {ok} hari OK, {fail} gagal")
    print(f"💾 State: {STATE_FILE}")


if __name__ == "__main__":
    main()
