#!/usr/bin/env python3
"""Schedule AI Overview carousel to Threads @ukyhandoko & StudioSoft."""
import base64, json, os, sys, urllib.request, urllib.error

from repliz_client import HEADERS, BASE_URL as BASE


ACCOUNT_UKY = "6a334e89c5ff4ce3a3225a48"        # @ukyhandoko Threads
ACCOUNT_STUDIOSOFT = "6a335b9ec5ff4ce3a3225c2a" # StudioSoft Threads

SLOT = "2026-07-25T07:00:00.000Z"  # 14:00 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"]

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_carousel(images, caption, replies, account_id):
    medias = []
    for fname in images:
        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("_"," "),
        })
    
    payload = {
        "title": "",
        "description": caption,
        "topic": "AI Overview, GEO, SEO, Search Everywhere",
        "type": "album",
        "medias": medias,
        "meta": {"title": "", "description": "", "url": ""},
        "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,
    }
    return payload

# ── Captions ──

uky_caption = (
    "AI Overviews udah mengubah cara orang search. "
    "Bukan cuma 10 link biru lagi \u2014 Google langsung kasih jawaban pakai AI.\n\n"
    "Ini yang bikin Search Everywhere Optimization penting. "
    "Brand harus muncul di Google, ChatGPT, YouTube, Reddit, "
    "Perplexity \u2014 di semua tempat konsumen mencari.\n\n"
    "Slide by StudioSoft \u2014 Partner Pertumbuhan Bisnis Berbasis Data"
    "\nstudiosoft.id"
)

uky_replies = [
    "Generative Engine Optimization (GEO) beda sama SEO.\n\n"
    "SEO = ranking di Google.\n"
    "GEO = disebut di jawaban AI.\n\n"
    "Data Backlinko: referral AI/LLM naik 800% dalam 3 bulan. "
    "Semrush: LLM overtake Google akhir 2027.",

    "3 langkah mulai:\n"
    "1. Audit di mana audiens mencari\n"
    "2. Optimasi managed (website, sosmed, GBP)\n"
    "3. Bangun influenced (review, forum, publikasi)\n\n"
    "AI 6,5x lebih sering mengutip brand dari pihak ketiga. "
    "Adaptasi sekarang atau ketinggalan.",
]

ss_caption = (
    "Google AI Overviews muncul di 16% pencarian \u2014 naik drastis "
    "dari 6,5% setahun lalu. Jutaan pencarian per bulan "
    "jawabannya langsung dikasih AI tanpa klik.\n\n"
    "Dampak buat bisnis? Traffic organik bisa turun kalau "
    "cuma andalin SEO tradisional. Waktunya beralih ke "
    "Search Everywhere Optimization.\n\n"
    "Slide by StudioSoft"
    "\nstudiosoft.id"
)

ss_replies = [
    "SEO vs GEO:\n"
    "SEO \u2192 ranking keyword, backlink, Google SERP\n"
    "GEO \u2192 konten informatif, otoritas pihak ketiga, disebut AI\n\n"
    "Keduanya penting. Neil Patel: \u201cSEO dulu soal ranking. "
    "Sekarang soal relevance dan trust di tiap platform.\u201d",

    "Framework Search Everywhere:\n"
    "1. Audit platform audiens\n"
    "2. Optimasi managed experiences\n"
    "3. Bangun influenced experiences\n\n"
    "Yang adaptasi sekarang, yang menang di 2027.\n\n"
    "studiosoft.id",
]

print("=" * 60)
print("CAROUSEL AI OVERVIEW \u2014 THREADS")
print(f"Schedule: {SLOT} (14:00 WIB)")
print("=" * 60)

print("\n@ukyhandoko:")
p1 = make_carousel(FILES, uky_caption, uky_replies, ACCOUNT_UKY)
r1 = api_call("POST", "/public/schedule", p1)
if "error" in r1:
    print(f"  ERROR: {r1['error']} - {r1.get('body','')}")
else:
    print(f"  SUCCESS! ID: {r1.get('scheduleId','?')}")

print("\nStudioSoft:")
p2 = make_carousel(FILES, ss_caption, ss_replies, ACCOUNT_STUDIOSOFT)
r2 = api_call("POST", "/public/schedule", p2)
if "error" in r2:
    print(f"  ERROR: {r2['error']} - {r2.get('body','')}")
else:
    print(f"  SUCCESS! ID: {r2.get('scheduleId','?')}")

print("\nDONE")

