#!/usr/bin/env python3
"""Generate comprehensive WhatsApp AI Bot Indonesia comparison PDF report."""

from reportlab.lib.pagesizes import A4
from reportlab.lib.units import cm, mm
from reportlab.lib.colors import (
    HexColor, white, black, grey, lightgrey
)
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, KeepTogether, HRFlowable
)
from reportlab.platypus.flowables import HRFlowable
from reportlab.pdfgen import canvas
from datetime import datetime

# ─── Colors ───────────────────────────────────────────────────
PRIMARY    = HexColor("#075e54")   # WhatsApp green
SECONDARY  = HexColor("#128c7e")  # lighter green
ACCENT     = HexColor("#25d366")  # bright green
DARK       = HexColor("#1a1a2e")  # dark
BG_LIGHT   = HexColor("#f0f2f5")  # light bg
WARN       = HexColor("#e74c3c")  # red for warnings
STAR       = HexColor("#f39c12")  # gold for stars

# ─── Page Setup ────────────────────────────────────────────────
PAGE_W, PAGE_H = A4

def add_page_number(canvas_obj, doc):
    canvas_obj.saveState()
    canvas_obj.setFont("Helvetica", 8)
    canvas_obj.setFillColor(grey)
    canvas_obj.drawRightString(PAGE_W - 2*cm, 1.5*cm, f"Hal {doc.page}")
    canvas_obj.drawString(2*cm, 1.5*cm, "Laporan Riset WhatsApp AI Bot — Indonesia 2026")
    canvas_obj.setStrokeColor(ACCENT)
    canvas_obj.line(2*cm, 1.3*cm, PAGE_W - 2*cm, 1.3*cm)
    canvas_obj.restoreState()

# ─── Styles ────────────────────────────────────────────────────
styles = getSampleStyleSheet()

style_title = ParagraphStyle('CTitle', parent=styles['Title'],
    fontSize=26, textColor=white, alignment=TA_CENTER,
    spaceAfter=6, fontName='Helvetica-Bold')

style_subtitle = ParagraphStyle('CSubtitle', parent=styles['Normal'],
    fontSize=14, textColor=HexColor("#c8e6c9"), alignment=TA_CENTER,
    spaceAfter=20, fontName='Helvetica')

style_h1 = ParagraphStyle('CH1', parent=styles['Heading1'],
    fontSize=18, textColor=PRIMARY, spaceBefore=20, spaceAfter=10,
    fontName='Helvetica-Bold')

style_h2 = ParagraphStyle('CH2', parent=styles['Heading2'],
    fontSize=14, textColor=SECONDARY, spaceBefore=14, spaceAfter=6,
    fontName='Helvetica-Bold')

style_h3 = ParagraphStyle('CH3', parent=styles['Heading3'],
    fontSize=12, textColor=DARK, spaceBefore=10, spaceAfter=4,
    fontName='Helvetica-Bold')

style_body = ParagraphStyle('CBody', parent=styles['Normal'],
    fontSize=10, textColor=DARK, leading=15,
    alignment=TA_JUSTIFY, fontName='Helvetica',
    spaceAfter=6)

style_bullet = ParagraphStyle('CBullet', parent=style_body,
    leftIndent=20, bulletIndent=8,
    spaceBefore=2, spaceAfter=2)

style_small = ParagraphStyle('CSmall', parent=styles['Normal'],
    fontSize=8, textColor=grey, leading=10,
    fontName='Helvetica')

style_table_header = ParagraphStyle('THeader', parent=styles['Normal'],
    fontSize=8, textColor=white, alignment=TA_CENTER,
    fontName='Helvetica-Bold', leading=10)

style_table_cell = ParagraphStyle('TCell', parent=styles['Normal'],
    fontSize=8, textColor=DARK, alignment=TA_LEFT,
    fontName='Helvetica', leading=10)

style_table_center = ParagraphStyle('TCenter', parent=style_table_cell,
    alignment=TA_CENTER)

style_warn = ParagraphStyle('CWarn', parent=style_body,
    textColor=WARN, fontName='Helvetica-Bold')

style_pros = ParagraphStyle('CPros', parent=style_bullet,
    textColor=HexColor("#1b5e20"))

style_cons = ParagraphStyle('CCons', parent=style_bullet,
    textColor=WARN)

