#!/usr/bin/env python3
"""UMKM WhatsApp Bot Indonesia 2026 - Complete PDF"""
import os; from datetime import datetime
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm
from reportlab.lib.colors import HexColor,white,grey
from reportlab.lib.styles import getSampleStyleSheet,ParagraphStyle
from reportlab.lib.enums import TA_CENTER,TA_LEFT,TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate,Paragraph,Spacer,Table,TableStyle,PageBreak,HRFlowable

PRI=HexColor("#075e54");SEC=HexColor("#128c7e");ACC=HexColor("#25d366")
DRK=HexColor("#1a1a2e");BGL=HexColor("#f0f2f5");WRN=HexColor("#e74c3c");GOK=HexColor("#1b5e20")
PW,PH=A4

def pgnum(c,doc):
    c.saveState();c.setFont("Helvetica",8);c.setFillColor(grey)
    c.drawRightString(PW-2*cm,1.5*cm,f"Hal {doc.page}")
    c.drawString(2*cm,1.5*cm,"Riset WA Bot UMKM — Indonesia 2026")
    c.setStrokeColor(ACC);c.line(2*cm,1.3*cm,PW-2*cm,1.3*cm);c.restoreState()

sty=getSampleStyleSheet()
sT=ParagraphStyle('T',parent=sty['Title'],fontSize=24,textColor=white,alignment=TA_CENTER,spaceAfter=6,fontName='Helvetica-Bold')
sSt=ParagraphStyle('St',parent=sty['Normal'],fontSize=13,textColor=HexColor("#c8e6c9"),alignment=TA_CENTER,spaceAfter=20)
sH1=ParagraphStyle('H1',parent=sty['Heading1'],fontSize=17,textColor=PRI,spaceBefore=18,spaceAfter=8,fontName='Helvetica-Bold')
sH2=ParagraphStyle('H2',parent=sty['Heading2'],fontSize=13,textColor=SEC,spaceBefore=12,spaceAfter=5,fontName='Helvetica-Bold')
sB=ParagraphStyle('B',parent=sty['Normal'],fontSize=10,textColor=DRK,leading=14,alignment=TA_JUSTIFY,spaceAfter=5)
sBl=ParagraphStyle('Bl',parent=sB,leftIndent=16,bulletIndent=5,spaceBefore=1,spaceAfter=2)
sSm=ParagraphStyle('Sm',parent=sty['Normal'],fontSize=8,textColor=grey,leading=10)
sTH=ParagraphStyle('TH',parent=sty['Normal'],fontSize=7,textColor=white,alignment=TA_CENTER,fontName='Helvetica-Bold',leading=9)
sTC=ParagraphStyle('TC',parent=sty['Normal'],fontSize=7,textColor=DRK,alignment=TA_LEFT,fontName='Helvetica',leading=9)
sRv=ParagraphStyle('Rv',parent=sB,fontSize=9,leftIndent=10,rightIndent=10,backColor=BGL,borderPadding=8,fontName='Helvetica-Oblique',leading=13)
sPr=ParagraphStyle('Pr',parent=sBl,textColor=GOK)
sCn=ParagraphStyle('Cn',parent=sBl,textColor=WRN)

def H(t):return Paragraph(t,sH1)
def H2(t):return Paragraph(t,sH2)
def B(t):return Paragraph(t,sB)
def Bl(t,s=None):return Paragraph(f"• {t}",s or sBl)
def Sp(h=6):return Spacer(1,h)
def Hr():return HRFlowable(width="100%",thickness=0.5,color=ACC,spaceAfter=6,spaceBefore=3)
def Rv(t):return Paragraph(f'<i>"{t}"</i>',sRv)

