#!/usr/bin/env python3
"""Publish 2 artikel SSC (dari reel IG) ke WordPress surabaya-skincentre.com
status: publish langsung + featured image Pexels + Yoast SEO.
"""
import base64, json, re, urllib.request, urllib.parse

DOM='surabaya-skincentre.com'
USER='bambangbot'
PW='r4bI jsIF CsAn uTIz SlFa TnJz'
AUTH=base64.b64encode(f'{USER}:{PW}'.encode()).decode()
CAT_PORI=172  # Skincare
CAT_BEGADANG=15 # akan diset -> kita pakai Skincare juga? cek di bawah

def wp(ep, method='GET', data=None, params=None):
    url=f'https://{DOM}/wp-json/wp/v2/{ep}'
    if params: url+='?'+urllib.parse.urlencode(params)
    body=json.dumps(data).encode() if data is not None else None
    req=urllib.request.Request(url, data=body, method=method, headers={
        'Authorization':f'Basic {AUTH}','Content-Type':'application/json','User-Agent':'Bot/1.0'})
    try:
        with urllib.request.urlopen(req,timeout=90) as r:
            return r.status, json.loads(r.read())
    except urllib.error.HTTPError as e:
        return e.code, e.read().decode(errors='ignore')[:500]

def md_to_html(md):
    # cukup simple: headings, lists, bold, links, paragraph
    lines=md.strip().split('\n')
    out=[]; in_ul=False; in_p=False
    def close_p():
        nonlocal in_p
        if in_p: out.append('</p>'); in_p=False
    for ln in lines:
        s=ln.strip()
        if not s:
            close_p(); continue
        # skip frontmatter
        if s in ('---','...'): continue
        m=re.match(r'^### (.+)$',s)
        if m: close_p(); out.append(f'<h3>{m.group(1)}</h3>'); continue
        m=re.match(r'^## (.+)$',s)
        if m: close_p(); out.append(f'<h2>{m.group(1)}</h2>'); continue
        m=re.match(r'^# (.+)$',s)
        if m: close_p(); out.append(f'<h1>{m.group(1)}</h1>'); continue
        if re.match(r'^\s*[-*] ',s):
            close_p()
            if not in_ul: out.append('<ul>'); in_ul=True
            out.append('<li>'+re.sub(r'^\s*[-*] ','',s)+'</li>')
            continue
        else:
            if in_ul: out.append('</ul>'); in_ul=False
        # inline formatting
        t=re.sub(r'\*\*(.+?)\*\*',r'<strong>\1</strong>',s)
        t=re.sub(r'\*(.+?)\*',r'<em>\1</em>',t)
        t=re.sub(r'\[(.+?)\]\((.*?)\)',r'<a href="\2">\1</a>',t)
        if not in_p: out.append('<p>'); in_p=True
        out.append(t)
    close_p()
    if in_ul: out.append('</ul>')
    # replace newline paragraphs
    return '\n'.join(out)

def upload_featured(keyword, filename):
    # cari pexels
    key=''
    for f in ['pexels_key.txt']:
        try:
            key=open(f).read().strip(); break
        except: pass
    if not key:
        # fallback fixed pexels url
        url=None
    else:
        q=urllib.parse.quote(keyword)
        req=urllib.request.Request(f'https://api.pexels.com/v1/search?query={q}&per_page=1&orientation=landscape',headers={'Authorization':key})
        try:
            with urllib.request.urlopen(req,timeout=30) as r:
                d=json.loads(r.read())
                ph=d.get('photos')
                url = f"{ph[0]['src']['original']}?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1" if ph else None
        except Exception:
            url=None
    if not url:
        # generic pexels fallback
        url='https://images.pexels.com/photos/4370374/pexels-photo-4370374.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1'
    img=urllib.request.urlopen(urllib.request.Request(url,headers={'User-Agent':'Mozilla/5.0'}),timeout=60).read()
    data={'file':base64.b64encode(img).decode(),'filename':f'{filename}.jpg','caption':filename,'alt_text':filename}
    sc,res=wp('media',method='POST',data=data)
    if sc==201:
        return res.get('id')
    # fallback: header Content-Disposition
    auth=AUTH
    body=json.dumps(data).encode()
    req=urllib.request.Request(f'https://{DOM}/wp-json/wp/v2/media',data=body,method='POST',headers={
        'Authorization':f'Basic {auth}','Content-Type':'application/json','User-Agent':'Bot/1.0',
        'Content-Disposition':f'attachment; filename={filename}.jpg'})
    try:
        with urllib.request.urlopen(req,timeout=90) as r:
            return json.loads(r.read()).get('id')
    except urllib.error.HTTPError as e:
        print('  [media] upload gagal:',e.code,e.read().decode(errors='ignore')[:200])
        return None

