#!/usr/bin/env python3
"""Gelombang 2 klaster serbuk Yasma: pilar #3475 + gabung isi 5 artikel, 5 dipensiunkan, 5 ditautkan.
GUARD: hanya post."""
import base64, html, importlib.util, json, os, re, sys, time, urllib.request, urllib.error

S = "https://yasmanatura.co.id"
AUTH = base64.b64encode(b"bambangbot:LFp4 LXBh kMYG 84qC 2DDc 5bLc").decode()
PILAR = 3475
BUANG = [4234, 3355, 3298, 2750, 3428]
TAUT = [4232, 2779, 3333, 3420, 3477]
PAYUNG_HERBAL = "https://yasmanatura.co.id/jasa-maklon-minuman-herbal/"

JUDUL = "Maklon Minuman Serbuk: Panduan Lengkap dari Formula sampai Distribusi"
FK = "maklon minuman serbuk"
META = ("Maklon minuman serbuk dari Yasma Natura: alur formula, bahan baku, produksi, legalitas BPOM dan Halal, "
        "sampai kesiapan distribusi. Konsultasi gratis.")

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%20minuman%20serbuk" 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 bantu menaksir biaya dan waktu produksinya.</p>
"""

ISI = """
<p>Maklon minuman serbuk adalah layanan produksi minuman bubuk untuk brand lain, mulai dari penyusunan formula, pengadaan bahan baku, produksi, pengemasan, sampai pengurusan legalitas. Yasma Natura di Sidoarjo mengerjakan seluruh rangkaian itu, sehingga Anda bisa menjual produk tanpa membangun pabrik sendiri.</p>

<h2>Apa yang termasuk dalam layanan maklon</h2>
<p>Layanan ini mencakup lima pekerjaan utama: formulasi rasa dan kandungan, pemilihan bahan baku beserta pemasoknya, produksi dalam jumlah yang disepakati, pengemasan sesuai desain Anda, dan pendampingan legalitas seperti izin edar serta sertifikasi Halal. Ada juga pekerjaan tambahan yang biasanya diminta, misalnya uji sampel sebelum produksi penuh dan penyesuaian formula setelah uji pasar.</p>

<h2>Alur produksi dari awal sampai siap jual</h2>
<p><strong>Formulasi.</strong> Tim kami menyusun atau menyempurnakan resep, termasuk menyeimbangkan rasa, aroma, dan tekstur agar diterima pasar sasaran. <strong>Uji sampel.</strong> Sampel dibuat lebih dulu, diuji rasa oleh Anda dan calon pembeli, lalu diperbaiki bila perlu. <strong>Pengadaan bahan.</strong> Bahan dipilih dengan mempertimbangkan khasiat, ketersediaan jangka panjang, dan kestabilan harga. <strong>Produksi.</strong> Setelah formula dan kemasan final, produksi dijalankan dengan pengawasan mutu di tiap tahap agar hasil antar batch konsisten. <strong>Pengemasan dan legalitas.</strong> Produk dikemas sesuai desain, dilengkapi informasi wajib, lalu masuk proses izin edar dan sertifikasi.</p>

<h2>Kenapa konsistensi rasa jadi penentu</h2>
<p>Keluhan paling umum pada produk serbuk bukan soal khasiat, melainkan rasa yang berubah antar batch. Penyebabnya biasanya bahan baku dari pemasok berbeda, takaran yang tidak presisi, atau kelembapan saat penyimpanan. Karena itu, memilih penyedia yang punya prosedur pengawasan mutu lebih penting daripada memilih yang harga produksinya paling murah.</p>

<h2>Minuman serbuk alami: dari bahan sampai klaim</h2>
<p>Produk berbahan alami punya dua tantangan. Pertama, rasa bahan alami tidak selalu seragam, sehingga formulasi perlu penyesuaian agar hasil akhirnya stabil. Kedua, klaim manfaat harus bisa dipertanggungjawabkan dan tidak berlebihan. Praktik yang aman: sebut bahan dan manfaatnya secara wajar, hindari kata-kata yang menjanjikan kesembuhan, dan pastikan setiap klaim bisa ditelusuri sumbernya.</p>

