#!/usr/bin/env python3
"""Schedule 3 carousel albums at 12:05 WIB (05:05 UTC)."""
import base64, json, os, sys, urllib.request, urllib.error

from repliz_client import HEADERS, BASE_URL as BASE


SLOT = "2026-07-25T05:05:00.000Z"  # 12:05 WIB
CAR_DIR = "/home/mantapman/.hermes/profiles/atun/workspace/ai_overview_carousel"
FILES = ["01_cover.png","02_ai_overviews.png","03_seo_vs_geo.png","04_search_everywhere.png","05_langkah.png"]

# Build medias once
medias = []
for fname in FILES:
    fpath = os.path.join(CAR_DIR, fname)
    img_url = upload_image_to_server(fpath)
    # FIX 21/08: no base64 — image via server OpenClaw
    medias.append({
        "url": img_url,
        "type": "image",
        "alt": fname.replace(".png","").replace("_"," "),
    })

def api_call(method, endpoint, data=None):
    url = f"{BASE_URL}{endpoint}"
    body = json.dumps(data).encode() if data else None
    req = urllib.request.Request(url, data=body, headers=HEADERS, method=method)
    try:
        with urllib.request.urlopen(req) as resp:
            raw = resp.read()
            if resp.status == 204:
                return {"success": True}
            return json.loads(raw) if raw else {"success": True}
    except urllib.error.HTTPError as e:
        body = e.read().decode()
        return {"error": e.code, "body": json.loads(body) if body.startswith('{') else body[:500]}

def make_payload(account_id, caption, replies, link="", meta_title="", meta_desc=""):
    return {
        "title": "",
        "description": caption,
        "topic": "AI Overview, GEO, SEO, Search Everywhere",
        "type": "album",
        "medias": medias,
        "meta": {
            "title": meta_title,
            "description": meta_desc,
            "url": link,
        },
        "additionalInfo": {
            "isAiGenerated": False, "isDraft": False,
            "collaborators": [], "mentions": [],
            "music": {"id": "", "artist": "", "name": "", "thumbnail": ""},
            "products": [], "tags": [],
        },
        "replies": [{"text": r, "username": ""} for r in replies],
        "accountId": account_id,
        "scheduleAt": SLOT,
    }

# ── Account IDs ──
ACCOUNT_UKY = "6a334e89c5ff4ce3a3225a48"        # Threads @ukyhandoko
ACCOUNT_SS_THREADS = "6a335b9ec5ff4ce3a3225c2a" # Threads StudioSoft
ACCOUNT_SS_FB = "6a334952c5ff4ce3a3225941"      # FB StudioSoft

# ── Captions ──
uky_caption = (
    "AI Overviews mengubah cara orang search. Bukan 10 link biru lagi "
    "Google langsung kasih jawaban pakai AI.\n\n"
    "Ini yang bikin Search Everywhere Optimization penting. "
    "Brand harus muncul di Google, ChatGPT, YouTube, Reddit, "
    "Perplexity di semua tempat konsumen mencari.\n\n"
    "Slide by StudioSoft"
    "\nstudiosoft.id"
)
uky_replies = [
    "GEO beda sama SEO.\n\n"
    "SEO = ranking di Google.\nGEO = disebut di jawaban AI.\n\n"
    "Data: referral AI/LLM naik 800% dalam 3 bulan. "
    "Semrush prediksi LLM overtake Google akhir 2027.",

    "3 langkah:\n"
    "1. Audit di mana audiens mencari\n"
    "2. Optimasi managed (website, sosmed, GBP)\n"
    "3. Bangun influenced (review, forum, publikasi)\n\n"
    "Yang adaptasi sekarang, yang menang di 2027.",
]

ss_threads_caption = (
    "Google AI Overviews muncul di 16% pencarian naik dari 6,5% "
    "setahun lalu. Jutaan pencarian per bulan langsung dijawab AI "
    "tanpa klik ke website.\n\n"
    "Dampak buat bisnis? Traffic organik bisa turun drastis kalau "
    "cuma andalin SEO tradisional. Waktunya Search Everywhere "
    "Optimization.\n\n"
    "Slide by StudioSoft"
    "\nstudiosoft.id"
)
ss_threads_replies = [
    "SEO vs GEO:\n"
    "SEO keyword + backlink, ranking Google\n"
    "GEO konten informatif + otoritas pihak ketiga, disebut AI\n\n"
    "Neil Patel: SEO dulu soal ranking. Sekarang relevance & trust.",

    "Framework Search Everywhere:\n"
    "1. Audit platform audiens\n"
    "2. Optimasi managed experiences\n"
    "3. Bangun influenced experiences\n\n"
    "studiosoft.id",
]

fb_caption = (
    "Google AI Overviews sekarang muncul di 16% dari seluruh pencarian "
    "naik dari 6,5% setahun lalu. Jutaan pengguna mendapat jawaban "
    "langsung dari AI tanpa perlu klik ke website.\n\n"
    "Ini bukan akhir SEO, tapi evolusi ke Search Everywhere "
    "Optimization. Brand harus muncul di Google, ChatGPT, YouTube, "
    "Reddit, Perplexity dan platform lain.\n\n"
    "Data Backlinko: referral AI/LLM naik 800% dalam 3 bulan. "
    "ChatGPT 900 juta weekly users. Semrush prediksi LLM overtake "
    "Google akhir 2027.\n\n"
    "Kuncinya: konten informatif, otoritas pihak ketiga, "
    "dan teknis website yang rapi.\n\n"
    "https://studiosoft.id/6-tren-seo-2026-yang-wajib-dikuasai-pebisnis-malang/\n\n"
    "#SEO2026 #AIOverview #SearchEverywhere #DigitalMarketing #StudioSoft"
)
fb_replies = [
    "Apa beda SEO dan GEO?\n\n"
    "SEO: ranking Google (keyword + backlink).\n"
    "GEO: disebut jawaban AI (ChatGPT, Gemini, dll).\n\n"
    "Keduanya penting. AI 6,5x lebih sering mengutip brand "
    "dari sumber pihak ketiga daripada website sendiri.",

    "3 langkah Search Everywhere:\n\n"
    "1. Audit di mana audiens mencari\n"
    "2. Optimasi managed experiences (website, GBP, sosmed)\n"
    "3. Bangun influenced experiences (review, forum, publikasi)\n\n"
    "Siap mulai? StudioSoft bantu bisnis Anda."
    "\nhttps://studiosoft.id",
]

accounts = [
    ("Threads @ukyhandoko", ACCOUNT_UKY, uky_caption, uky_replies, "", "", ""),
    ("Threads StudioSoft", ACCOUNT_SS_THREADS, ss_threads_caption, ss_threads_replies, "", "", ""),
    ("FB StudioSoft", ACCOUNT_SS_FB, fb_caption, fb_replies,
     "https://studiosoft.id/6-tren-seo-2026-yang-wajib-dikuasai-pebisnis-malang/",
     "6 Tren SEO 2026", "AI Overview, GEO dan Search Everywhere Optimization"),
]

print("=" * 60)
print(f"SCHEDULE CAROUSEL ALBUM — 12:05 WIB")
print("=" * 60)

for label, aid, caption, replies, link, mt, md in accounts:
    payload = make_payload(aid, caption, replies, link, mt, md)
    result = api_call("POST", "/public/schedule", payload)
    if "error" in result:
        print(f"\n{label}: ERROR {result['error']} - {result.get('body','')}")
    else:
        print(f"\n{label}: ✅ {result.get('scheduleId','?')}")

print("\nDONE")

