#!/usr/bin/env python3
"""Gelombang 7 klaster serbuk Yasma: pilar #3037 (ide produk), gabung #3521 & #2797 (dipensiunkan),
tautkan #2903, #3124, #4579. GUARD: hanya post. Isi lama DIPERTAHANKAN (disisip-tambah, bukan diganti)."""
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 = 3037
BUANG = [3521, 2797]
TAUT = [2903, 3124, 4579]
GEL2 = "https://yasmanatura.co.id/maklon-minuman-serbuk-indonesia-yasma-natura-partner-maklon-nasional-untuk-produk-minuman-kesehatan/"
GEL3 = "https://yasmanatura.co.id/10-cara-buat-brand-minuman-serbuk-sendiri-lewat-jasa-maklon-yasma-natura/"

JUDUL = "Ide Produk Minuman Serbuk: 10 Pilihan yang Bisa Dimaklonkan"
FK = "ide produk minuman serbuk"
META = ("Ide produk minuman serbuk yang bisa dimaklonkan: dari serat, kolagen, teh herbal, sampai minuman imun. "
        "Plus cara memilih yang paling cocok untuk pasar Anda.")

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%20ide%20produk%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>Ide produk minuman serbuk menentukan hampir semua keputusan berikutnya: bahan yang dibeli, kemasan yang dicetak, cara promosi, dan siapa yang jadi pembelinya. Sepuluh ide di bawah ini adalah kategori yang paling sering diproduksi dan paling jelas pasar sasarannya. Untuk masing-masing, disebutkan siapa pembelinya dan hal yang perlu diperhatikan sebelum diproduksi.</p>

<h2>1. Minuman serbuk serat dan prebiotik</h2>
<p>Untuk pembeli yang mengeluh pencernaan tidak lancar. Permintaannya stabil dan berulang, karena konsumen yang cocok biasanya mengonsumsi jangka panjang. Perhatian utama: menjaga rasa tetap enak meski kandungan seratnya tinggi.</p>

<h2>2. Kolagen dengan vitamin C</h2>
<p>Menyasar pembeli yang peduli penampilan kulit, umumnya perempuan usia 25-45 tahun. Kategori ini menuntut kemasan yang terlihat premium dan penjelasan manfaat yang wajar tanpa klaim berlebihan.</p>

<h2>3. Minuman herbal penenang</h2>
<p>Untuk pekerja kota besar yang sulit tidur atau mudah stres. Biasanya dikonsumsi malam hari. Peluangnya ada pada konsistensi rasa: produk yang membantu akan dibeli ulang, yang tidak akan ditinggalkan setelah satu kali coba.</p>

<h2>4. Minuman imun musiman</h2>
<p>Menghadapi musim hujan atau lonjakan kasus penyakit. Permintaannya naik-turun mengikuti musim, sehingga jumlah produksi sebaiknya disesuaikan dengan perkiraan musim, bukan dibuat merata sepanjang tahun.</p>

<h2>5. Minuman untuk ibu menyusui</h2>
<p>Segmen loyal dengan kebutuhan berbulan-bulan. Bahan baku harus jelas asalnya dan dosisnya konservatif. Jalur promosinya biasanya lewat komunitas ibu dan tenaga kesehatan, bukan iklan umum.</p>

<h2>6. Minuman olahraga dan elektrolit</h2>
<p>Untuk penggemar olahraga, pekerja lapangan, dan siapa pun yang banyak berkeringat. Rasa segar dan sensasi dingin biasanya lebih menentukan daripada klaim kandungan.</p>

<h2>7. Minuman anak dengan rasa buah</h2>
<p>Keputusan pembelian ada di tangan orang tua, sedangkan yang menentukan diterima atau tidaknya adalah anak. Karena itu, uji rasa perlu melibatkan keduanya: orang tua menilai bahan dan kandungan gula, anak menilai rasanya.</p>

<h2>8. Minuman lansia</h2>
<p>Segmen yang paling sedikit digarap. Kebutuhannya berkisar pada daya tahan tubuh, kesehatan sendi, dan asupan nutrisi harian. Informasi pada kemasan sebaiknya ditulis dengan huruf lebih besar dan bahasa sederhana.</p>

