#!/usr/bin/env python3
"""Schedule FB DAS Bengkel Indonesia — 10 Sep 2026
Cron jalan ~17:02 WIB → slot 17:00 WIB sudah lewat → pakai slot KOSONG berikutnya: 20:00 WIB hari ini
(preseden schedule_das_fb_20260901..09.py + universal slot rule 7-slot).
Artikel: https://dasindonesia.com/servis-rutin-mobil-alphard-jadwal-lengkap-komponen-yang-dicek-dan-tips-dari-teknisi
- LIVE (HTTP 200, dicek 10 Sep 2026 via WP REST API + curl)
- BELUM pernah dipakai: hasil diff 205 artikel live vs 58 link terpakai (post_das_fb_history.json
  + seluruh jadwal akun DAS FB di Repliz SEMUA status) → 0 hit.
- Catatan: prompt menawarkan penyebab-mesin-mobil-overheat & kapan-mobil-perlu-engine-overhaul, tapi
  keduanya SUDAH terpakai (overhaul 8 Sep, overheat sudah) → pilih artikel lain yang live & bersih.
Format: image 1080x1350 (bg #1a1a2e, teks putih, aksen #f97316) + caption 3 paragraf + link + pancingan diskusi (netral).
Aturan DAS: NO harga/biaya/murah/mahal/hemat; positioning Amanah-Profesional-Melebihi Harapan; 0 mention internal.
"""
import json, os, re, sys, subprocess, time, urllib.request, urllib.error

from repliz_client import upload_image_to_server, HEADERS, BASE, ACC

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_20260910.png')
ARTICLE_URL = "https://dasindonesia.com/servis-rutin-mobil-alphard-jadwal-lengkap-komponen-yang-dicek-dan-tips-dari-teknisi"

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

CAPTION = """Alphard itu investasi besar, dan seperti investasi lain, dia butuh perawatan rutin yang konsisten. Sayangnya masih banyak pemilik yang menganggap servis rutin cukup dengan ganti oli di bengkel mana saja — padahal ada sederet komponen lain yang seharusnya ikut diperiksa.

Menurut teknisi spesialis kami, servis rutin Alphard itu bertingkat. Tiap 5.000-10.000 km: ganti oli mesin dan filter oli, cek coolant, rem, ban, plus pemeriksaan visual kelistrikan dan kebocoran. Masuk 20.000-40.000 km: filter udara mesin, filter kabin, sistem pendingin, aki, rotasi ban, sampai suspensi dan kemudi. Lalu di 40.000-60.000 km: ganti coolant, busi, sistem bahan bakar, dan oli transmisi otomatis. Banyak kasus overheat dan kerusakan transmisi di MPV premium justru berawal dari jadwal servis yang ditunda. Jadwal lengkap beserta tips dari teknisi sudah saya rangkum di artikel berikut: """ + ARTICLE_URL + """

Kapan terakhir kali Anda servis mobil? Rutin atau baru kalau ada masalah? Yuk diskusi 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') or '').rstrip('/') == article_url.rstrip('/'):
            return True
    return False


def scan_account(day):
    """Semua jadwal akun DAS FB: (pending hari ini), + set link yang pernah dipakai."""
    pend, used = [], set()
    page = 1
    while True:
        req = urllib.request.Request(f'{BASE}/public/schedule?page={page}&limit=100',
                                     headers=HEADERS, method='GET')
        with urllib.request.urlopen(req, timeout=40) as r:
            data = json.loads(r.read())
        for d in data.get('docs', []):
            if d.get('accountId') != FB_DAS_ID:
                continue
            for l in re.findall(r'https?://dasindonesia\.com[^\s]*', (d.get('description') or '')):
                used.add(l.rstrip('/'))
            if d.get('status') in ('pending', 'draft') and (d.get('scheduleAt') or '').startswith(day):
                pend.append((d.get('scheduleAt'), d.get('_id')))
        if page >= data.get('totalPages', 1):
            break
        page += 1
    return pend, used


def verify_caption(cap):
    banned = ['harga', 'biaya', 'murah', 'mahal', 'hemat', 'juta', 'rupiah']
    n_par = len(cap.split('\n\n'))
    checks = {
        '0 mention @': not re.search(r'@\w+', cap),
        'ada link dasindonesia (link == artikel)': ARTICLE_URL in cap,
        'ada ajakan diskusi': any(w in cap.lower() for w in ['komentar', 'diskusi', 'pendapat', 'menurut', 'cerita']),
        'tanpa kata harga/biaya': not any(w in cap.lower() for w in banned),
        'paragraf >= 2': n_par >= 2,
        'paragraf <= 4': n_par <= 4,
        'tidak ada hashtag huruf besar': not any(t != t.lower() for t in re.findall(r'#(\w+)', cap)),
    }
    for k, v in checks.items():
        print(f"   [{'✅' if v else '❌'}] {k}")
    print(f"   (paragraf: {n_par}, panjang caption: {len(cap)} char)")
    return all(checks.values())


def main():
    history = load_history()
    pend, used = scan_account(TGL)
    print(f"  DAS FB pending {TGL}: {pend if pend else 'TIDAK ADA'}")
    if pend:
        print("❌ Sudah ada jadwal DAS FB hari ini — batal, jangan double-book")
        sys.exit(1)

    if is_duplicate(history, ARTICLE_URL):
        print(f"❌ Artikel sudah pernah dipakai di history: {ARTICLE_URL}")
        sys.exit(1)
    if ARTICLE_URL.rstrip('/') in used:
        print(f"❌ Artikel sudah pernah dipakai di akun DAS FB (Repliz): {ARTICLE_URL}")
        sys.exit(1)
    print(f"✅ Artikel layak dipakai (0 hit history + 0 hit Repliz semua status, {len(used)} link terpakai): {ARTICLE_URL}")

    if not verify_caption(CAPTION):
        print("❌ Caption gagal verifikasi — batal")
        sys.exit(1)

    if not os.path.exists(IMG_PATH):
        print(f"❌ Gambar tidak ada: {IMG_PATH}")
        sys.exit(1)

    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)

    ok_ingress = False
    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}")
        if code == "200":
            ok_ingress = True
    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}")
    if not ok_ingress:
        print("❌ URL gambar tidak bisa diakses via ingress funnel — batal (Repliz ambil dari internet)")
        sys.exit(1)

    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: {TGL} {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, timeout=40) 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}")

        time.sleep(3)
        ver, _ = scan_account(TGL)
        print(f"   Verifikasi pending DAS FB {TGL}: {ver}")
        if not ver:
            print("❌ Tidak ketemu jadwal pending di API — cek manual, jangan catat history dulu")
            sys.exit(1)
        if len(ver) > 1:
            print(f"⚠️  Ada {len(ver)} pending hari ini — cek duplikat!")
        sid_verified = ver[0][1]
        if sid == '?':
            sid = sid_verified

        history['posts'].append({
            'date': TGL,
            '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'])}")
    except urllib.error.HTTPError as e:
        err = e.read().decode()
        print(f"❌ ERROR {e.code}: {err[:500]}")
        sys.exit(1)


if __name__ == '__main__':
    main()
