# -*- coding: utf-8 -*-
"""
Publisher 10 artikel RSIA Kendangsari ke WordPress.
Alur:
1. Baca metadata (meta_10_artikel.py) + konten panjang (konten_*_v2 / konten_panjang_*) + gambar (gambar_10.py)
2. Ambil konten per artikel dari sumber yang dipilih (prioritas file v2, fallback file lama)
3. Upload featured image ke WP -> set kategori/tags -> post artikel -> set featured image
4. Verifikasi & lapor URL

Kredensial WP di-hardcode di file ini (bukan disebar).
"""
import sys, os, re, time
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from meta_10_artikel import ARTIKEL
from gambar_10 import IMG

WP_URL = "https://rsia.kendangsari.com/wp-json/wp/v2"
WP_USER = "bambangbot"
WP_PASS = "INJ6 7ag4 iouR Fqkm 4alp Dkng"

# ---- Pilih sumber konten per artikel ----
KONTEN_SOURCES = {
    1: "konten_panjang_1_4_v2.py",  # prioritas; fallback konten_panjang_1_3 / konten_1_4
    2: "konten_panjang_1_4_v2.py",
    3: "konten_panjang_1_4_v2.py",
    4: "konten_panjang_1_4_v2.py",
    5: "konten_panjang_5_8_v2.py",
    6: "konten_panjang_5_8_v2.py",
    7: "konten_panjang_5_8_v2.py",
    8: "konten_panjang_5_8_v2.py",
    9: "konten_panjang_9_10.py",
    10:"konten_panjang_9_10.py",
}

def load_article_content(art_no):
    """Kembalikan string HTML konten untuk artikel dengan no tertentu."""
    src = KONTEN_SOURCES.get(art_no)
    if not src:
        return None
    path = os.path.join(os.path.dirname(os.path.abspath(__file__)), src)
    if not os.path.exists(path):
        return None
    # import module dinamis
    import importlib.util
    spec = importlib.util.spec_from_file_location(src.replace('.py',''), path)
    mod = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(mod)
    var = f"KONTEN_{art_no}"
    return getattr(mod, var, None)

def word_count(html):
    txt = re.sub(r'<[^>]+>', ' ', html)
    return len([w for w in txt.split() if re.search(r'[a-zA-Z0-9]', w)])

def http_json(method, url, data=None, token=None):
    import urllib.request, json
    req = urllib.request.Request(url, method=method)
    req.add_header('Content-Type', 'application/json')
    if token:
        req.add_header('Authorization', 'Basic ' + token)
    body = json.dumps(data).encode() if data is not None else None
    try:
        with urllib.request.urlopen(req, data=body, timeout=60) as r:
            return r.status, json.loads(r.read().decode())
    except urllib.error.HTTPError as e:
        try:
            return e.code, json.loads(e.read().decode())
        except Exception:
            return e.code, {}

def upload_image(url, alt, token):
    """Unduh gambar dari url lalu upload ke media WP. Return media id."""
    import urllib.request, urllib.parse, json, base64
    # download
    req = urllib.request.Request(url, headers={'User-Agent':'Mozilla/5.0'})
    with urllib.request.urlopen(req, timeout=60) as r:
        imgdata = r.read()
    # filename dari url
    fname = url.split('/photos/')[-1].split('/')[0] + '.jpeg'
    # upload via media endpoint dengan basic auth, multipart manual sederhana lewat POST binary
    up = WP_URL.split('/wp/v2')[0] + '/wp-json/wp/v2/media'
    dreq = urllib.request.Request(up, data=imgdata, method='POST')
    dreq.add_header('Content-Type', 'image/jpeg')
    dreq.add_header('Content-Disposition', f'attachment; filename="{fname}"')
    dreq.add_header('Authorization', 'Basic ' + token)
    try:
        with urllib.request.urlopen(dreq, timeout=90) as r:
            j = json.loads(r.read().decode())
            return j.get('id')
    except urllib.error.HTTPError as e:
        try:
            j = json.loads(e.read().decode())
            return j.get('id')
        except Exception:
            return None

def main():
    import base64
    token = base64.b64encode(f"{WP_USER}:{WP_PASS}".encode()).decode()
    results = []
    for a in ARTIKEL:
        no = a['no']
        konten = load_article_content(no)
        if not konten:
            results.append((no, 'SKIP', 'konten tidak ditemukan'))
            continue
        wc = word_count(konten)
        if wc < 1300:
            results.append((no, 'SKIP-KURANG', f'{wc} kata (<1300)'))
            continue
        img_url = IMG.get(no)
        if not img_url:
            results.append((no, 'SKIP', 'gambar tidak ada'))
            continue
        # 1. upload gambar
        media_id = upload_image(img_url, a['alt'], token)
        if not media_id:
            results.append((no, 'SKIP', 'upload gambar gagal'))
            continue
        # 2. buat post
        payload = {
            "title": a['judul'],
            "content": konten,
            "slug": a['slug'],
            "status": "publish",
            "categories": a['tags'],
            "excerpt": a['meta_desc'],
            "comment_status": "open",
            "ping_status": "open",
        }
        # meta desc / seo
        meta = {"_yoast_wpseo_metadesc": a['meta_desc'],
                "_yoast_wpseo_focuskw": a['keyphrase'],
                "_yoast_wpseo_title": a['judul']}
        payload["meta"] = meta
        st, j = http_json('POST', WP_URL + '/posts', payload, token)
        if st not in (200, 201):
            results.append((no, 'FAIL-POST', str(j)[:150]))
            continue
        post_id = j.get('id')
        link = j.get('link')
        # 3. set featured image
        if post_id:
            st2, j2 = http_json('POST', f"{WP_URL}/posts/{post_id}", {"featured_media": media_id}, token)
        results.append((no, 'OK', f'id={post_id} {wc} kata link={link}'))
        print(f'[DONE] #{no} {a["slug"]} -> {link}', flush=True)
    print('\n===== RINGKASAN =====')
    for r in results:
        print(r)

if __name__ == '__main__':
    main()
