#!/usr/bin/env python3
"""Yasma: jadikan #2729 halaman payung "jasa maklon herbal Sidoarjo", gabung isi #2741, lalu trash #2741.
GUARD: hanya memproses post_type=post — page dilewati."""
import base64, html, json, re, sys, time, urllib.request, urllib.error

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

WA = """
<style>
.ss-cta-wa{display:inline-flex;align-items:center;gap:10px;background-color:#6878d6;color:#ffffff !important;
font-family:'Open Sans',sans-serif;font-weight:600;font-size:17px;padding:15px 30px;border-radius:8px;
text-decoration:none !important;line-height:1.2;box-shadow:0 2px 8px rgba(104,120,214,.35)}}
.ss-cta-wa:hover{background-color:#4d61d6;color:#ffffff !important}
</style>
<p style="text-align:center;margin:34px 0 6px">
<a class="ss-cta-wa" href="https://wa.me/6281939119209?text=Halo%20Yasma%20Natura%2C%20saya%20ingin%20konsultasi%20maklon%20herbal" target="_blank" rel="noopener" role="button">WhatsApp: Konsultasi Gratis</a>
</p>
<p style="text-align:center;font-size:14px;color:#5b5b6b;margin:0 0 26px">Ceritakan rencana produk Anda, tim kami akan membantu menaksir biaya dan waktu produksinya.</p>
"""

JUDUL = "Jasa Maklon Herbal Sidoarjo: Produksi Minuman Herbal dari Formula sampai Legalitas"
FK = "jasa maklon herbal"
META = ("Jasa maklon herbal Sidoarjo untuk minuman kesehatan: formulasi, bahan baku, produksi, kemasan, "
        "sampai legalitas BPOM dan Halal. Konsultasi gratis sekarang.")