<h2>Kesiapan produksi skala besar</h2>
<p>Ketika produk sudah terbukti di pasar, kebutuhannya berubah: jumlah produksi naik, jadwal harus lebih ketat, dan mutu harus tetap sama. Tiga hal yang perlu disiapkan sebelum masuk skala besar: kepastian pasokan bahan baku untuk beberapa bulan ke depan, penyimpanan yang menjaga kelembapan, dan perkiraan permintaan yang realistis. Produksi besar tanpa perkiraan permintaan yang jelas berisiko pada penumpukan stok.</p>

<h2>Legalitas: apa saja yang perlu diurus</h2>
<p>Untuk produk minuman kesehatan, dua hal utama adalah izin edar dari BPOM dan sertifikasi Halal. Selain itu, informasi pada kemasan wajib memuat komposisi, tanggal kedaluwarsa, dan identitas produsen. Proses ini paling baik dimulai sejak formula disetujui, bukan setelah produk selesai diproduksi, karena pemeriksaannya memakan waktu dan bisa memengaruhi desain kemasan.</p>

<h2>Lokal Sidoarjo, jangkauan nasional</h2>
<p>Lokasi Sidoarjo dekat dengan Surabaya dan jalur distribusi Jawa Timur, sehingga biaya pengiriman bahan dan produk jadi lebih terkendali. Untuk brand yang ingin menjual ke luar Jawa, produksi di satu lokasi dengan pengiriman terpusat biasanya lebih mudah diatur daripada produksi tersebar. Silakan lihat juga <a href="https://yasmanatura.co.id/jasa-maklon-minuman-serbuk-alami-terpercaya-produksi/">layanan maklon minuman serbuk alami</a> kami untuk gambaran lebih rinci.</p>

<h2>Cara memilih penyedia maklon minuman serbuk</h2>
<p>Periksa empat hal. <strong>Rekam jejak produk:</strong> minta contoh hasil produksi sebelumnya. <strong>Kejelasan biaya:</strong> pastikan mana yang termasuk dan tidak termasuk dalam penawaran. <strong>Pendampingan legalitas:</strong> penyedia harus bisa menjelaskan jalur izin edar yang dibutuhkan produk Anda. <strong>Komunikasi teknis:</strong> kecepatan menjawab pertanyaan menunjukkan bagaimana kerja sama berjalan nanti, karena hubungan ini berlangsung berbulan-bulan.</p>

<h2>Berapa lama dan berapa jumlah minimumnya</h2>
<p>Hitungan waktu dimulai setelah formula dan desain kemasan disetujui. Jumlah produksi minimum berbeda menurut jenis produk dan ukuran kemasan. Untuk produksi pertama, kami biasanya menyarankan jumlah yang cukup untuk menguji pasar tanpa mengikat modal terlalu besar — lalu ditambah setelah respon pembeli jelas.</p>