def T(hds,rows,cw):
    hdr=[Paragraph(h,sTH)for h in hds];data=[hdr]
    for r in rows:data.append([Paragraph(str(c),sTC)for c in r])
    t=Table(data,colWidths=cw,repeatRows=1)
    cmds=[('BACKGROUND',(0,0),(-1,0),PRI),('TEXTCOLOR',(0,0),(-1,0),white),
          ('GRID',(0,0),(-1,-1),0.5,HexColor("#bdbdbd")),('VALIGN',(0,0),(-1,-1),'TOP'),
          ('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3),
          ('LEFTPADDING',(0,0),(-1,-1),3),('RIGHTPADDING',(0,0),(-1,-1),3)]
    for i in range(1,len(data)):
        bg=HexColor("#e8f5e9")if i%2==0 else white
        cmds.append(('BACKGROUND',(0,i),(-1,i),bg))
    t.setStyle(TableStyle(cmds));return t

OUT="/app/working/workspaces/default/Laporan_WA_Bot_UMKM_Indonesia_2026.pdf"
doc=SimpleDocTemplate(OUT,pagesize=A4,rightMargin=1.6*cm,leftMargin=1.6*cm,topMargin=1.8*cm,bottomMargin=2.2*cm,title="WhatsApp Bot UMKM Indonesia 2026",author="Agustini")
S=[]

# ═══ COVER ═══
S.append(Sp(3*cm))
cv=Table([[Paragraph("LAPORAN RISET UMKM",sSt)],
    [Paragraph("WhatsApp Bot Segmen UMKM<br/>Indonesia 2026",sT)],
    [Spacer(1,20)],
    [Paragraph("Fonnte, Wablas, StarSender, BalesOtomatis,<br/>OneSender, Api.co.id & Lainnya",sSt)],
    [Spacer(1,40)],
    [Paragraph(f"Disusun {datetime.now().strftime('%d %B %Y')}",ParagraphStyle('xD',parent=sB,fontSize=11,textColor=white,alignment=TA_CENTER))],
    [Paragraph("Agustini — Asisten Riset",ParagraphStyle('xA',parent=sB,fontSize=11,textColor=HexColor("#a5d6a7"),alignment=TA_CENTER))],
],colWidths=[PW-3.2*cm])
cv.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),PRI),('ALIGN',(0,0),(-1,-1),'CENTER'),('VALIGN',(0,0),(-1,-1),'MIDDLE'),('TOPPADDING',(0,0),(-1,0),25),('BOTTOMPADDING',(0,-1),(-1,-1),35),('LEFTPADDING',(0,0),(-1,-1),25),('RIGHTPADDING',(0,0),(-1,-1),25)]))
S.append(cv);S.append(PageBreak())

# ═══ TOC ═══
S.append(H("Daftar Isi"));S.append(Hr())
for t in["1. Kenapa Laporan Ini?","2. OFFICIAL vs UNOFFICIAL — WAJIB Paham!","3. Daftar 11 Provider UMKM","4. Tabel Perbandingan Cepat","5. Profil Detail Provider","6. Perbandingan Harga Detail","7. Ulasan & Keluhan Pengguna","8. Panduan Memilih untuk UMKM","9. Kesimpulan & Rekomendasi Buat Mas Eko"]:S.append(Paragraph(t,sB))
S.append(PageBreak())

# ═══ 1 ═══
S.append(H("1. Kenapa Laporan Ini?"));S.append(Hr())
S.append(B("Laporan sebelumnya membahas provider WA API kelas menengah-atas (Wati, Qiscus, Qontak). Namun, <b>90% UMKM Indonesia</b> tidak butuh solusi jutaan/bulan. Mereka perlu:"))
S.append(Bl("MURAH — Rp20rb-200rb/bulan, bukan jutaan",sPr))
S.append(Bl("SIMPEL — setup 5 menit, langsung pakai, tidak perlu developer",sPr))
S.append(Bl("BAYAR RUPIAH — QRIS, transfer bank, Dana, OVO, Alfamart",sPr))
S.append(Bl("BROADCAST + AUTO-REPLY — kebutuhan utama UMKM: blast promosi dan balas otomatis",sPr))
S.append(Sp(6))
S.append(B("Laporan ini fokus pada provider <b>segmen UMKM</b>: dari yang super murah (Rp16rb/bln) sampai menengah (Rp550rb/bln). Cocok untuk dropshipper, reseller, warung online, UKM kecil, sampai agency."))
S.append(PageBreak())