ISI = """
<p>Jasa maklon herbal adalah layanan produksi minuman atau produk kesehatan berbahan dasar herbal, di mana brand Anda tidak perlu membangun pabrik sendiri. Yasma Natura di Sidoarjo menangani seluruh rangkaiannya: formulasi, pemilihan bahan baku, produksi, pengemasan, sampai pengurusan legalitas. Anda fokus memasarkan, kami mengurus produksinya.</p>

<h2>Kenapa permintaan maklon herbal terus naik</h2>
<p>Kesadaran masyarakat terhadap gaya hidup sehat membuat permintaan produk herbal meningkat setiap tahun. Minuman kesehatan, teh herbal, madu olahan, dan minuman serbuk berbahan alami bukan lagi produk pinggiran. Banyak brand baru muncul dari pemilik usaha kecil yang ingin mencoba pasar ini tanpa harus punya mesin produksi dan izin sendiri — dan di situlah maklon bekerja.</p>
<p>Modelnya sederhana: Anda punya resep atau ide produk, kami yang memproduksi dengan standar dan izin yang sudah ada. Waktu masuk pasarnya jauh lebih singkat dibanding membangun fasilitas dari nol.</p>

<h2>Apa saja produk herbal yang bisa dimaklonkan</h2>
<p>Jenis produk yang paling sering dimaklonkan ke Yasma Natura antara lain minuman herbal cair, minuman serbuk, teh herbal dalam berbagai bentuk kemasan, produk berbahan madu, serta varian dengan pemanis alami seperti stevia. Untuk melihat pengalaman kami pada tiap kategori, Anda bisa membaca artikel <a href="https://yasmanatura.co.id/maklon-madu-solusi-terbaik-untuk-produksi-madu-berkualitas/">maklon madu</a> dan <a href="https://yasmanatura.co.id/5-keunggulan-maklon-teh-herbal-yang-bikin-brand-kamu-lebih-menonjol/">keunggulan maklon teh herbal</a>.</p>

<h2>Alur kerja maklon dari awal sampai produk jadi</h2>
<p><strong>Formulasi.</strong> Tim kami membantu menyusun atau menyempurnakan resep, termasuk menyesuaikan rasa dan tekstur agar sesuai selera pasar sasaran. <strong>Pemilihan bahan baku.</strong> Bahan dipilih dengan mempertimbangkan khasiat, ketersediaan, dan kestabilan harga. <strong>Uji coba produksi.</strong> Sampel dibuat lebih dulu untuk memastikan hasilnya sesuai rencana sebelum masuk jumlah produksi sesungguhnya. <strong>Produksi dan pengemasan.</strong> Produk dikemas sesuai desain Anda, dalam kemasan yang telah memenuhi syarat. <strong>Legalitas.</strong> Kami mendampingi proses pendaftaran izin edar dan sertifikasi Halal agar produk Anda siap dijual.</p>

<h2>Keunggulan maklon herbal di Yasma Natura</h2>
<p><strong>Bahan alami berkualitas.</strong> Tanaman herbal dipilih untuk menjaga manfaat sekaligus keamanan produk. <strong>Proses produksi yang menjaga mutu.</strong> Setiap tahap diawasi agar hasilnya konsisten antar batch, karena inkonsistensi rasa dan tekstur adalah keluhan paling umum konsumen produk herbal. <strong>Pendampingan legalitas.</strong> Karena produk kesehatan wajib memenuhi aturan, kami membantu prosesnya sejak awal sehingga Anda tidak membuang waktu di kemudian hari. <strong>Pendekatan yang menopang pertumbuhan brand.</strong> Kami bukan hanya memproduksi satu batch lalu selesai; kami membantu brand Anda punya produk yang bisa dijual berulang.</p>

<h2>Yang perlu Anda siapkan sebelum mulai</h2>
<p>Empat hal mempercepat proses: gambaran produk yang ingin dibuat (bentuk, rasa, manfaat yang ditonjolkan), target pasar, perkiraan jumlah produksi pertama, dan rencana kemasan. Kalau Anda belum punya semua itu, tim kami bisa membantu menyusunnya di tahap konsultasi — yang penting ada arah produknya lebih dulu.</p>

<h2>Jumlah produksi minimum dan waktunya</h2>
<p>Jumlah produksi minimum berbeda untuk setiap jenis produk dan ukuran kemasan. Untuk produksi pertama, kami biasanya menyarankan jumlah yang cukup untuk menguji pasar tanpa mengikat modal terlalu besar. Waktu pengerjaan dihitung sejak formula dan desain kemasan disetujui, bukan sejak pertama kali menghubungi kami — karena itu, memutuskan arah produk lebih awal sangat menghemat waktu.</p>

<h2>Cara memilih penyedia maklon herbal</h2>
<p>Periksa empat hal. <strong>Pertama</strong>, kemampuan legalitas: penyedia harus bisa menjelaskan jalur izin edar dan sertifikasi yang dibutuhkan produk Anda. <strong>Kedua</strong>, konsistensi hasil: minta contoh produksi sebelumnya dan tanyakan bagaimana mereka menjaga mutu antar batch. <strong>Ketiga</strong>, kejelasan biaya: rincian apa saja yang termasuk dan tidak termasuk. <strong>Keempat</strong>, komunikasi: seberapa cepat mereka menjawab pertanyaan teknis, karena kerja sama ini berjalan berbulan-bulan.</p>

<h2>Kesalahan yang sering terjadi di produksi pertama</h2>
<p>Memesan jumlah terlalu besar sejak awal sebelum tahu respon pasar. Mengabaikan uji sampel karena ingin cepat. Baru memikirkan legalitas setelah produk selesai diproduksi. Dan memilih bahan baku hanya berdasarkan harga termurah tanpa mempertimbangkan konsistensi rasa. Empat hal ini yang biasanya membuat biaya produksi pertama membengkak.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Apa itu jasa maklon herbal?</h3><p>Layanan produksi produk berbahan dasar herbal untuk brand lain, mencakup formulasi, bahan baku, produksi, pengemasan, dan pendampingan legalitas. Anda tidak perlu membangun pabrik sendiri.</p>
<h3>Berapa jumlah produksi minimum untuk mulai?</h3><p>Bervariasi tergantung jenis produk dan ukuran kemasan. Untuk produksi pertama, kami menyarankan jumlah yang cukup untuk menguji pasar tanpa mengikat modal terlalu besar.</p>
<h3>Apakah Yasma Natura membantu pengurusan izin edar dan Halal?</h3><p>Ya. Kami mendampingi proses pendaftaran izin edar dan sertifikasi Halal, karena keduanya syarat utama agar produk kesehatan bisa dijual resmi.</p>
<h3>Berapa lama proses produksi sampai produk siap?</h3><p>Hitungan waktu dimulai setelah formula dan desain kemasan disetujui. Tahap awal biasanya dipakai untuk uji sampel sebelum masuk produksi jumlah penuh.</p>
<h3>Apakah bisa memakai resep yang sudah saya punya?</h3><p>Bisa. Tim kami akan meninjau resep itu, menyesuaikan bila perlu agar hasilnya stabil saat diproduksi dalam jumlah besar, lalu mengembangkannya bersama Anda.</p>
"""