# ---------------- Artikel 1: Begadang ----------------
md1=open('/home/mantapman/.openclaw/workspace-ujang/artikel_ssc_begadang.md').read()
fm1=re.match(r'^---\n(.*?)\n---',md1,re.S).group(1)
def fm(key):
    m=re.search(rf'^{key}:\s*(.+)$',fm1,re.M); return m.group(1).strip().strip('"') if m else ''
html1=md_to_html(re.sub(r'^---\n.*?\n---\n','',md1,flags=re.S))
title1=fm('title'); slug1=fm('slug'); meta1=fm('meta_description')
# link reel ganti jadi embed ? handled -> sudah ada di teks

print('=== Artikel 1: Begadang ===')
print('Title:',title1)
print('Slug:',slug1)
media1=upload_featured('sleep tired woman skin night', slug1)
print('  featured media id:',media1)

# cek existing slug duplikat
sc,exist=wp('posts',params={'slug':slug1,'status':'publish,draft,future','_fields':'id,slug'})
if exist:
    print('  SKIP: slug sudah ada ->',exist)
else:
    payload={'title':title1,'slug':slug1,'content':html1,'status':'publish',
             'categories':[4],  # Edukasi
             'excerpt':meta1[:150],
             'meta':{'_yoast_wpseo_metadesc':meta1[:155],'_yoast_wpseo_title':title1[:60]}}
    if media1: payload['featured_media']=media1
    sc,r=wp('posts',method='POST',data=payload)
    print('  publish status:',sc)
    if sc==201:
        print('  LINK:',r.get('link'),'ID:',r.get('id'))
    else:
        print('  ERR:',r)

# ---------------- Artikel 2: Pori-pori ----------------
md2=open('/home/mantapman/.openclaw/workspace-ujang/artikel_ssc_pori.md').read()
fm2=re.match(r'^---\n(.*?)\n---',md2,re.S).group(1)
def fm2v(key):
    m=re.search(rf'^{key}:\s*(.+)$',fm2,re.M); return m.group(1).strip().strip('"') if m else ''
html2=md_to_html(re.sub(r'^---\n.*?\n---\n','',md2,flags=re.S))
title2=fm2v('title'); slug2=fm2v('slug'); meta2=fm2v('meta_description')

print('\n=== Artikel 2: Pori-pori ===')
print('Title:',title2)
print('Slug:',slug2)
media2=upload_featured('woman face skin pores closeup', slug2)
print('  featured media id:',media2)

sc,exist=wp('posts',params={'slug':slug2,'status':'publish,draft,future','_fields':'id,slug'})
if exist:
    print('  SKIP: slug sudah ada ->',exist)
else:
    payload={'title':title2,'slug':slug2,'content':html2,'status':'publish',
             'categories':[172],  # Skincare
             'excerpt':meta2[:150],
             'meta':{'_yoast_wpseo_metadesc':meta2[:155],'_yoast_wpseo_title':title2[:60]}}
    if media2: payload['featured_media']=media2
    sc,r=wp('posts',method='POST',data=payload)
    print('  publish status:',sc)
    if sc==201:
        print('  LINK:',r.get('link'),'ID:',r.get('id'))
    else:
        print('  ERR:',r)
