#!/usr/bin/env python3
"""DAS Short Daily — share 1 video short DAS per hari ke Threads + FB + LinkedIn DAS.
Caption mengajak diskusi, konten UNIK (tidak pernah dipakai sebelumnya).
"""
import json, os, sys, random, re
from datetime import datetime, timedelta, timezone

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from repliz_client import ReplizClient, ACC

WIB = timezone(timedelta(hours=7))
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
POOL_FILE = os.path.join(BASE_DIR, 'das_shorts_pool.json')
HIST_FILE = os.path.join(BASE_DIR, 'das_short_daily_history.json')

# ── Akun DAS ──
DAS_THREADS = ACC.DAS_THREADS          # 6a39e461c5ff4ce3a3233e09
DAS_FB = ACC.DAS_FB                    # 6a3b41e1c5ff4ce3a327543e
DAS_LINKEDIN = None                    # TODO: isi ID akun LinkedIn DAS kalau sudah connect

# ── Jam posting (WIB) ──
LINKEDIN_TIME = "17:00"
THREADS_TIME = "17:10"
FB_TIME = "17:20"

# ── Template pertanyaan diskusi per topik ──
QUESTIONS = {
    "overhaul": [
        "Kalau mobil Anda sudah harus turun mesin, apa pertimbangan utama sebelum memutuskan overhaul?",
        "Menurut Anda, kapan waktu yang tepat sebuah mobil harus di-overhaul — dan kapan sebaiknya ganti mobil saja?",
        "Pernah mengalami mobil yang harus di-overhaul? Ceritakan pengalaman Anda di kolom komentar.",
        "Setuju nggak kalau overhaul yang benar itu bukan sekadar bongkar pasang, tapi soal pengukuran presisi?",
    ],
    "bbm": [
        "Mobil Anda termasuk boros atau irit? Tips apa yang paling ampuh menurut Anda untuk hemat BBM?",
        "Menurut Anda, apa penyebab paling umum mobil tiba-tiba boros bensin?",
        "Punya pengalaman mobil boros yang ternyata penyebabnya sepele? Yuk share di komentar.",
    ],
    "liburan": [
        "Sebelum perjalanan jauh, apa saja yang selalu Anda cek di mobil?",
        "Pernah hampir mogok di tengah perjalanan? Apa yang Anda lakukan saat itu?",
        "Menurut Anda, komponen apa yang paling sering dilupakan saat persiapan mudik?",
    ],
    "mobil_mewah": [
        "Menurut Anda, apa yang paling penting dalam merawat mobil mewah agar nilainya tidak turun drastis?",
        "Punya pengalaman merawat mobil premium? Bagian apa yang paling sering bikin pusing?",
        "Setuju nggak kalau mobil mewah butuh penanganan yang berbeda dari mobil biasa?",
    ],
    "testdrive": [
        "Setelah perbaikan besar, apakah Anda selalu minta test drive dulu sebelum menerima mobil?",
        "Menurut Anda, apa yang paling penting diperhatikan saat test drive mobil bekas?",
        "Pernah test drive mobil yang hasil perbaikannya bikin kaget? Ceritakan!",
    ],
    "ev": [
        "Menurut Anda, apakah mobil listrik juga butuh bengkel khusus seperti mobil konvensional?",
        "Tertarik beralih ke mobil listrik? Apa kekhawatiran terbesar Anda?",
    ],
    "kegiatan": [
        "Menurut Anda, apa yang membuat sebuah bengkel layak dipercaya untuk mobil kesayangan?",
        "Kalau boleh jujur, apa hal pertama yang Anda perhatikan saat masuk ke sebuah bengkel?",
        "Pernah punya pengalaman buruk di bengkel? Ceritakan biar jadi pelajaran bersama.",
    ],
}

# ── Hook pembuka per topik ──
HOOKS = {
    "overhaul": "Ada cerita menarik dari bengkel kami: proses overhaul dikerjakan tuntas — bukan sekadar bongkar pasang.",
    "bbm": "BBM boros itu bukan takdir. Banyak kasus yang kami tangani ternyata penyebabnya sederhana dan bisa dicek.",
    "liburan": "Sebelum perjalanan jauh, ada beberapa hal yang wajib dicek supaya tidak mogok di tengah jalan.",
    "mobil_mewah": "Mobil mewah butuh perhatian ekstra — dan itu bukan soal gengsi, tapi soal cara kerja teknologinya.",
    "testdrive": "Hasil kerja bengkel tidak cukup dibuktikan di atas kertas — harus dirasakan langsung saat berkendara.",
    "ev": "Mobil listrik punya tantangan tersendiri — termasuk soal kelistrikan yang butuh penanganan khusus.",
    "kegiatan": "Ini sekilas aktivitas di bengkel kami hari ini. Setiap mobil yang masuk punya cerita dan tantangannya sendiri.",
}