style_review = ParagraphStyle('CReview', parent=style_body,
    fontSize=9, leftIndent=10, rightIndent=10,
    backColor=BG_LIGHT, borderPadding=8,
    fontName='Helvetica-Oblique', leading=13)

# ─── Helper Functions ──────────────────────────────────────────

def heading(text, level=1):
    s = style_h1 if level == 1 else style_h2 if level == 2 else style_h3
    return Paragraph(text, s)

def body(text):
    return Paragraph(text, style_body)

def bullet(text, style=None):
    s = style or style_bullet
    return Paragraph(f"•  {text}", s)

def spacer(h=6):
    return Spacer(1, h)

def hr():
    return HRFlowable(width="100%", thickness=0.5, color=ACCENT, spaceAfter=8, spaceBefore=4)

def make_table(headers, rows, col_widths=None):
    """Create a styled table."""
    header_cells = [Paragraph(h, style_table_header) for h in headers]
    data = [header_cells]
    for row in rows:
        data.append([Paragraph(str(c), style_table_cell) if i != len(row)-1
                      else Paragraph(str(c), style_table_cell)
                      for i, c in enumerate(row)])

    tbl = Table(data, colWidths=col_widths, repeatRows=1)
    style_cmds = [
        ('BACKGROUND', (0, 0), (-1, 0), PRIMARY),
        ('TEXTCOLOR', (0, 0), (-1, 0), white),
        ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
        ('FONTSIZE', (0, 0), (-1, 0), 8),
        ('BOTTOMPADDING', (0, 0), (-1, 0), 8),
        ('TOPPADDING', (0, 0), (-1, 0), 8),
        ('GRID', (0, 0), (-1, -1), 0.5, HexColor("#bdbdbd")),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ('TOPPADDING', (0, 1), (-1, -1), 5),
        ('BOTTOMPADDING', (0, 1), (-1, -1), 5),
        ('LEFTPADDING', (0, 0), (-1, -1), 4),
        ('RIGHTPADDING', (0, 0), (-1, -1), 4),
    ]
    # Alternate row colors
    for i in range(1, len(data)):
        if i % 2 == 0:
            style_cmds.append(('BACKGROUND', (0, i), (-1, i), HexColor("#e8f5e9")))
        else:
            style_cmds.append(('BACKGROUND', (0, i), (-1, i), white))

    tbl.setStyle(TableStyle(style_cmds))
    return tbl

def review_box(text):
    return Paragraph(f'<i>"{text}"</i>', style_review)

def stars(n):
    return "★" * n + "☆" * (5 - n)

def rating_line(label, n, comment=""):
    return Paragraph(
        f'<b>{label}:</b> {stars(n)} {comment}',
        style_body
    )

# ─── Build Document ────────────────────────────────────────────

doc = SimpleDocTemplate(
    "Laporan_Riset_WhatsApp_AI_Bot_Indonesia_2026.pdf",
    pagesize=A4,
    rightMargin=1.8*cm, leftMargin=1.8*cm,
    topMargin=2*cm, bottomMargin=2.5*cm,
    title="Riset WhatsApp AI Bot Indonesia 2026",
    author="Agustini — Asisten Riset",
)

story = []

# ╔══════════════════════════════════════════════════════════════╗
# ║                      COVER PAGE                             ║
# ╚══════════════════════════════════════════════════════════════╝

# We'll add a proper cover using a table
cover_data = [
    [Paragraph("LAPORAN RISET", style_subtitle)],
    [Paragraph("Layanan WhatsApp Bot AI<br/>di Indonesia 2026", style_title)],
    [Spacer(1, 20)],
    [Paragraph("Perbandingan Fitur, Harga, Keunggulan,<br/>Kekurangan & Ulasan Pengguna", style_subtitle)],
    [Spacer(1, 40)],
    [Paragraph(f"Disusun: {datetime.now().strftime('%d %B %Y')}", ParagraphStyle('CDate', parent=style_body, fontSize=11, textColor=white, alignment=TA_CENTER))],
    [Paragraph("oleh Agustini — Asisten Riset", ParagraphStyle('CAuthor', parent=style_body, fontSize=11, textColor=HexColor("#a5d6a7"), alignment=TA_CENTER))],
]

