#!/usr/bin/env python3
"""Gelombang 6 klaster serbuk Yasma: pilar #2793 (kenapa memilih Yasma), gabung 5 artikel '7 alasan',
pertahankan #3333 sebagai pembanding. GUARD: hanya post."""
import base64, html, 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 = 2793
BUANG = [2845, 3246, 3237, 3031, 2813]
TAUT = [3333]
GEL2 = "https://yasmanatura.co.id/maklon-minuman-serbuk-indonesia-yasma-natura-partner-maklon-nasional-untuk-produk-minuman-kesehatan/"

JUDUL = "Kenapa Memilih Yasma Natura: Keunggulan Jasa Produksi Minuman Serbuk"
FK = "jasa produksi minuman serbuk"
META = ("Jasa produksi minuman serbuk di Yasma Natura: fasilitas dan legalitas, layanan dari formula sampai "
        "pengemasan, dan cara menilai penyedia maklon.")

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%20produksi%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>Jasa produksi minuman serbuk dipilih brand karena satu alasan utama: memproduksi sendiri membutuhkan mesin, ruang produksi, tenaga terlatih, dan izin — semuanya dengan biaya tetap yang harus ditanggung setiap bulan. Dengan maklon, biaya itu berubah menjadi biaya per produksi. Di Yasma Natura, seluruh rangkaian dikerjakan dalam satu atap: formula, bahan baku, produksi, pengemasan, sampai pendampingan legalitas.</p>

<h2>Satu tempat untuk seluruh rangkaian produksi</h2>
<p>Yang paling sering merepotkan pemilik brand bukan produksinya, melainkan mengoordinasikan banyak pihak: penyedia bahan, pencampur, pengemas, dan pengurus izin. Ketika semuanya ditangani satu tempat, kesalahan komunikasi berkurang dan waktu pengerjaan lebih mudah dihitung. Ini juga memudahkan saat ada perubahan formula, karena semua pihak berada dalam satu alur kerja yang sama.</p>

<h2>Fleksibilitas jumlah produksi</h2>
<p>Brand baru biasanya tidak butuh produksi besar. Yang dibutuhkan adalah jumlah yang cukup untuk menguji pasar tanpa mengikat modal. Kami menyesuaikan jumlah produksi dengan rencana penjualan Anda, termasuk pilihan ukuran kemasan yang memungkinkan jumlah unit lebih banyak dengan berat bahan yang sama. Setelah produk terbukti, jumlahnya bisa dinaikkan bertahap.</p>

<h2>Pengalaman lintas kategori produk</h2>
<p>Produk yang pernah ditangani mencakup minuman herbal, minuman serbuk kesehatan, teh herbal, produk berbahan madu, sampai varian dengan pemanis alami. Pengalaman lintas kategori ini berguna ketika Anda ingin menggabungkan beberapa bahan, atau ketika formula perlu disesuaikan agar stabil saat diproduksi dalam jumlah besar.</p>

<h2>Pendampingan legalitas, bukan hanya produksi</h2>
<p>Produk minuman kesehatan wajib memenuhi izin edar dan sertifikasi Halal. Kami membantu menyiapkan data produksi dan fasilitas yang diperlukan, serta mendampingi prosesnya. Bagian ini sering menjadi pembeda: penyedia yang hanya memproduksi akan menyerahkan urusan perizinan sepenuhnya ke Anda, sementara penyedia yang memahami legalitas bisa membantu sejak tahap formula.</p>

<h2>Lokasi Sidoarjo, jangkauan nasional</h2>
<p>Sidoarjo dekat dengan Surabaya dan jalur distribusi Jawa Timur, sehingga biaya pengiriman bahan dan produk jadi lebih terkendali. Untuk brand yang menjual ke luar Jawa, produksi di satu lokasi dengan pengiriman terpusat biasanya lebih mudah diatur daripada produksi tersebar di beberapa tempat.</p>

<h2>Yang membedakan kami dari penyedia maklon lain</h2>
<p>Empat hal yang paling sering disebut klien. <strong>Pertama</strong>, komunikasi teknis dijawab langsung oleh orang yang menangani produksi, bukan hanya oleh bagian pemasaran. <strong>Kedua</strong>, formula disesuaikan dengan rencana penjualan, bukan sekadar mengikuti katalog. <strong>Ketiga</strong>, konsistensi rasa antar batch dijaga dengan prosedur pengawasan mutu. <strong>Keempat</strong>, setelah produk jadi kami tetap membantu saat ada penyesuaian atau rencana varian baru.</p>