<h2>Kesalahan yang paling sering terjadi</h2>
<p>Memesan jumlah besar sebelum ada bukti permintaan. Melewati tahap uji sampel karena ingin cepat. Menganggap legalitas bisa diurus belakangan. Dan memilih bahan baku termurah tanpa mempertimbangkan konsistensi rasa antar batch.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Apa itu maklon minuman serbuk?</h3><p>Layanan produksi minuman bubuk untuk brand lain, mencakup formulasi, bahan baku, produksi, pengemasan, dan pendampingan legalitas.</p>
<h3>Apakah saya perlu punya resep dulu?</h3><p>Tidak wajib. Kalau belum punya, tim kami membantu menyusun formula awal. Kalau sudah punya, resep itu kami tinjau agar stabil saat diproduksi dalam jumlah besar.</p>
<h3>Berapa lama proses sampai produk siap dijual?</h3><p>Tergantung kecepatan persetujuan formula dan pengurusan legalitas. Tahap uji sampel biasanya yang paling banyak menyita waktu di awal.</p>
<h3>Apakah legalitas BPOM dan Halal diurus oleh Yasma Natura?</h3><p>Kami mendampingi prosesnya, termasuk menyiapkan dokumen yang dibutuhkan, karena keduanya syarat utama produk kesehatan bisa dijual resmi.</p>
<h3>Bisa produksi dalam jumlah sedikit untuk uji pasar?</h3><p>Bisa, dengan jumlah minimum yang berbeda per jenis produk. Cara ini biasanya kami sarankan untuk produksi pertama.</p>
"""



# tambahan + perbaikan tautan (dari ys_serbuk_tambahan2.py)
_spec = importlib.util.spec_from_file_location("_ysb2", os.path.join(os.path.dirname(os.path.abspath(__file__)), "ys_serbuk_tambahan2.py"))
_modb2 = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(_modb2)
ISI = ISI.replace('<h2>Pertanyaan yang sering muncul</h2>', _modb2.TAMBAHAN + "\n<h2>Pertanyaan yang sering muncul</h2>")
for _lama, _baru in _modb2.PERBAIKAN:
    ISI = ISI.replace(_lama, _baru)

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=220) 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"


print("=== GUARD tipe post ===")
for pid in [PILAR] + BUANG + TAUT:
    st, d = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=type,status")
    t = d.get("type") if isinstance(d, dict) else f"gagal({st})"
    if t != "post":
        print(f"  #{pid} tipe={t} ⛔ BUKAN post — dibatalkan"); sys.exit(1)
print(f"  semua {len([PILAR]+BUANG+TAUT)} sasaran = post ✅")

kata = len(html.unescape(re.sub(r"<[^>]+>", " ", ISI)).split())
print(f"\npilar #{PILAR}: {JUDUL}\n  {kata} kata | meta {len(META)} char | fk di awal: {META.lower().startswith(FK.lower())}")

if "--apply" not in sys.argv:
    print(f"\n  5 dipensiunkan: {BUANG}\n  5 ditautkan   : {TAUT}")
    sys.exit(0)

pasangan = [(re.sub(r"<[^>]+>", " ", m.group(1)).strip(), re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", m.group(2))).strip())
            for m in re.finditer(r"<h3[^>]*>(.*?)</h3>\s*<p>(.*?)</p>", ISI, re.S)]
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 + f'\n<h2>Baca juga</h2>\n<p>Untuk sisi branding-nya lihat <a href="https://yasmanatura.co.id/7-peluang-bisnis-minuman-serbuk-untuk-kebugaran-olahraga/">peluang bisnis minuman serbuk</a>, dan payung layanan kami ada di <a href="{PAYUNG_HERBAL}">jasa maklon herbal Sidoarjo</a>.</p>\n' + schema + "\n" + WA

st, _ = api(f"/wp-json/wp/v2/posts/{PILAR}", {
    "title": JUDUL, "content": konten,
    "meta": {"_yoast_wpseo_focuskw": FK, "_yoast_wpseo_title": JUDUL, "_yoast_wpseo_metadesc": META}})
_, chk = api(f"/wp-json/wp/v2/posts/{PILAR}?context=edit&_fields=content,meta")
raw = chk["content"]["raw"]
print(f"\nPILAR #{PILAR} POST {st} | {len(html.unescape(re.sub(r'<[^>]+>', ' ', raw)).split())} kata | FAQ {raw.count('<h3>')} Q | meta {len(chk['meta'].get('_yoast_wpseo_metadesc',''))}")

print("\nmenautkan 5 artikel ke pilar:")
for pid in TAUT:
    st2, p = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    r2 = p["content"]["raw"]
    if chk["meta"].get("_yoast_wpseo_metadesc") and "maklon-minuman-serbuk-indonesia" in r2:
        print(f"  #{pid} sudah menautkan"); continue
    blok = ('\n<h2>Baca juga</h2>\n<p>Panduan lengkapnya ada di '
            '<a href="https://yasmanatura.co.id/maklon-minuman-serbuk-indonesia-yasma-natura-partner/">maklon minuman serbuk</a> — '
            'dari formula, produksi, legalitas, sampai distribusi.</p>\n')
    m = re.search(r"\n<h2[^>]*>\s*(Pertanyaan|FAQ|Kesimpulan|Baca juga)", r2, re.I)
    baru = (r2[:m.start()] + blok + r2[m.start():]) if m else (r2.rstrip() + "\n" + blok)
    st3, _ = api(f"/wp-json/wp/v2/posts/{pid}", {"content": baru})
    print(f"  #{pid} POST {st3}")

print("\nmemindahkan 5 ke trash:")
for pid in BUANG:
    st4, _ = api(f"/wp-json/wp/v2/posts/{pid}", method="DELETE")
    _, c2 = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=status")
    print(f"  #{pid} DELETE {st4} | status: {c2.get('status') if isinstance(c2, dict) else c2}")