cover_tbl = Table(cover_data, colWidths=[PAGE_W - 3.6*cm])
cover_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, -1), PRIMARY),
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
    ('TOPPADDING', (0, 0), (-1, 0), 30),
    ('BOTTOMPADDING', (0, -1), (-1, -1), 40),
    ('LEFTPADDING', (0, 0), (-1, -1), 30),
    ('RIGHTPADDING', (0, 0), (-1, -1), 30),
]))

story.append(Spacer(1, 4*cm))
story.append(cover_tbl)
story.append(PageBreak())

# ╔══════════════════════════════════════════════════════════════╗
# ║                 TABLE OF CONTENTS                           ║
# ╚══════════════════════════════════════════════════════════════╝

story.append(heading("Daftar Isi"))
story.append(spacer(10))

toc_items = [
    "1. Ringkasan Eksekutif",
    "2. Metodologi Riset",
    "3. Daftar Provider WA Bot AI di Indonesia",
    "4. Tabel Perbandingan Utama",
    "5. Profil Detail Masing-Masing Provider",
    "   5.1  Chakra Chat — Lokal, Termurah",
    "   5.2  Wati — Global, Fitur Matang",
    "   5.3  Qiscus (Robolabs) — Enterprise Indonesia",
    "   5.4  Mekari Qontak — Omnichannel CRM Lokal",
    "   5.5  Maxchat — Omnichannel Lokal Andal",
    "   5.6  Aisensy — Jagoan Marketing Broadcast",
    "   5.7  Kommo — CRM Messenger Berbasis AI",
    "   5.8  Respond.io — Manajemen Percakapan Modern",
    "   5.9  ManyChat — Otomasi Multi-Channel",
    "   5.10 Interakt — Milik Jio Haptik (Reliance)",
    "   5.11 Gallabox — Skalabilitas Tinggi",
    "   5.12 Opaper — UMKM Lokal",
    "   5.13 Lainnya: CklikWa, ChatnBoom, 360dialog, Gupshup, SleekFlow",
    "6. Perbandingan Harga Detail",
    "7. Ulasan & Keluhan Pengguna",
    "8. Panduan Memilih (Berdasarkan Tipe Bisnis)",
    "9. Kesimpulan & Rekomendasi",
]

for item in toc_items:
    story.append(Paragraph(item, style_body if not item.startswith("   ") else
        ParagraphStyle('TocSub', parent=style_body, leftIndent=20)))
story.append(PageBreak())

# ╔══════════════════════════════════════════════════════════════╗
# ║              1. RINGKASAN EKSEKUTIF                         ║
# ╚══════════════════════════════════════════════════════════════╝

story.append(heading("1. Ringkasan Eksekutif"))
story.append(hr())
story.append(body(
    "WhatsApp mendominasi komunikasi digital di Indonesia dengan lebih dari <b>112 juta pengguna aktif</b> pada 2026. "
    "Bagi bisnis dari skala UMKM hingga enterprise, WhatsApp telah berevolusi dari sekadar aplikasi chat menjadi "
    "<b>ekosistem bisnis utama</b> untuk layanan pelanggan, pemasaran, dan penjualan."
))
story.append(body(
    "Laporan ini merangkum hasil riset menyeluruh terhadap <b>13+ layanan WhatsApp Bot AI</b> yang tersedia di Indonesia, "
    "mencakup provider lokal maupun global. Setiap layanan dinilai dari <b>8 dimensi</b>: fitur AI/chatbot, "
    "kemampuan broadcast, shared team inbox, integrasi e-commerce/CRM, harga & transparansi biaya, "
    "kemudahan penggunaan, dukungan pelanggan, serta ulasan pengguna."
))
story.append(spacer(6))
story.append(body("<b>Temuan Utama:</b>"))
story.append(bullet("Provider lokal seperti <b>Chakra Chat, Maxchat, Qiscus, dan Mekari Qontak</b> menawarkan dukungan bahasa Indonesia dan pemahaman pasar lokal yang unggul."))
story.append(bullet("<b>Chakra Chat</b> menjadi yang termurah ($12.49/bulan) dengan fitur WhatsApp Coexistence yang unik — tetap bisa pakai nomor WhatsApp yang sama di HP."))
story.append(bullet("<b>Wati</b> paling populer untuk UKM menengah, namun biaya tersembunyi (markup + per-message + per-seat) bisa membuat tagihan 5x lipat dari harga yang tertera."))
story.append(bullet("<b>Qiscus (Robolabs)</b> dan <b>Mekari Qontak</b> adalah pilihan enterprise dengan AI agent canggih, tapi harga mulai Rp2-5 juta/bulan."))
story.append(bullet("<b>Aisensy</b> unggul untuk marketing broadcast massal, <b>Kommo</b> unggul untuk CRM sales pipeline."))
story.append(bullet("Mayoritas keluhan pengguna berkisar pada: <b>biaya tersembunyi</b> (markup Meta), <b>customer support lambat</b>, <b>AI yang masih kaku</b>, dan <b>sulit setup teknis</b>."))
story.append(PageBreak())