def api(path, data=None, method=None, wajib_post=False):
    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, 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 jenis(pid):
    st, d = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=type,title,status")
    return d if isinstance(d, dict) else {}


print("=== GUARD tipe post ===")
for pid in (2729, 2741):
    d = jenis(pid)
    print(f"  #{pid} tipe={d.get('type')} status={d.get('status')} | {str(d.get('title',{}).get('rendered',''))[:44]}")
    if d.get("type") != "post":
        print("  ⛔ BUKAN post — dilewati"); sys.exit(1)

print(f"\nmeta {len(META)} char | fk '{FK}' | fk di awal meta: {META.lower().startswith(FK.lower())}")
if "--apply" not in sys.argv:
    print("(dry run)")
    sys.exit(0)

# 1. jadikan #2729 halaman payung
_, p = api("/wp-json/wp/v2/posts/2729?context=edit&_fields=content")
old = p["content"]["raw"]
pasangan = []
for m in re.finditer(r"<h3[^>]*>(.*?)</h3>\s*<p>(.*?)</p>", ISI, re.S):
    q = re.sub(r"<[^>]+>", " ", m.group(1)).strip()
    a = re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", m.group(2))).strip()
    pasangan.append((q, a))
schema = ('<script type="application/ld+json">' + json.dumps({
    "@context": "https://schema.org", "@type": "FAQPage",
    "mainEntity": [{"@type": "Question", "name": q, "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in pasangan]},
    ensure_ascii=False) + "</script>")
konten = ISI + "\n" + schema + "\n" + WA
st, _ = api("/wp-json/wp/v2/posts/2729", {
    "title": JUDUL, "content": konten,
    "meta": {"_yoast_wpseo_focuskw": FK, "_yoast_wpseo_title": JUDUL, "_yoast_wpseo_metadesc": META}})
_, chk = api("/wp-json/wp/v2/posts/2729?context=edit&_fields=content,meta")
raw = chk["content"]["raw"]
print(f"\n#2729 POST {st} | {len(html.unescape(re.sub(r'<[^>]+>', ' ', raw)).split())} kata | "
      f"FAQ {raw.count('<h3>')} Q | meta {len(chk['meta'].get('_yoast_wpseo_metadesc',''))} | "
      f"panjang lama {len(old)} → {len(raw)} char")

# 2. #2741 → trash (isinya sudah diringkas ke payung)
st2, _ = api("/wp-json/wp/v2/posts/2741", method="DELETE")
_, chk2 = api("/wp-json/wp/v2/posts/2741?context=edit&_fields=status")
print(f"#2741 DELETE {st2} | status: {chk2.get('status') if isinstance(chk2, dict) else chk2}")
