#!/usr/bin/env python3
"""Schedule FB DAS Bengkel Indonesia — 2 Sep 2026
Cron jalan ~17:01 WIB → slot 17:00 sudah lewat → pakai slot KOSONG berikutnya: 20:00 WIB hari ini
(preseden schedule_das_fb_20260901.py + universal slot rule: geser ke slot kosong berikutnya).
Artikel: https://dasindonesia.com/bengkel-fortuner-surabaya-servis-berkala/
- LIVE (HTTP 200), dari artikel-das-fortuner/ (folder artikel-das, sudah ter-publish)
- BELUM pernah dipakai: tidak ada di post_das_fb_history.json, riwayat Repliz DAS FB (64 sched), maupun DAS IG/Threads
Format: image 1080x1350 (bg #1a1a2e, teks putih, aksen #f97316) + caption 4 paragraf + link + pancingan diskusi (netral)
Aturan DAS: NO HARGA/biaya/murah/mahal/hemat; positioning Amanah-Profesional-Melebihi Harapan; wajib pancingan diskusi.
"""
import json, os, sys, urllib.request
from datetime import datetime, timezone, timedelta

from repliz_client import upload_image_to_server, HEADERS, BASE, ACC

WIB = timezone(timedelta(hours=7))
FB_DAS_ID = ACC.DAS_FB  # 6a3b41e1c5ff4ce3a327543e
LOG_FILE = os.path.join(os.path.dirname(__file__), 'post_das_fb_history.json')
IMG_PATH = os.path.join(os.path.dirname(__file__), 'das_fb_20260902.png')
ARTICLE_URL = "https://dasindonesia.com/bengkel-fortuner-surabaya-servis-berkala/"

# 17:00 WIB sudah lewat (cron jalan 17:01+ WIB) → slot kosong berikutnya hari ini = 20:00 WIB = 13:00 UTC
JAM_WIB = "20:00"
schedule_iso = "2026-09-02T13:00:00.000Z"

CAPTION = """Toyota Fortuner diesel itu tipe yang jarang rewel — tapi "jarang rewel" bukan alasan buat bolong jadwal servis. Mesin 2.4L dan 2.8L GD-6 yang bertenaga besar tetap butuh perawatan rutin yang konsisten, biar performanya stabil dan tidak tiba-tiba rewel di tengah perjalanan jauh.

Jadwalnya simpel: servis minor tiap 5.000\u201310.000 km buat ganti oli dan filter oli, plus cek cairan serta tekanan ban. Lalu servis mayor tiap 20.000\u201340.000 km mencakup filter udara, glow plug, sistem pendingin, sampai rem dan suspensi. Untuk varian diesel, pemeriksaan injektor dan tekanan kompresi mesin juga tidak boleh terlewat.

Yang sering terlambat disadari: begitu Fortuner mulai brebet saat digas, oli cepat berkurang, asap knalpot berubah kebiruan atau putih tebal, atau muncul suara knocking — itu alarm, bukan "wajar buat mobil tua". Kalau didiamkan, perbaikannya makin berat dan risikonya makin besar.

Panduan lengkap servis berkala Fortuner \u2014 jadwalnya, komponen yang dicek, sampai cara memilih bengkel Fortuner yang benar-benar spesialis \u2014 sudah kami rangkum di artikel ini: https://dasindonesia.com/bengkel-fortuner-surabaya-servis-berkala/

Kapan terakhir kali Fortuner Anda dapat servis berkala: rutin sesuai jadwal, atau baru ingat saat sudah ada gejala? Yuk cerita di kolom komentar."""


def load_history():
    if os.path.exists(LOG_FILE):
        with open(LOG_FILE) as f:
            return json.load(f)
    return {'posts': []}


def is_duplicate(history, article_url):
    for p in history['posts']:
        if p.get('article_url', '').rstrip('/') == article_url.rstrip('/'):
            return True
    return False


def main():
    history = load_history()

    # 1. Cek duplikat
    if is_duplicate(history, ARTICLE_URL):
        print(f"❌ DUPLICATE: {ARTICLE_URL} sudah pernah diposting")
        sys.exit(1)
    print(f"✅ Artikel belum pernah dipakai: {ARTICLE_URL}")

    # 2. Upload image ke server OpenClaw (konversi otomatis ke JPEG di openclaw-img/)
    img_url = upload_image_to_server(IMG_PATH)
    print(f"   Image URL: {img_url}")
    if not img_url:
        print("❌ Upload image gagal — batal")
        sys.exit(1)

    # 2b. Verifikasi URL via jalur INTERNET (ingress funnel), bukan tailnet lokal
    import subprocess
    for ip in ("103.84.155.153", "103.84.155.217"):
        code = subprocess.run(
            ["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "25",
             "--resolve", f"mantapserver.tail3947bb.ts.net:443:{ip}", img_url],
            capture_output=True, text=True).stdout
        print(f"   Ingress {ip}: HTTP {code}")
    code_local = subprocess.run(
        ["curl", "-s", "-o", "/dev/null", "-w", "%{http_code}", "--max-time", "15", img_url],
        capture_output=True, text=True).stdout
    print(f"   Local fetch: HTTP {code_local}")

    # 3. Payload — scheduleAt WAJIB UTC sungguhan (20:00 WIB = 13:00 UTC)
    payload = {
        'title': '',
        'description': CAPTION,
        'topic': 'Otomotif',
        'type': 'image',
        'medias': [{'url': img_url, 'type': 'image'}],
        'meta': {'title': '', 'description': '', 'url': ''},
        'additionalInfo': {
            'isAiGenerated': False, 'isDraft': False,
            'collaborators': [], 'mentions': [],
            'music': {'id': '', 'artist': '', 'name': '', 'thumbnail': ''},
            'products': [], 'tags': []
        },
        'replies': [],
        'accountId': FB_DAS_ID,
        'scheduleAt': schedule_iso,
    }
    print(f"   Schedule: 2 Sep 2026 {JAM_WIB} WIB ({schedule_iso})")

    body = json.dumps(payload).encode()
    req = urllib.request.Request(f'{BASE}/public/schedule', data=body, headers=HEADERS, method='POST')
    try:
        with urllib.request.urlopen(req) as r:
            result = json.loads(r.read())
            sid = result.get('scheduleId') or result.get('_id') or result.get('id') or '?'
            print(f"✅ SCHEDULED — Schedule ID: {sid}")

            # 4. Catat history
            history['posts'].append({
                'date': '2026-09-02',
                'time': JAM_WIB,
                'platform': 'facebook',
                'article_url': ARTICLE_URL,
                'short_desc': CAPTION.split('\n\n')[0][:100],
                'schedule_id': sid,
                'image_source': 'openclaw-img',
            })
            with open(LOG_FILE, 'w') as f:
                json.dump(history, f, indent=2)
            print(f"   History dicatat: {LOG_FILE}")
            print(f"   Total posts: {len(history['posts'])}")
            return sid
    except urllib.error.HTTPError as e:
        err = e.read().decode()
        print(f"❌ ERROR {e.code}: {err[:500]}")
        sys.exit(1)


if __name__ == '__main__':
    main()