def detect_topic(title: str) -> str:
    t = title.lower()
    if any(k in t for k in ['overhaul', 'turun mesin', 'engine', 'mesin']):
        return "overhaul"
    if any(k in t for k in ['bbm', 'boros', 'bensin', 'hemat', 'fuel']):
        return "bbm"
    if any(k in t for k in ['liburan', 'mogok', 'checklist', 'trip', 'holiday']):
        return "liburan"
    if any(k in t for k in ['luxury', 'bmw', 'mercedes', 'lexus', 'range rover', 'alphard', 'land cruiser', 'pajero', 'mobil mewah']):
        return "mobil_mewah"
    if any(k in t for k in ['test drive', 'testdrive']):
        return "testdrive"
    if any(k in t for k in ['ev', 'electric', 'hummer', 'listrik']):
        return "ev"
    return "kegiatan"

def load_pool():
    with open(POOL_FILE) as f:
        return json.load(f)['shorts']

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

def save_hist(h):
    with open(HIST_FILE, 'w') as f:
        json.dump(h, f, indent=2, ensure_ascii=False)

def pick_next(pool, hist):
    used = {p['video_id'] for p in hist['posts']}
    for s in pool:
        if s['id'] not in used:
            return s
    return None

def build_captions(short, topic, variant):
    q = QUESTIONS[topic][variant % len(QUESTIONS[topic])]
    hook = HOOKS[topic]
    url = short['url']
    title = short['title']

    threads = f"{hook}\n\nDi video short kali ini kami tunjukkan langsung prosesnya.\n\n{q}\n\n{url}"
    if len(threads) > 500:
        threads = f"{hook}\n\n{q}\n\n{url}"

    fb = (f"{hook}\n\nTonton video short terbaru dari DAS Bengkel Indonesia untuk melihat "
          f"langsung situasinya: {title}.\n\n{q}\n\n"
          f"Kami terbuka untuk diskusi — tulis pendapat Anda di kolom komentar.\n\n"
          f"{url}\n\n#DASBengkel #BengkelSurabaya #EngineOverhaul #PerawatanMobil")

    li = (f"{hook}\n\nDi video short terbaru kami, kami tunjukkan langsung prosesnya "
          f"seperti apa — dari kondisi awal sampai penanganan yang kami lakukan.\n\n"
          f"{q}\n\nSilakan berbagi pengalaman atau pandangan Anda di kolom komentar. "
          f"Diskusi dari para pemilik kendaraan selalu kami hargai.\n\n{url}")

    return {'threads': threads, 'fb': fb, 'linkedin': li}

def wib_slot(date_str, hhmm):
    """'2026-09-28' + '17:10' (WIB) → '2026-09-28T10:10:00.000Z' (UTC)."""
    jam, menit = (int(x) for x in hhmm.split(':'))
    dt = datetime.strptime(f"{date_str}T{jam:02d}:{menit:02d}:00", "%Y-%m-%dT%H:%M:%S").replace(tzinfo=WIB)
    return (dt - timedelta(hours=7)).strftime("%Y-%m-%dT%H:%M:%S.000Z")


def slot_terisi(client, account_id, schedule_at_utc):
    """ID jadwal yang sudah ada di akun + slot itu (status pending), atau None.

    Guard 27 Sep 2026: skrip ini dijalankan sekali sehari oleh cron, tapi pernah
    dobel saat dijalankan manual (history 22 Sep 2026 dua entri) → cek dulu
    sebelum create. Filter status=pending didukung API; filter accountId TIDAK
    didukung (totalDocs tetap semua) → saring di sisi klien.
    """
    page = 1
    while True:
        r = client.get(f"/public/schedule?page={page}&limit=100&status=pending")
        docs = r.get('docs') or r.get('data') or []
        for d in docs:
            if d.get('accountId') == account_id and d.get('scheduleAt') == schedule_at_utc:
                return d.get('_id') or d.get('id')
        if not docs or len(docs) < 100:
            return None
        page += 1


