#!/usr/bin/env python3
"""Tambah isi #2729 supaya lewat 1.000 kata + pasang link internal dari artikel produk + perbaiki meta
halaman '/7-alasan-yasma-natura...'. GUARD: hanya post."""
import base64, html, json, re, time, urllib.request, urllib.error

S = "https://yasmanatura.co.id"
AUTH = base64.b64encode(b"bambangbot:LFp4 LXBh kMYG 84qC 2DDc 5bLc").decode()
PAYUNG = "https://yasmanatura.co.id/jasa-maklon-minuman-herbal/"

TAMBAHAN = """
<h2>Faktor yang menentukan biaya maklon herbal</h2>
<p>Biaya maklon tidak ditentukan oleh satu angka, melainkan oleh lima hal: jumlah produksi per batch, jenis dan ukuran kemasan, tingkat kesulitan formula, kebutuhan sertifikasi dan izin edar, serta harga bahan baku yang dipilih. Karena itu, dua brand bisa memproduksi produk sejenis dengan biaya berbeda. Cara paling akurat adalah menyampaikan rencana produk Anda, lalu meminta penaksiran tertulis — bukan membandingkan angka mentah dari pengalaman brand lain.</p>
<p>Yang bisa dilakukan untuk menekan biaya tanpa menurunkan mutu: memilih kemasan yang banyak tersedia di pasaran, menyederhanakan varian pada produksi pertama, dan menyesuaikan jumlah produksi dengan kapasitas penjualan awal. Menekan biaya lewat bahan baku yang lebih murah biasanya berbalik — konsumen produk herbal cukup peka terhadap perbedaan rasa dan khasiat.</p>

<h2>Ringkasan sebelum menghubungi kami</h2>
<p>Siapkan empat hal ini agar konsultasi berjalan singkat: bentuk produk yang diinginkan, perkiraan jumlah produksi pertama, target pasar, dan waktu ideal produk mulai dijual. Bila Anda membawa resep sendiri, sertakan catatan bahan dan proporsinya. Dengan informasi itu, tim kami bisa langsung menaksir biaya, waktu, dan langkah legalitas yang diperlukan.</p>
"""

LINK = {
    "maklon-madu-solusi-terbaik-untuk-produksi-madu-berkualitas": "maklon madu",
    "5-keunggulan-maklon-teh-herbal-yang-bikin-brand-kamu-lebih-menonjol": "maklon teh herbal",
    "7-alasan-yasma-natura-jadi-pilihan-utama-jasa-produksi-minuman": "jasa produksi minuman Yasma Natura",
}


def api(path, data=None, method=None):
    method = method or ("POST" if data is not None else "GET")
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    body = None
    if data is not None:
        body = json.dumps(data).encode(); h["Content-Type"] = "application/json"
    err = None
    r = urllib.request.Request(S + path, data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=200) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            if e.code in (404, 410, 500, 502, 503, 504):
                time.sleep(4); continue
            return e.code, e.read().decode()[:200]
        except Exception as e:
            err = e; time.sleep(4)
    return 0, str(err)[:150] if err else "gagal"


def ambil(slug):
    for tipe in ("posts", "pages"):
        st, d = api(f"/wp-json/wp/v2/{tipe}?slug={slug}&context=edit&_fields=id,type,content,title,meta")
        if isinstance(d, list) and d:
            return tipe[:-1], d[0]
    return None, None


print("=== 1. #2729 ditambah isi ===")
st, p = api("/wp-json/wp/v2/posts/2729?context=edit&_fields=type,content")
if p.get("type") != "post":
    print("  ⛔ bukan post"); raise SystemExit(1)
raw = p["content"]["raw"]
if "Faktor yang menentukan biaya maklon herbal" in raw:
    print("  sudah ada — skip")
else:
    m = re.search(r'\n<h2[^>]*>\s*Pertanyaan yang sering muncul', raw, re.I)
    baru = (raw[:m.start()] + TAMBAHAN + raw[m.start():]) if m else (raw.rstrip() + "\n" + TAMBAHAN)
    st2, _ = api("/wp-json/wp/v2/posts/2729", {"content": baru})
    _, chk = api("/wp-json/wp/v2/posts/2729?context=edit&_fields=content")
    print(f"  POST {st2} | {len(html.unescape(re.sub(r'<[^>]+>', ' ', chk['content']['raw'])).split())} kata")

print("\n=== 2. Link internal dari artikel produk → halaman payung ===")
for slug, anchor in LINK.items():
    tipe, d = ambil(slug)
    if not d:
        print(f"  {slug[:46]} → tidak ketemu"); continue
    if tipe != "post":
        print(f"  {slug[:46]} → tipe '{tipe}' (BUKAN post) — dilewati"); continue
    raw2 = d["content"]["raw"]
    if PAYUNG in raw2:
        print(f"  #{d['id']} sudah menautkan — skip"); continue
    blok = (f'\n<h2>Baca juga</h2>\n<p>Untuk gambaran lengkap alur produksinya, lihat '
            f'<a href="{PAYUNG}">jasa maklon herbal Sidoarjo</a> — dari formulasi sampai legalitas.</p>\n')
    mm = re.search(r"\n<h2[^>]*>\s*(Pertanyaan|FAQ|Kesimpulan|Baca juga)", raw2, re.I)
    baru2 = (raw2[:mm.start()] + blok + raw2[mm.start():]) if mm else (raw2.rstrip() + "\n" + blok)
    st3, _ = api(f"/wp-json/wp/v2/posts/{d['id']}", {"content": baru2})
    print(f"  #{d['id']} ({anchor}) POST {st3}")

print("\n=== 3. Perbaiki judul/meta '/7-alasan-yasma-natura-jadi-pilihan-utama...' ===")
tipe, d = ambil("7-alasan-yasma-natura-jadi-pilihan-utama-jasa-produksi-minuman")
if not d:
    print("  tidak ketemu")
elif tipe != "post":
    print(f"  tipe '{tipe}' (BUKAN post) — dilewati")
else:
    m = d.get("meta", {})
    print(f"  #{d['id']} | fk: {m.get('_yoast_wpseo_focuskw','')} | meta {len(m.get('_yoast_wpseo_metadesc','') or '')} char")
    print(f"  judul: {d['title']['rendered'][:70]}")
    print(f"  SEO title sekarang: {(m.get('_yoast_wpseo_title') or '(default)')[:70]}")