<h2>9. Teh herbal dalam bentuk serbuk</h2>
<p>Kategori yang sudah punya pembeli setia, khususnya mereka yang terbiasa minum teh herbal. Tantangannya menjaga aroma tetap terasa meski diubah menjadi bentuk serbuk.</p>

<h2>10. Minuman berpemanis alami</h2>
<p>Untuk pembeli yang membatasi gula. Produk ini biasanya memakai pemanis alami seperti stevia. Perhatian utamanya: aftertaste. Penyesuaian takaran dan paduan bahan diperlukan agar rasanya seimbang.</p>

<h2>Cara memilih dari sepuluh ide itu</h2>
<p>Jangan pilih yang paling Anda sukai, pilih yang paling bisa Anda jangkau. Tiga pertanyaan penentu: apakah Anda punya akses ke calon pembelinya, apakah bahan utamanya tersedia stabil, dan apakah Anda bisa menjelaskan manfaatnya dalam satu kalimat. Kalau satu jawabannya tidak, ide itu lebih baik dikerjakan nanti.</p>

<h2>Menentukan bentuk kemasan dan posisi harga</h2>
<p>Kemasan sachet tunggal cocok untuk produk konsumsi harian dan pembeli yang ingin mencoba dulu. Kemasan lebih besar cocok untuk pemakaian keluarga. Box dipakai bila ingin memosisikan produk sebagai premium. Sementara posisi harga ditentukan oleh dua hal: biaya produksi per unit dan harga produk sejenis di pasar sasaran Anda.</p>

<h2>Langkah setelah ide dipilih</h2>
<p>Empat langkah: susun formula bersama penyedia maklon dan buat sampel, ujikan rasa ke calon pembeli, urus legalitas, lalu jalankan produksi pertama dalam jumlah kecil. Setelah respon pasar jelas, baru tambah jumlah produksi atau varian baru.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Ide produk mana yang paling mudah dimulai?</h3><p>Minuman serbuk serat dan teh herbal biasanya paling sederhana formulasinya, sehingga cocok untuk produksi pertama.</p>
<h3>Apakah bisa memproduksi lebih dari satu ide sekaligus?</h3><p>Bisa, tapi sebaiknya maksimal dua sampai tiga varian pada produksi pertama. Lebih dari itu membuat biaya kemasan dan pengelolaan stok naik sebelum permintaan terbukti.</p>
<h3>Bagaimana kalau produk serupa sudah banyak di pasaran?</h3><p>Cari pembeda yang jelas: segmen yang lebih spesifik, rasa yang berbeda, atau kemasan yang lebih praktis. Bersaing pada harga saja biasanya tidak bertahan lama.</p>
<h3>Apakah semua ide bisa diproduksi di Yasma Natura?</h3><p>Sebagian besar kategori minuman herbal dan serbuk kesehatan bisa ditangani. Sebutkan rencana produk Anda, kami konfirmasi kelayakannya beserta perkiraan biaya.</p>
<h3>Berapa lama dari ide sampai produk siap dijual?</h3><p>Hitungannya dimulai setelah formula dan desain kemasan disetujui. Tahap uji sampel dan legalitas biasanya yang paling menentukan lama waktunya.</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  tambahan {kata} kata | meta {len(META)} char | fk di awal: {META.lower().startswith(FK.lower())}")
if "--apply" not in sys.argv:
    print(f"\n  2 dipensiunkan: {BUANG}\n  3 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)]
blok_bawah = (f'\n<h2>Baca juga</h2>\n<p>Untuk proses produksinya lihat <a href="{GEL2}">maklon minuman serbuk</a> '
              f'dan <a href="{GEL3}">cara memulai bisnis minuman serbuk</a>.</p>\n')

# GABUNG: sisipkan bagian baru ke konten lama, jangan ganti
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 ""
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

# skema FAQ dibangun dari SEMUA Q&A yang tampil di halaman
semua = [(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>", konten, 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 semua]},
    ensure_ascii=False) + "</script>")
konten = konten + "\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 artikel produk ke pilar:")
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>Daftar ide produk yang bisa dimaklonkan ada di '
            f'<a href="{chk.get("link")}">ide produk minuman serbuk</a> — lengkap dengan segmen pembelinya.</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}")