def main(dry_run=False, paksa_besok=False):
    pool = load_pool()
    hist = load_hist()
    short = pick_next(pool, hist)
    if short is None:
        print("⚠️ Semua video short sudah pernah dipakai — perlu refresh pool.")
        return 2

    variant = len(hist['posts'])  # variasi pertanyaan bergilir
    topic = detect_topic(short['title'])
    caps = build_captions(short, topic, variant)

    print(f"📹 Pilih: {short['title']} ({short['id']})")
    print(f"🏷️ Topik: {topic} | Variasi: {variant}")
    print(f"Threads: {len(caps['threads'])} char | FB: {len(caps['fb'])} char | LinkedIn: {len(caps['linkedin'])} char")

    if len(caps['threads']) > 500:
        print("❌ Threads > 500 karakter — TIDAK dikirim")
        return 1

    if dry_run:
        print("\n===== THREADS =====\n" + caps['threads'])
        print("\n===== FB =====\n" + caps['fb'])
        print("\n===== LINKEDIN =====\n" + caps['linkedin'])
        return 0

    client = ReplizClient()
    today = datetime.now(WIB)
    if paksa_besok:
        schedule_date = (today + timedelta(days=1)).strftime("%Y-%m-%d")
    else:
        schedule_date = (today + timedelta(days=1)).strftime("%Y-%m-%d") if today.hour >= 12 else today.strftime("%Y-%m-%d")
    results = {}
    ids = {}

    if DAS_LINKEDIN:
        at = wib_slot(schedule_date, LINKEDIN_TIME)
        ada = slot_terisi(client, DAS_LINKEDIN, at)
        if ada:
            results['linkedin'] = '⏭️'
            print(f"LinkedIn ({at}): ⏭️ sudah ada jadwal {ada} — skip")
        else:
            r = client.schedule_text(DAS_LINKEDIN, caps['linkedin'], at, title="Video Short DAS")
            sid = r.get('_id') or r.get('id')
            results['linkedin'] = '✅' if sid else '❌'
            ids['linkedin'] = sid
            print(f"LinkedIn ({at}): {results['linkedin']} {sid or r}")

    at = wib_slot(schedule_date, THREADS_TIME)
    ada = slot_terisi(client, DAS_THREADS, at)
    if ada:
        results['threads'] = '⏭️'
        print(f"Threads ({at}): ⏭️ sudah ada jadwal {ada} — skip")
    else:
        r = client.schedule_text(DAS_THREADS, caps['threads'], at, title="Video Short DAS")
        sid = r.get('_id') or r.get('id')
        results['threads'] = '✅' if sid else '❌'
        ids['threads'] = sid
        print(f"Threads ({at}): {results['threads']} {sid or r}")

    at = wib_slot(schedule_date, FB_TIME)
    ada = slot_terisi(client, DAS_FB, at)
    if ada:
        results['fb'] = '⏭️'
        print(f"FB ({at}): ⏭️ sudah ada jadwal {ada} — skip")
    else:
        r = client.schedule_text(DAS_FB, caps['fb'], at, title="Video Short DAS")
        sid = r.get('_id') or r.get('id')
        results['fb'] = '✅' if sid else '❌'
        ids['fb'] = sid
        print(f"FB ({at}): {results['fb']} {sid or r}")

    # catat history — HANYA kalau ada yang benar-benar dibuat.
    # (27 Sep 2026) Run uji guard pernah mencatat entri walau semua slot di-skip;
    # entri kosong itu bikin pick_next membuang video yang belum pernah tayang.
    if any(v == '✅' for v in results.values()):
        entry = {
            'date': schedule_date,
            'video_id': short['id'],
            'video_title': short['title'],
            'video_url': short['url'],
            'topic': topic,
            'results': {k: v for k, v in results.items()},
            'schedule_ids': ids,
        }
        hist['posts'].append(entry)
        save_hist(hist)
        print(f"📝 History dicatat ({len(hist['posts'])} posting)")
    else:
        print("⏭️  Tidak ada jadwal baru dibuat — history tidak ditambah.")
    return 0

if __name__ == '__main__':
    dry = '--dry-run' in sys.argv
    besok = '--besok' in sys.argv
    sys.exit(main(dry_run=dry, paksa_besok=besok))