# ╔══════════════════════════════════════════════════════════════╗
# ║              2. METODOLOGI RISET                            ║
# ╚══════════════════════════════════════════════════════════════╝

story.append(heading("2. Metodologi Riset"))
story.append(hr())
story.append(body(
    "Riset dilakukan pada <b>26 Juni 2026</b> melalui pencarian web, analisis situs resmi provider, "
    "platform ulasan (Trustpilot, G2, GetApp), forum diskusi Indonesia (Reddit r/indonesia, komunitas AI), "
    "serta artikel perbandingan dari sumber independen seperti ChakraHQ, Hack'celeration, Respond.io, Fuzen, dan Flowcart."
))
story.append(body("<b>Kriteria penilaian:</b>"))
story.append(bullet("<b>Fitur AI & Chatbot</b> — Kemampuan NLP, AI agent, conversational AI, integrasi LLM (GPT/Claude)."))
story.append(bullet("<b>Shared Team Inbox</b> — Multi-agent, routing otomatis, assignment, collision detection."))
story.append(bullet("<b>Broadcast & Campaign</b> — Blast message, segmentasi, template management, scheduling."))
story.append(bullet("<b>Integrasi</b> — E-commerce (Shopify/Tokopedia), CRM, API/webhook, channel lain (IG, FB, email)."))
story.append(bullet("<b>Harga & Transparansi</b> — Biaya langganan, biaya per pesan Meta, markup provider, hidden fees."))
story.append(bullet("<b>Kemudahan Penggunaan</b> — Setup, UX, no-code builder, dokumentasi, mobile app."))
story.append(bullet("<b>Dukungan Pelanggan</b> — Support lokal, onboarding, SLA, responsivitas."))
story.append(bullet("<b>Ulasan Pengguna</b> — Rating di Trustpilot/G2, keluhan umum, kepuasan pengguna."))
story.append(PageBreak())

# ╔══════════════════════════════════════════════════════════════╗
# ║         3. DAFTAR PROVIDER                                  ║
# ╚══════════════════════════════════════════════════════════════╝

story.append(heading("3. Daftar Provider WA Bot AI di Indonesia"))
story.append(hr())
story.append(body(
    "Berikut adalah 13 provider utama yang dibahas dalam laporan ini, diurutkan dari yang paling terjangkau:"
))
story.append(spacer(6))

provider_list = [
    ["1", "Chakra Chat", "🇮🇩 Lokal", "$12.49/bln (~Rp195rb)", "UMKM — Menengah"],
    ["2", "Opaper", "🇮🇩 Lokal", "~Rp500rb-1.5jt/bln", "UMKM"],
    ["3", "CklikWa / ClickWa", "🇮🇩 Lokal", "~Rp300rb-1jt/bln", "UKM Kecil"],
    ["4", "ChatnBoom", "🇮🇩 Lokal", "~Rp500rb+/bln", "UKM"],
    ["5", "ManyChat", "🌍 Global", "$15+/bln (contact-based)", "UKM — Menengah"],
    ["6", "Aisensy", "🌍 Global (India)", "$45-99/bln", "Marketing — Menengah"],
    ["7", "Wati", "🌍 Global (India)", "$49-299/bln", "UKM — Menengah"],
    ["8", "Maxchat", "🇮🇩 Lokal", "Rp850rb-2.5jt/bln", "Menengah — Besar"],
    ["9", "Respond.io", "🌍 Global", "$79+/bln", "Menengah"],
    ["10", "Interakt", "🌍 Global (India)", "₹3.499/qtr (~$42/qtr)", "UMKM — Menengah"],
    ["11", "Gallabox", "🌍 Global (India)", "$89+/bln", "Menengah — Besar"],
    ["12", "Qiscus (Robolabs)", "🇮🇩 Lokal", "$115-270/bln", "Enterprise"],
    ["13", "Mekari Qontak", "🇮🇩 Lokal", "~Rp2-5jt/bln (~$125-310)", "Enterprise"],
]