<h2>Cara menilai penyedia maklon secara objektif</h2>
<p>Jangan hanya berpatokan pada testimoni. Periksa lima hal: rekam jejak produk yang pernah diproduksi, kejelasan rincian biaya, kesediaan menjelaskan prosedur pengawasan mutu, pendampingan legalitas, dan kecepatan menjawab pertanyaan teknis. Kelima hal ini bisa diperiksa dalam satu kali konsultasi, dan biasanya cukup untuk menggambarkan bagaimana kerja sama akan berjalan.</p>

<h2>Kapan sebaiknya mencari penyedia maklon</h2>
<p>Idealnya sebelum formula dikunci. Pada tahap itu, penyedia masih bisa memberi masukan soal bahan yang mudah didapat, kemasan yang tersedia luas, dan jumlah produksi yang realistis. Kalau produk sudah diproduksi di tempat lain lalu dipindahkan, biasanya ada tambahan pekerjaan penyesuaian formula.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Apa saja yang bisa diproduksi lewat jasa produksi minuman serbuk?</h3><p>Minuman serbuk kesehatan, minuman herbal, teh herbal, produk berbahan madu, dan varian dengan pemanis alami seperti stevia.</p>
<h3>Apakah bisa memakai resep yang sudah saya punya?</h3><p>Bisa. Resep itu kami tinjau agar hasilnya stabil saat diproduksi dalam jumlah besar, lalu disesuaikan bersama Anda bila diperlukan.</p>
<h3>Apakah legalitas diurus oleh Yasma Natura?</h3><p>Kami mendampingi prosesnya, termasuk menyiapkan data produksi dan fasilitas yang dibutuhkan untuk izin edar serta sertifikasi Halal.</p>
<h3>Berapa jumlah produksi minimumnya?</h3><p>Berbeda untuk setiap jenis produk dan ukuran kemasan. Sebutkan rencana produk Anda, kami berikan angka minimum beserta rinciannya.</p>
<h3>Bagaimana menjaga rasa tetap sama antar produksi?</h3><p>Melalui pemilihan pemasok yang konsisten, takaran yang presisi, dan pengawasan mutu di tiap tahap. Ini bagian yang kami perlakukan sebagai syarat, bukan pelengkap.</p>
"""


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  1 dipertahankan: {TAUT} (#3333 — sudut perbandingan)")
    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>")
blok_bawah = (f'\n<h2>Baca juga</h2>\n<p>Alur produksinya ada di <a href="{GEL2}">maklon minuman serbuk</a>, '
              f'sedangkan perbandingan dengan penyedia lain dibahas di <a href="https://yasmanatura.co.id/keunggulan-yasma-natura-dibanding-maklon-minuman-serbuk-lain/">keunggulan Yasma dibanding maklon lain</a>.</p>\n')

# GABUNG dengan konten lama: sisipkan bagian baru sebelum FAQ/penutup, jangan ganti isi lama
st_lama, lama = api(f"/wp-json/wp/v2/posts/{PILAR}?context=edit&_fields=content")
raw_lama = lama["content"]["raw"] if isinstance(lama, dict) else ""
# buang sisa schema/CTA lama supaya tidak dobel
raw_lama = re.sub(r'<script type="application/ld\+json">\s*\{.*?"FAQPage".*?</script>', "", raw_lama, flags=re.S)
raw_lama = re.sub(r'<style>\s*\.ss-cta-wa.*?</style>', "", raw_lama, flags=re.S)
raw_lama = re.sub(r'<p style="text-align:center;margin:34px 0 6px">.*?</p>', "", raw_lama, flags=re.S)
raw_lama = re.sub(r'<p style="text-align:center;font-size:14px;color:#5b5b6b;margin:0 0 26px">.*?</p>', "", raw_lama, flags=re.S)
anchor = re.search(r"\n<h2[^>]*>\s*(Pertanyaan|FAQ|Kesimpulan|Baca juga)", raw_lama, re.I)
konten = ((raw_lama[:anchor.start()] + ISI + "\n" + raw_lama[anchor.start():]) if anchor else (raw_lama.rstrip() + "\n" + ISI))
konten = konten.rstrip() + "\n" + blok_bawah + "\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,link")
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(f"  URL kanonik: {chk.get('link')}")

print("\nmenautkan pendukung:")
for pid in TAUT:
    st2, p = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content,type")
    if p.get("type") != "post":
        print(f"  #{pid} bukan post — dilewati"); continue
    r2 = p["content"]["raw"]
    if chk.get("link") and chk["link"] in r2:
        print(f"  #{pid} sudah menautkan"); continue
    blok = (f'\n<h2>Baca juga</h2>\n<p>Gambaran lengkap layanannya ada di '
            f'<a href="{chk.get("link")}">jasa produksi minuman serbuk Yasma Natura</a> — dari formula sampai legalitas.</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 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}")