# ═══ 2 OFFICIAL VS UNOFFICIAL ═══
S.append(H("2. OFFICIAL vs UNOFFICIAL — Wajib Paham!"));S.append(Hr())
S.append(B("Ini hal PALING PENTING sebelum pilih. Tentukan dulu:"))
S.append(Sp(6))
S.append(H2("A. Unofficial API (WA Gateway) — MURAH TAPI BERISIKO"))
S.append(Bl("Menggunakan WhatsApp Web — TIDAK resmi dari Meta."))
S.append(Bl("RISIKO: nomor WhatsApp bisa <b>DIBANNED PERMANEN</b> jika terdeteksi spam."))
S.append(Bl("KEUNTUNGAN: <b>sangat murah</b>, tidak ada biaya per-pesan Meta, broadcast massal."))
S.append(Bl("Cocok: marketing, broadcast, notifikasi — pakai nomor CADANGAN."))
S.append(Bl("<b>Provider:</b> Fonnte, Wablas, StarSender, OneSender, Wapisender, RuangWA, Whapi, GoodBusinessID."))
S.append(Sp(6))
S.append(H2("B. Official WABA (WhatsApp Business API) — AMAN TAPI LEBIH MAHAL"))
S.append(Bl("Resmi dari Meta — nomor <b>aman dari banned</b>, centang hijau, template message."))
S.append(Bl("BIAYA: langganan platform + biaya per-pesan Meta (~Rp300-780/pesan)."))
S.append(Bl("Cocok: customer service serius, transaksi, integrasi bisnis."))
S.append(Bl("<b>Provider:</b> BalesOtomatis, Api.co.id, Chakra Chat (laporan sebelumnya)."))
S.append(Sp(6))
S.append(Paragraph("<b>⚠️ PERINGATAN:</b> JANGAN pakai nomor WhatsApp pribadi/utama untuk unofficial API. WhatsApp 2026 makin ketat memberantas unofficial usage. Kalau bisnis sudah serius, UPGRADE ke Official API!", ParagraphStyle('warn',parent=sB,textColor=WRN,fontName='Helvetica-Bold')))
S.append(PageBreak())

# ═══ 3 PROVIDER LIST ═══
S.append(H("3. Daftar 11 Provider UMKM"));S.append(Hr())
S.append(B("Diurutkan dari harga termurah:"));S.append(Sp(5))
pv=[["1","OneSender","Unofficial","Rp16.500/bln","Super Mikro"],
   ["2","Wablas","Unofficial","Rp20.000-22.000/bln","Mikro—Kecil"],
   ["3","Fonnte","Unofficial","Rp25.000/bln","Mikro—Menengah"],
   ["4","Whapi","Unofficial","Rp30.000+/bln","Mikro"],
   ["5","RuangWA","Unofficial","Rp30.000+/bln","Mikro"],
   ["6","Wapisender","Unofficial","Rp35.000+/bln","Mikro—Kecil"],
   ["7","GoodBusinessID","Unofficial","Rp40.000+/bln","Mikro—Kecil"],
   ["8","StarSender","Unofficial","Rp58.000/bln (tahunan)","Kecil—Agency"],
   ["9","Api.co.id","OFFICIAL WABA","Rp100.000/bln","Kecil—Menengah"],
   ["10","BalesOtomatis","OFFICIAL BSP","Rp357.000/bln","Menengah"],
   ["11","Chakra Chat*","OFFICIAL BSP","$12.49 (~Rp195rb)","Kecil—Menengah"]]
S.append(T(["#","Provider","Tipe","Harga/Bulan","Target"],pv,[0.4*cm,3*cm,2.2*cm,3.5*cm,2.8*cm]))
S.append(Sp(4));S.append(Paragraph("<i>*Chakra Chat dibahas lengkap di laporan utama. Sangat relevan untuk UMKM yang mau official.</i>",sSm))
S.append(PageBreak())

# ═══ 4 COMPARISON TABLE ═══
S.append(H("4. Tabel Perbandingan Cepat"));S.append(Hr())
S.append(B("Skor untuk dimensi yang relevan bagi UMKM. ★ makin banyak = makin baik (kecuali Harga: makin banyak ★ = makin murah):"));S.append(Sp(5))
ch=["Provider","Harga\n(bintang=\nmurah)","Broad-\ncast","Auto\nReply","API/\nWebhook","Multi\nDevice","Integrasi\nPlugin","AI/\nChatbot","Risiko\nBanned","Skor"]
cr=[["OneSender","★★★★★","★★","★★","★★","★★","★","★","TINGGI","3.0"],
   ["Wablas","★★★★★","★★★","★★★","★★★★","★★★","★★★★★","★","TINGGI","3.9"],
   ["Fonnte","★★★★★","★★★★","★★★★","★★★★★","★★★★","★★★","★★","TINGGI","4.2"],
   ["Whapi","★★★★★","★★","★★","★★★","★★","★","★","TINGGI","2.8"],
   ["RuangWA","★★★★★","★★★","★★★","★★★","★★","★★","★","TINGGI","3.0"],
   ["Wapisender","★★★★★","★★★","★★★","★★★","★★","★★","★","TINGGI","3.1"],
   ["GoodBizID","★★★★★","★★★","★★★","★★★","★★","★★","★","TINGGI","3.1"],
   ["StarSender","★★★★","★★★★★","★★★★★","★★★★★","★★★★★","★★★★","★★★","TINGGI","4.4"],
   ["Api.co.id","★★★","★★★","★★★★","★★★★★","★★★","★★","★★","RENDAH","3.8"],
   ["BalesOtom.","★★","★★★★★","★★★★★","★★★★★","★★★★","★★★★","★★★★★","RENDAH","4.2"],
   ["Chakra Chat","★★★","★★★★","★★★★","★★★★","★★★★","★★★","★★★★","RENDAH","4.4"]]