prov_tbl = make_table(
    ["#", "Provider", "Asal", "Harga Mulai", "Target Pasar"],
    provider_list,
    [0.6*cm, 3.5*cm, 2.2*cm, 4.2*cm, 3.5*cm]
)
story.append(prov_tbl)
story.append(PageBreak())

# ╔══════════════════════════════════════════════════════════════╗
# ║         4. TABEL PERBANDINGAN UTAMA                         ║
# ╚══════════════════════════════════════════════════════════════╝

story.append(heading("4. Tabel Perbandingan Utama"))
story.append(hr())
story.append(body("Tabel berikut membandingkan dimensi kunci dari setiap provider:"))
story.append(spacer(6))

# Short comparison
headers_main = ["Provider", "Harga/Bulan", "AI Chatbot", "Broadcast", "Shared Inbox", "Coexistence", "Mobile App", "Support Lokal", "Rating"]
rows_main = [
    ["Chakra Chat", "$12.49", "✓ AI Agent", "✓", "✓", "✓ YA", "✓", "⭐⭐⭐⭐⭐", "4.5/5"],
    ["Opaper", "~Rp500rb", "Dasar", "✓", "✓", "Terbatas", "Terbatas", "⭐⭐⭐⭐⭐", "4.0/5"],
    ["CklikWa", "~Rp300rb", "Terbatas", "✓", "✓", "—", "—", "⭐⭐⭐⭐", "3.8/5"],
    ["ChatnBoom", "~Rp500rb", "Dasar", "✓", "✓", "—", "—", "⭐⭐⭐⭐", "3.5/5"],
    ["ManyChat", "$15+", "✓ AI Flow", "✓", "✓", "—", "✓", "⭐⭐", "4.3/5"],
    ["Aisensy", "$45", "✓✓ Kuat", "✓✓✓", "✓", "Terbatas", "✓", "⭐⭐", "4.4/5"],
    ["Wati", "$49", "✓✓ Matang", "✓✓", "✓✓✓", "—", "✓", "⭐⭐", "3.6/5*"],
    ["Maxchat", "Rp850rb", "✓ AI Agent", "✓✓", "✓✓✓", "Terbatas", "✓", "⭐⭐⭐⭐⭐", "4.2/5"],
    ["Respond.io", "$79", "✓✓ AI Agent", "✓✓", "✓✓✓", "Terbatas", "✓", "⭐⭐⭐", "4.4/5"],
    ["Interakt", "$14/qtr", "✓✓ Haptik AI", "✓✓", "✓✓", "—", "✓", "⭐⭐", "4.1/5"],
    ["Gallabox", "$89", "✓ AI Agent", "✓✓", "✓✓", "—", "✓", "⭐⭐", "4.3/5"],
    ["Qiscus", "$115", "✓✓✓ Robolabs", "✓✓", "✓✓✓", "Terbatas", "✓", "⭐⭐⭐⭐⭐", "4.2/5"],
    ["Mekari Qontak", "~$125-310", "✓✓✓ Agentic AI", "✓✓✓", "✓✓✓", "—", "✓", "⭐⭐⭐⭐⭐", "4.0/5"],
]

main_tbl = make_table(
    headers_main, rows_main,
    [2.4*cm, 2*cm, 2.2*cm, 1.6*cm, 1.8*cm, 2*cm, 1.8*cm, 2.2*cm, 1.5*cm]
)
story.append(main_tbl)
story.append(spacer(8))
story.append(Paragraph("*Rating Wati: skor Trustpilot ~3.6 karena keluhan biaya; G2 memberi 4.6.", style_small))
story.append(PageBreak())

# ╔══════════════════════════════════════════════════════════════╗
# ║         5. PROFIL DETAIL MASING-MASING                      ║
# ╚══════════════════════════════════════════════════════════════╝

story.append(heading("5. Profil Detail Masing-Masing Provider"))
story.append(hr())