S.append(T(ch,cr,[2*cm,1.3*cm,1.2*cm,1.2*cm,1.2*cm,1.2*cm,1.3*cm,1.2*cm,1.3*cm,1*cm]))
S.append(Sp(3));S.append(Paragraph("<i>Harga ★★★★★ = paling murah (dibawah Rp30rb). Risiko RENDAH = Official API, TINGGI = Unofficial (bisa banned).</i>",sSm))
S.append(PageBreak())

# ═══ 5 PROFILES ═══
S.append(H("5. Profil Detail Provider UMKM"));S.append(Hr())

# Fonnte
S.append(H2("5.1 Fonnte — Paling Populer, API Terbaik, Komunitas Besar"))
S.append(B("<b>fonnte.com</b> | Unofficial WA API | <b>Rp25rb-175rb/bulan</b> | Mikro—Menengah"))
S.append(Sp(3));S.append(B("<b>Fitur:</b>"));S.append(Bl("Auto-reply cerdas (keyword), broadcast terjadwal + rotasi device, REST API & Webhook lengkap, multi-device, auto-save kontak, notifikasi OTP/reminder/tagihan, integrasi Google Sheet + WooCommerce + n8n."))
S.append(Sp(3));S.append(B("<b>Kelebihan (+):</b>"));S.append(Bl("Komunitas TERBESAR — tutorial melimpah, dokumentasi lengkap",sPr));S.append(Bl("Harga sangat murah (mulai Rp25rb)",sPr));S.append(Bl("API/webhook paling powerful untuk developer",sPr))
S.append(Sp(3));S.append(B("<b>Kekurangan (-):</b>"));S.append(Bl("Unofficial — risiko banned jika spam",sCn));S.append(Bl("Tidak ada native AI chatbot (harus build via API)",sCn));S.append(Bl("Kadang delay kirim, device disconnect",sCn));S.append(Bl("Support via Telegram kadang lambat",sCn))
S.append(Sp(3));S.append(B("<b>Cocok:</b> Developer/freelancer, dropshipper, reseller, UKM online yang butuh WA API murah untuk integrasi custom."))

# Wablas
S.append(Sp(8));S.append(H2("5.2 Wablas — Harga Super Granular, 30+ Plugin WordPress"))
S.append(B("<b>wablas.com</b> | Unofficial WA API | <b>Rp20rb-76rb/bulan</b> | Mikro—Menengah"))
S.append(Sp(3));S.append(B("<b>Fitur:</b>"));S.append(Bl("Free trial 15 hari, 6 tier harga super granular, <b>30+ plugin WordPress</b> (WooCommerce, CF7, Elementor, LMS), auto-reply + webhook, n8n workflow, integrasi Shopify/Google Sheet/Zapier, multi-agent 4-12, payment lokal lengkap (QRIS/Dana/OVO)."))
S.append(Sp(3));S.append(B("<b>Kelebihan (+):</b>"));S.append(Bl("Harga PALING MURAH untuk volume rendah (Rp20rb)",sPr));S.append(Bl("Integrasi WordPress TERLENGKAP — 30+ plugin!",sPr));S.append(Bl("Tiered pricing sangat fleksibel",sPr));S.append(Bl("Payment lokal lengkap",sPr))
S.append(Sp(3));S.append(B("<b>Kekurangan (-):</b>"));S.append(Bl("Message history pendek (2-5 hari saja)",sCn));S.append(Bl("Tidak ada AI chatbot native",sCn));S.append(Bl("Auto-reply terbatas di paket bawah",sCn));S.append(Bl("Unofficial — risiko banned",sCn))
S.append(Sp(3));S.append(B("<b>Cocok:</b> Bisnis WordPress/WooCommerce, membership site, UKM kecil butuh notifikasi otomatis murah."))

# StarSender
S.append(Sp(8));S.append(H2("5.3 StarSender — WA Marketing Paling Powerfull, Unlimited Message"))
S.append(B("<b>wastarsender.com</b> | Unofficial WA API | <b>Rp58rb-99rb/bulan</b> | Kecil—Agency"))
S.append(Sp(3));S.append(B("<b>Fitur:</b>"));S.append(Bl("<b>UNLIMITED MESSAGE</b> di semua paket!, broadcast massal + smart auto-reply keyword, <b>multi-device 3-20 nomor</b>, multi-CS dashboard, campaign builder (funnel + lead magnet), <b>Chatbot AI</b> (fitur baru), integrasi WooCommerce + payment gateway (Duitku, Xendit, Tripay), jam kerja toko (auto-reply offline), send item report."))
S.append(Sp(3));S.append(B("<b>Kelebihan (+):</b>"));S.append(Bl("UNLIMITED MESSAGE — tidak ada batas kuota!",sPr));S.append(Bl("Fitur WA marketing paling lengkap: broadcast, campaign, multi-CS",sPr));S.append(Bl("20 device WhatsApp (paket tahunan)",sPr));S.append(Bl("Chatbot AI already included",sPr));S.append(Bl("Harga tahunan sangat terjangkau (~Rp58rb/bln)",sPr))
S.append(Sp(3));S.append(B("<b>Kekurangan (-):</b>"));S.append(Bl("Unofficial — risiko banned",sCn));S.append(Bl("Refund policy ketat",sCn));S.append(Bl("Chatbot AI masih baru — belum sematang BalesOtomatis",sCn));S.append(Bl("Tidak cocok untuk CS skala besar",sCn))
S.append(Sp(3));S.append(B("<b>Cocok:</b> Agency marketing, dropshipper, reseller, info produk, bisnis yang butuh broadcast massal + campaign WA."))

# BalesOtomatis
S.append(Sp(8));S.append(H2("5.4 BalesOtomatis — Official BSP, AI Agent + IG, Paling Canggih"))
S.append(B("<b>balesotomatis.id</b> | Official Meta BSP | <b>Rp357rb-550rb/bulan</b> | Menengah"))
S.append(Sp(3));S.append(B("<b>Fitur:</b>"));S.append(Bl("<b>Official WABA</b> — nomor AMAN, verified, centang hijau, <b>AI Agent canggih</b>: chatbot AI + takeover manusia, <b>Instagram DM Automation</b> + Live DM + comment reply, omnichannel (WA + IG + FB + Web), CRM terintegrasi, AI cek ongkir otomatis, broadcast interaktif + follow-up tanpa batas, analitik performa chat/penjualan/CSAT/KPI."))
S.append(Sp(3));S.append(B("<b>Kelebihan (+):</b>"));S.append(Bl("Official BSP — nomor AMAN dari banned",sPr));S.append(Bl("AI Agent paling canggih di segmen UMKM",sPr));S.append(Bl("WA + Instagram dalam satu platform",sPr));S.append(Bl("CRM built-in + analitik lengkap",sPr))
S.append(Sp(3));S.append(B("<b>Kekurangan (-):</b>"));S.append(Bl("Harga lebih mahal (mulai Rp357rb/bln)",sCn));S.append(Bl("Overkill untuk UMKM mikro",sCn));S.append(Bl("Biaya per-pesan Meta tetap berlaku",sCn))
S.append(Sp(3));S.append(B("<b>Cocok:</b> UMKM menengah serius, toko online bertim CS, bisnis yang aktif di WA & IG."))