# ─── 5.1 Chakra Chat ──────────────────────────────────────────
story.append(heading("5.1 Chakra Chat — Lokal, Harga Termurah", level=2))
story.append(body(
    "<b>Website:</b> chakrahq.com | <b>Asal:</b> Indonesia | <b>Harga:</b> Mulai <b>$12.49/bulan</b> (semua fitur unlocked)"
))
story.append(spacer(4))
story.append(body("<b>Fitur Unggulan:</b>"))
story.append(bullet("WhatsApp API resmi (Mitra Meta) — shared team inbox lengkap"))
story.append(bullet("<b>WhatsApp Coexistence</b>: Fitur UNIK — bisa pakai nomor WhatsApp yang sama di HP dan dashboard API bersamaan, tanpa migrasi rumit."))
story.append(bullet("AI Agent + Chatbot dengan natural language understanding"))
story.append(bullet("Lead management & sales pipeline built-in"))
story.append(bullet("Broadcast messaging + workflow campaigns"))
story.append(bullet("Integrasi Shopify & e-commerce, API/webhook"))
story.append(bullet("Mobile app (iOS & Android)"))
story.append(bullet("<b>Tidak ada markup</b> biaya template Meta → hemat 20-25%"))
story.append(spacer(4))
story.append(body("<b>Kelebihan:</b>"))
story.append(bullet("Harga paling terjangkau di pasar — $12.49/bln (sekitar Rp195rb)", style_pros))
story.append(bullet("Coexistence: tidak perlu nomor baru, tidak ribet migrasi", style_pros))
story.append(bullet("Support aktif bahasa Indonesia", style_pros))
story.append(bullet("Semua fitur langsung unlocked sejak paket dasar", style_pros))
story.append(spacer(4))
story.append(body("<b>Kekurangan:</b>"))
story.append(bullet("Fitur AI dan integrasi e-commerce masih terus dikembangkan", style_cons))
story.append(bullet("Brand awareness masih di bawah Wati dan Qiscus", style_cons))
story.append(spacer(6))
story.append(body("<b>Cocok untuk:</b> UKM, startup, bisnis yang ingin migrasi ke WA API tanpa biaya besar dan tetap simpel."))
story.append(spacer(8))

# ─── 5.2 Wati ─────────────────────────────────────────────────
story.append(heading("5.2 Wati — Global, Fitur Matang, Biaya Perlu Dicermati", level=2))
story.append(body(
    "<b>Website:</b> wati.io | <b>Asal:</b> India (populer di Indonesia) | <b>Harga:</b> Growth $49/bln, Pro $99/bln, Business $299/bln (annual)"
))
story.append(spacer(4))
story.append(body("<b>Fitur Unggulan:</b>"))
story.append(bullet("Official Meta BSP — verifikasi nomor & approval template otomatis"))
story.append(bullet("Shared team inbox terbersih di kelasnya (menurut review Hack'celeration)"))
story.append(bullet("No-code chatbot builder — sampai 200 langkah otomasi"))
story.append(bullet("Broadcast campaigns + analitik Click-to-WhatsApp Ads"))
story.append(bullet("Multi-agent support, routing, assignment"))
story.append(bullet("AI-assisted template approval (fitur baru)"))
story.append(spacer(4))
story.append(body("<b>Kelebihan:</b>"))
story.append(bullet("UI/UX sangat rapi dan mudah dipakai", style_pros))
story.append(bullet("Chatbot builder powerful untuk FAQ dan otomasi support", style_pros))
story.append(bullet("Ekosistem integrasi luas", style_pros))
story.append(spacer(4))
story.append(body("<b>Kekurangan & ⚠️ PERINGATAN:</b>"))
story.append(bullet("Markup ~20% di atas biaya Meta per pesan — tagihan bisa 5x lipat dari harga iklan", style_cons))
story.append(bullet("Biaya per user tambahan, trigger top-up ~$40/1000, biaya per seat", style_cons))
story.append(bullet("Trustpilot ~3.6 — banyak keluhan post-cancellation charges, no-refund policy", style_cons))
story.append(bullet("Fitur AI advanced hanya di paket Pro/Business", style_cons))
story.append(bullet("Tidak ada native mobile app (hanya web/desktop)", style_cons))
story.append(spacer(6))
story.append(review_box("Review Hack'celeration (2026): 'Buy it with the real cost in front of you, not the headline.' — Tagihan riil tim menengah di paket Pro bisa ~$500/bulan."))
story.append(spacer(4))
story.append(body("<b>Cocok untuk:</b> UKM menengah (3-50 agent) yang butuh WhatsApp API rapi dan sudah siap dengan total biaya sebenarnya."))
story.append(spacer(8))