# Api.co.id
S.append(Sp(8));S.append(H2("5.5 Api.co.id — Official WABA Termurah, Tanpa Markup"))
S.append(B("<b>api.co.id</b> | Official WABA (Cloud API) | <b>Rp100rb/bulan</b> | Kecil—Menengah"))
S.append(Sp(3));S.append(B("<b>Fitur:</b>"));S.append(Bl("Official WhatsApp Cloud API — WA + IG + Messenger dalam 1 API, REST API & Webhook real-time, dashboard sederhana, <b>tanpa markup biaya Meta</b> (bayar langsung ke Meta), nomor aman dari banned, cocok untuk custom integration."))
S.append(Sp(3));S.append(B("<b>Kelebihan (+):</b>"));S.append(Bl("Official WABA TERMURAH (Rp100rb/bln)",sPr));S.append(Bl("Tidak ada markup per pesan — hemat besar",sPr));S.append(Bl("WA + IG + Messenger dalam 1 API",sPr));S.append(Bl("Nomor AMAN dari banned",sPr))
S.append(Sp(3));S.append(B("<b>Kekurangan (-):</b>"));S.append(Bl("Dashboard minimalis — bukan platform all-in-one",sCn));S.append(Bl("Tidak ada chatbot builder visual",sCn));S.append(Bl("Harus bisa coding / pakai developer",sCn))
S.append(Sp(3));S.append(B("<b>Cocok:</b> Developer/freelancer yang mau bikin solusi WA API sendiri untuk client — official, aman, murah."))

# OneSender
S.append(Sp(8));S.append(H2("5.6 OneSender — Paling Murah Sedunia (Rp16.500/bln)"))
S.append(B("<b>onesender.net</b> | Unofficial WA API | <b>Rp198rb/tahun (~Rp16.500/bln)</b> | Super Mikro"))
S.append(Sp(3));S.append(B("<b>Fitur:</b> Auto-reply, broadcast, API access, multi-device. Sangat basic."))
S.append(Sp(3));S.append(B("<b>Kelebihan (+):</b>"));S.append(Bl("HARGA PALING MURAH — Rp16.500/bulan!",sPr))
S.append(Sp(3));S.append(B("<b>Kekurangan (-):</b>"));S.append(Bl("Fitur sangat terbatas, tidak ada AI, support minimal, reputasi belum teruji luas",sCn))
S.append(Sp(3));S.append(B("<b>Cocok:</b> Pemula banget, testing/eksperimen, reseller budget super minim."))

# Lainnya
S.append(Sp(8));S.append(H2("5.7 Provider Lainnya (Ringkasan)"))
S.append(Bl("<b>Wapisender:</b> Unofficial, ~Rp35rb+/bln, auto-reply, broadcast, API. Populer di kalangan reseller."))
S.append(Bl("<b>RuangWA:</b> Unofficial, ~Rp30rb+/bln, WA Gateway basic."))
S.append(Bl("<b>GoodBusinessID:</b> Unofficial, ~Rp40rb+/bln, fokus info produk, integrasi membership."))
S.append(Bl("<b>Whapi:</b> Unofficial, ~Rp30rb+/bln, API-focused, mirip Fonnte tapi kurang populer."))
S.append(PageBreak())

# ═══ 6 PRICING ═══
S.append(H("6. Perbandingan Harga Detail UMKM"));S.append(Hr())
S.append(B("Harga dalam Rupiah. Official API: + biaya Meta per pesan (~Rp300-780/pesan). Unofficial: TIDAK ADA biaya per pesan."));S.append(Sp(5))
ph=["Provider","Tipe","Paket","Harga/Bln","Kuota","Device","Agent","Total/Thn"]
pr=[["Fonnte","Unof.","Basic","Rp25rb","1K msg","1","1","Rp300rb"],
   ["Fonnte","Unof.","Gold","Rp50rb","3K msg","1","1","Rp600rb"],
   ["Fonnte","Unof.","Platinum","Rp110rb","10K msg","2","3","Rp1.32jt"],
   ["Fonnte","Unof.","Master","Rp175rb","Unlimited","3","5","Rp2.1jt"],
   ["Wablas","Unof.","Nano","Rp22rb","1K msg","1","4","Rp264rb"],
   ["Wablas","Unof.","Lite","Rp20rb","5K msg","1","4","Rp240rb"],
   ["Wablas","Unof.","Medium","Rp47rb","Unlimited","1","8","Rp564rb"],
   ["Wablas","Unof.","Enterprise","Rp76rb","Unlimited","1","12","Rp912rb"],
   ["StarSender","Unof.","1 Bulan","Rp99rb","Unlimited","3","1 CS","Rp1.19jt"],
   ["StarSender","Unof.","1 Tahun","Rp58rb","Unlimited","20","1 CS","Rp699rb"],
   ["StarSender","Unof.","Premium 1th","Rp79rb","Unlimited","20","5 CS","Rp949rb"],
   ["OneSender","Unof.","Basic","Rp16.5rb","Terbatas","1","1","Rp198rb"],
   ["Api.co.id","OFFICIAL","Basic","Rp100rb","API","1","1","Rp1.2jt*"],
   ["BalesOtom.","OFFICIAL","Pro","Rp357rb","WABA","Multi","Multi","Rp4.28jt*"],
   ["BalesOtom.","OFFICIAL","Business","Rp550rb","WABA","Multi","Multi","Rp6.6jt*"],
   ["Chakra Chat","OFFICIAL","Basic","~Rp195rb","WABA","Multi","Multi","~Rp2.34jt*"]]
S.append(T(ph,pr,[1.8*cm,1.2*cm,1.8*cm,1.6*cm,1.6*cm,1.2*cm,1.2*cm,2*cm]))
S.append(Sp(3));S.append(Paragraph("<i>*Official: + biaya Meta per pesan (~$0.005-0.09/pesan). Unofficial: tidak ada biaya tambahan.</i>",sSm))
S.append(PageBreak())

# ═══ 7 REVIEWS ═══
S.append(H("7. Ulasan & Keluhan Pengguna"));S.append(Hr())

S.append(H2("Fonnte — Overall Positif, Delay Kadang Dikeluhkan"))
S.append(Bl("✅ Dipuji: harga murah, API mudah, dokumentasi lengkap, komunitas besar, cocok developer."))
S.append(Bl("❌ Dikeluhkan: kadang delay kirim, device disconnect, support Telegram lambat, risiko banned."))

S.append(Sp(6));S.append(H2("Wablas — Disukai WordPress User, Selebihnya Standar"))
S.append(Bl("✅ Dipuji: free trial, 30+ plugin WP, tiered pricing, n8n, payment lokal."))
S.append(Bl("❌ Dikeluhkan: message history pendek, dashboard kadang lemot, auto-reply terbatas."))

S.append(Sp(6));S.append(H2("StarSender — Unlimited Message Jadi Daya Tarik Utama"))
S.append(Bl("✅ Dipuji: unlimited message, multi-device 20 nomor, campaign builder, Chatbot AI."))
S.append(Bl("❌ Dikeluhkan: refund policy ketat, kadang delay broadcast, support terbatas jam kerja."))

S.append(Sp(6));S.append(H2("BalesOtomatis — AI Agent Dipuji, Harga Dikeluhkan UMKM Mikro"))
S.append(Bl("✅ Dipuji: AI Agent canggih, IG automation keren, official BSP (aman), CRM built-in."))
S.append(Bl("❌ Dikeluhkan: Rp357rb terlalu mahal untuk UMKM mikro, banyak fitur bikin bingung."))

S.append(Sp(6));S.append(H2("Api.co.id — Official Termurah, Tapi Butuh Developer"))
S.append(Bl("✅ Dipuji: official termurah (Rp100rb), tidak ada markup Meta, WA+IG+Messenger."))
S.append(Bl("❌ Dikeluhkan: dashboard minimalis, harus coding, dokumentasi masih berkembang."))
S.append(PageBreak())

# ═══ 8 GUIDE ═══
S.append(H("8. Panduan Memilih untuk UMKM"));S.append(Hr())

S.append(H2("Budget Super Hemat (dibawah Rp50rb/bln)"))
S.append(Bl("<b>Wablas Lite (Rp20rb/bln, 5K msg)</b> — termurah untuk volume sedang."))
S.append(Bl("Alternatif: OneSender (Rp16.5rb/bln), Fonnte Basic (Rp25rb/bln)."))

S.append(Sp(6));S.append(H2("Broadcast Massal + Campaign (Rp50-100rb/bln)"))
S.append(Bl("<b>StarSender 1 Tahun (Rp58rb/bln)</b> — BEST VALUE. Unlimited message, 20 device, campaign builder."))
S.append(Bl("Alternatif: Fonnte Gold/Platinum, Wablas Medium."))

S.append(Sp(6));S.append(H2("Developer/Freelancer Butuh API Custom (Rp25-100rb/bln)"))
S.append(Bl("<b>Fonnte (Rp25-175rb/bln)</b> — API/webhook terbaik, dokumentasi lengkap, komunitas besar."))
S.append(Bl("<b>Api.co.id (Rp100rb/bln)</b> — OFFICIAL WABA, tidak ada markup, aman dari banned, WA+IG+Messenger."))