# ─── 5.3 Qiscus ──────────────────────────────────────────────
story.append(heading("5.3 Qiscus (Robolabs) — Enterprise Indonesia, AI Agent Canggih", level=2))
story.append(body(
    "<b>Website:</b> qiscus.com | <b>Asal:</b> Indonesia (Yogyakarta) | <b>Harga:</b> Startup $115/bln, Grow $270/bln, Enterprise custom"
))
story.append(spacer(4))
story.append(body("<b>Fitur Unggulan:</b>"))
story.append(bullet("<b>Robolabs AI:</b> LLM-powered AI agent — bisa memahami intent pelanggan dan merespons natural"))
story.append(bullet("Custom brand tone & personality dalam percakapan AI"))
story.append(bullet("Omnichannel lengkap: WA, IG, FB, live chat, marketplace"))
story.append(bullet("SDK developer-friendly — embed chat di app sendiri"))
story.append(bullet("Analitik performa AI agent + dashboard lengkap"))
story.append(bullet("Integrasi CRM, ERP, dan sistem existing"))
story.append(spacer(4))
story.append(body("<b>Kelebihan:</b>"))
story.append(bullet("Teknologi AI agent paling matang di antara provider lokal", style_pros))
story.append(bullet("Support lokal kuat, kantor di Indonesia", style_pros))
story.append(bullet("Cocok untuk enterprise dengan volume chat tinggi", style_pros))
story.append(spacer(4))
story.append(body("<b>Kekurangan:</b>"))
story.append(bullet("Harga tinggi — tidak cocok untuk UKM kecil", style_cons))
story.append(bullet("Kurva belajar lebih curam untuk setup penuh", style_cons))
story.append(bullet("Biaya tambahan untuk fitur AI advanced", style_cons))
story.append(spacer(6))
story.append(body("<b>Cocok untuk:</b> Perusahaan menengah-besar, e-commerce besar, bisnis dengan tim CS 10+ orang."))
story.append(spacer(8))

# ─── 5.4 Mekari Qontak ───────────────────────────────────────
story.append(heading("5.4 Mekari Qontak — Omnichannel CRM + Agentic AI", level=2))
story.append(body(
    "<b>Website:</b> qontak.com | <b>Asal:</b> Indonesia (Mekari Group) | <b>Harga:</b> Enterprise ~Rp2-5jt/bln (estimasi)"
))
story.append(spacer(4))
story.append(body("<b>Fitur Unggulan:</b>"))
story.append(bullet("<b>Agentic AI</b> — AI yang bisa mengambil tindakan (bukan sekadar chat), klaim bisa closing deal dalam 30 detik"))
story.append(bullet("Omnichannel CRM: WA, IG, email, web chat, telepon dalam satu dashboard"))
story.append(bullet("Sales pipeline CRM + manajemen deal"))
story.append(bullet("Broadcast WhatsApp resmi + template message"))
story.append(bullet("Ticketing system + SLA management"))
story.append(bullet("Sertifikasi ISO 27001 + Komdigi + Meta Business Partner"))
story.append(spacer(4))
story.append(body("<b>Kelebihan:</b>"))
story.append(bullet("All-in-one: CRM + omnichannel + AI dalam satu platform", style_pros))
story.append(bullet("Keamanan enterprise (ISO 27001)", style_pros))
story.append(bullet("Integrasi dengan ekosistem Mekari (HR, Finance, dll)", style_pros))
story.append(spacer(4))
story.append(body("<b>Kekurangan:</b>"))
story.append(bullet("Harga tidak transparan — harus hubungi sales", style_cons))
story.append(bullet("Overkill untuk bisnis kecil", style_cons))
story.append(bullet("Paket dasar tidak tersedia — langsung enterprise", style_cons))
story.append(spacer(6))
story.append(body("<b>Cocok untuk:</b> Korporasi, perusahaan menengah-besar yang