S.append(Sp(6));S.append(H2("UMKM Serius Butuh AI + Instagram (Rp350rb+/bln)"))
S.append(Bl("<b>BalesOtomatis (Rp357rb/bln)</b> — official BSP, AI Agent + IG, CRM built-in."))
S.append(Bl("Alternatif: Chakra Chat (~Rp195rb/bln, official, murah, coexistence unik)."))

S.append(Sp(6));S.append(H2("WordPress/WooCommerce User"))
S.append(Bl("<b>Wablas (Rp20-47rb/bln)</b> — 30+ plugin WordPress, WooCommerce, LMS, membership."))

S.append(PageBreak())

# ═══ 9 CONCLUSION ═══
S.append(H("9. Kesimpulan & Rekomendasi Buat Mas Eko"));S.append(Hr())

S.append(H2("Pemenang Kategori UMKM"))
S.append(Bl("<b>Termurah:</b> Wablas Lite (Rp20rb/bln) — fleksibel, 30+ plugin WP."))
S.append(Bl("<b>API Terbaik:</b> Fonnte (Rp25rb/bln) — komunitas terbesar, dokumentasi lengkap."))
S.append(Bl("<b>Marketing Terbaik:</b> StarSender (Rp58rb/bln tahunan) — unlimited, 20 device, campaign."))
S.append(Bl("<b>Official Termurah:</b> Api.co.id (Rp100rb/bln) — tidak ada markup, nomor aman."))
S.append(Bl("<b>AI Paling Canggih:</b> BalesOtomatis (Rp357rb/bln) — official BSP, AI Agent, IG automation."))
S.append(Sp(8))

S.append(H2("Rekomendasi Spesifik Buat Mas Eko"))
S.append(B("Sebagai freelancer (web dev, CRM, social media, konseling) yang cari penghasilan:"))
S.append(Sp(4))
S.append(Bl("<b>Untuk dipakai sendiri:</b> Fonnte (Rp25rb/bln) atau StarSender (Rp58rb/bln tahunan) — murah, powerful, jadi alat bantu bisnis."))
S.append(Bl("<b>Untuk jualan jasa setup:</b> Kuasai 3 platform: Fonnte (termurah, API custom), BalesOtomatis (official, AI Agent), Api.co.id (official murah, API)."))
S.append(Bl("<b>Peluang freelance:</b> BANYAK UMKM butuh bantuan setup WA bot, broadcast, auto-reply, integrasi WooCommerce. Tawarkan paket: setup + training + template chatbot. Harga paket Rp1-3jt/setup + Rp100-300rb/bln maintenance."))
S.append(Bl("<b>Produk digital:</b> Jual template chatbot WA (keyword auto-reply, broadcast campaign, funnel) sebagai produk digital."))
S.append(Bl("<b>DIWASPADAI:</b> Jangan rekomendasikan unofficial API untuk client yang nomor WA-nya krusial. Selalu beri tahu risiko banned."))
S.append(Sp(8))

S.append(H2("Strategi Bertahap"))
S.append(Bl("1. Mulai dari Fonnte — belajar API, bikin bot sederhana, tawarkan ke UMKM kecil."))
S.append(Bl("2. Upgrade ke Api.co.id — official, aman, bisa charge lebih mahal."))
S.append(Bl("3. Client menengah — tawarkan BalesOtomatis atau Chakra Chat."))
S.append(Bl("4. Bundling: setup WA bot + landing page + CRM sederhana."))

S.append(Sp(12))
S.append(Hr())
S.append(B("<b>Laporan disusun oleh Agustini — Asisten Riset, 26 Juni 2026.</b>"))
S.append(B("Sumber: website resmi provider, Skrol.id, Arunajr.com, review komunitas Indonesia, forum diskusi."))
S.append(B("<i>Disclaimer: Harga dapat berubah. Risiko banned pada unofficial API adalah nyata. Untuk bisnis serius, rekomendasikan Official WABA.</i>"))

doc.build(S, onFirstPage=pgnum, onLaterPages=pgnum)
print(f"✅ PDF UMKM berhasil: {OUT}")
print(f"   Ukuran: {os.path.getsize(OUT)} bytes")
