import os
import sys
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
)

def create_cpanel_guide_pdf(output_path):
    os.makedirs(os.path.dirname(output_path), exist_ok=True)
    
    doc = SimpleDocTemplate(
        output_path,
        pagesize=letter,
        rightMargin=36,
        leftMargin=36,
        topMargin=32,
        bottomMargin=32
    )
    
    styles = getSampleStyleSheet()
    
    primary_color = colors.HexColor("#1e429f")     # MAP Blue
    secondary_color = colors.HexColor("#0f172a")   # Dark Slate
    border_color = colors.HexColor("#cbd5e1")
    
    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=18,
        leading=22,
        textColor=primary_color,
        spaceAfter=2
    )
    
    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=10,
        leading=13,
        textColor=colors.HexColor("#475569"),
        spaceAfter=8
    )

    h1_style = ParagraphStyle(
        'Heading1_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=11.5,
        leading=14.5,
        textColor=primary_color,
        spaceBefore=8,
        spaceAfter=4
    )

    h2_style = ParagraphStyle(
        'Heading2_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=9.5,
        leading=12.5,
        textColor=secondary_color,
        spaceBefore=5,
        spaceAfter=2
    )

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8.5,
        leading=11.5,
        textColor=colors.HexColor("#1e293b"),
        spaceAfter=4
    )

    bold_body_style = ParagraphStyle(
        'BoldBody_Custom',
        parent=body_style,
        fontName='Helvetica-Bold'
    )

    terminal_code_style = ParagraphStyle(
        'Terminal_Code',
        parent=styles['Normal'],
        fontName='Courier-Bold',
        fontSize=8.5,
        leading=12,
        textColor=colors.HexColor("#ffffff")  # High contrast crisp pure white
    )

    struct_code_style = ParagraphStyle(
        'Struct_Code',
        parent=styles['Normal'],
        fontName='Courier',
        fontSize=8,
        leading=11,
        textColor=colors.HexColor("#f8fafc")
    )

    callout_style = ParagraphStyle(
        'Callout_Text',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8,
        leading=11,
        textColor=colors.HexColor("#065f46")
    )

    elements = []

    # Title & Header
    elements.append(Paragraph("MAP LiveMirror VTON — Panduan Deployment", title_style))
    elements.append(Paragraph("Step-by-Step Cara Install & Deploy Python Backend (FastAPI) di cPanel Rumahweb", subtitle_style))
    
    # Reference Box
    ref_table = Table(
        [[
            Paragraph("<b>Referensi Resmi:</b> <font color='#1e429f'><u>https://www.rumahweb.com/journal/cara-install-python-di-cpanel/</u></font><br/>"
                      "<b>Target Platform:</b> cPanel CloudLinux (Setup Python App / Passenger WSGI) • Python 3.11 / 3.12<br/>"
                      "<b>Timezone Backend:</b> Asia/Jakarta (WIB, UTC+7)", callout_style)
        ]],
        colWidths=[540]
    )
    ref_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#ecfdf5")),
        ('BORDER', (0,0), (-1,-1), 1, colors.HexColor("#6ee7b7")),
        ('TOPPADDING', (0,0), (-1,-1), 5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 5),
        ('LEFTPADDING', (0,0), (-1,-1), 8),
        ('RIGHTPADDING', (0,0), (-1,-1), 8),
    ]))
    elements.append(ref_table)
    elements.append(Spacer(1, 6))

    # SECTION 1: Struktur File Proyek
    elements.append(Paragraph("1. Persiapan File & Struktur Proyek (Pre-Deployment)", h1_style))
    elements.append(Paragraph(
        "Di cPanel CloudLinux Passenger, aplikasi FastAPI (ASGI) dihubungkan menggunakan adapter <b>a2wsgi</b> di dalam file <b>passenger_wsgi.py</b>. "
        "Pastikan struktur folder backend Anda tersusun rapi sebagai berikut:",
        body_style
    ))

    struct_text = (
        "<font color='#38bdf8'><b>mapvton-backend/</b></font><br/>"
        "  |-- <font color='#fbbf24'><b>app/</b></font><br/>"
        "  |    |-- <b>api/</b> (Endpoints v1: clothes, fleet telemetry, api keys, rembg)<br/>"
        "  |    |-- <b>models/</b> (Database SQLAlchemy models dengan timezone Asia/Jakarta)<br/>"
        "  |    |-- <b>services/</b> (Rembg ONNX service, Fleet WebSocket telemetry)<br/>"
        "  |    |-- <b>static/</b> (uploads/clothes, uploads/cutouts, images/map_logo.png)<br/>"
        "  |    |-- <b>templates/</b> (Web Dashboard Fleet Management HTML/Tailwind)<br/>"
        "  |    |-- <b>database.py</b> &amp; <b>main.py</b><br/>"
        "  |-- <font color='#4ade80'><b>passenger_wsgi.py</b></font> (Jembatan cPanel CloudLinux Passenger -&gt; FastAPI)<br/>"
        "  \\-- <font color='#4ade80'><b>requirements.txt</b></font> (fastapi, a2wsgi, uvicorn, sqlalchemy, rembg, pillow, dll.)"
    )
    struct_table = Table([[Paragraph(struct_text, struct_code_style)]], colWidths=[540])
    struct_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#0f172a")),
        ('BORDER', (0,0), (-1,-1), 1, colors.HexColor("#334155")),
        ('PADDING', (0,0), (-1,-1), 6),
    ]))
    elements.append(struct_table)
    elements.append(Spacer(1, 6))

    # SECTION 2: Setup Python App di cPanel
    elements.append(Paragraph("2. Membuat Aplikasi di Setup Python App cPanel", h1_style))
    elements.append(Paragraph("1. Login ke <b>cPanel Rumahweb</b> (melalui ClientZone atau <i>https://domainanda.com:2083</i>).", body_style))
    elements.append(Paragraph("2. Scroll ke bagian <b>SOFTWARE</b> dan klik menu <b>Setup Python App</b>.", body_style))
    elements.append(Paragraph("3. Klik tombol biru <b>Create Application</b> di pojok kanan atas.", body_style))
    elements.append(Paragraph("4. Isi formulir konfigurasi persis seperti tabel di bawah:", body_style))

    cpanel_config_data = [
        [Paragraph("<b>Field Pengaturan</b>", bold_body_style), Paragraph("<b>Nilai Rekomendasi</b>", bold_body_style), Paragraph("<b>Keterangan</b>", bold_body_style)],
        [Paragraph("<b>Python version</b>", body_style), Paragraph("<font color='#1e429f'><b>3.11</b></font> atau <b>3.12</b>", bold_body_style), Paragraph("Gunakan Python modern yang mendukung ZoneInfo", body_style)],
        [Paragraph("<b>Application root</b>", body_style), Paragraph("<b>mapvton-backend</b>", bold_body_style), Paragraph("Nama folder di <i>/home/username/mapvton-backend</i>", body_style)],
        [Paragraph("<b>Application URL</b>", body_style), Paragraph("<b>vton.domainanda.com</b>", bold_body_style), Paragraph("Domain atau Subdomain tujuan aplikasi", body_style)],
        [Paragraph("<b>Application startup file</b>", body_style), Paragraph("<b>passenger_wsgi.py</b>", bold_body_style), Paragraph("File entry script yang mengeksekusi aplikasi", body_style)],
        [Paragraph("<b>Application Entry point</b>", body_style), Paragraph("<b>application</b>", bold_body_style), Paragraph("Variabel WSGI callable di dalam passenger_wsgi.py", body_style)],
        [Paragraph("<b>Passenger log file</b>", body_style), Paragraph("<b>passenger.log</b> (opsional)", bold_body_style), Paragraph("Log aktivitas &amp; error dari Passenger WSGI", body_style)],
    ]
    t_config = Table(cpanel_config_data, colWidths=[130, 150, 260])
    t_config.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#f1f5f9")),
        ('GRID', (0,0), (-1,-1), 0.5, border_color),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('PADDING', (0,0), (-1,-1), 3.5),
    ]))
    elements.append(t_config)
    elements.append(Paragraph("5. Klik tombol <b>CREATE</b> di pojok kanan atas.", body_style))
    elements.append(Spacer(1, 6))

    # SECTION 3: Upload File ke cPanel File Manager
    elements.append(Paragraph("3. Mengunggah File Proyek ke File Manager", h1_style))
    elements.append(Paragraph(
        "1. Di cPanel, buka <b>File Manager</b> (di kategori <i>Files</i>).<br/>"
        "2. Masuk ke folder aplikasi yang baru dibuat: <b>/home/username/mapvton-backend/</b>.<br/>"
        "3. Klik tombol <b>Upload</b>, pilih file zip proyek (misal: <i>backend.zip</i>).<br/>"
        "4. Setelah upload 100% selesai, klik kanan file zip tersebut lalu pilih <b>Extract</b>.<br/>"
        "5. <b>Atur Permissions:</b> Pastikan folder <b>app/static/uploads</b> memiliki permission <b>755</b> atau <b>775</b> agar upload foto baju dari web dashboard berjalan lancar.",
        body_style
    ))
    elements.append(Spacer(1, 6))

    # Page break to keep Section 4, 5, 6 together on Page 2 cleanly
    elements.append(PageBreak())

    # SECTION 4: Install Dependencies
    elements.append(Paragraph("4. Instalasi Dependency / Library Python", h1_style))
    elements.append(Paragraph("<b>Opsi A: Menggunakan cPanel Terminal (Paling Direkomendasikan &amp; Cepat)</b>", h2_style))
    elements.append(Paragraph(
        "1. Di halaman <b>Setup Python App</b>, salin perintah aktivasi virtualenv yang berada di kotak kuning paling atas, contoh:",
        body_style
    ))
    
    # Command 1 Box - High Contrast Pure White Text on Dark Navy Background
    cmd1_text = "<font color='#ffffff'><b>source /home/username/virtualenv/mapvton-backend/3.11/bin/activate &amp;&amp; cd /home/username/mapvton-backend</b></font>"
    cmd_box = Table(
        [[Paragraph(cmd1_text, terminal_code_style)]],
        colWidths=[540]
    )
    cmd_box.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#0f172a")),
        ('BORDER', (0,0), (-1,-1), 1, colors.HexColor("#38bdf8")),
        ('TOPPADDING', (0,0), (-1,-1), 7),
        ('BOTTOMPADDING', (0,0), (-1,-1), 7),
        ('LEFTPADDING', (0,0), (-1,-1), 10),
        ('RIGHTPADDING', (0,0), (-1,-1), 10),
    ]))
    elements.append(cmd_box)
    elements.append(Spacer(1, 4))
    elements.append(Paragraph(
        "2. Buka menu <b>Terminal</b> di cPanel, paste perintah di atas lalu tekan <b>Enter</b>.<br/>"
        "3. Jalankan perintah instalasi dependency berikut:",
        body_style
    ))

    # Command 2 Box - High Contrast Pure White Text on Dark Navy Background
    cmd2_text = "<font color='#ffffff'><b>pip install --upgrade pip<br/>pip install -r requirements.txt</b></font>"
    pip_box = Table(
        [[Paragraph(cmd2_text, terminal_code_style)]],
        colWidths=[540]
    )
    pip_box.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#0f172a")),
        ('BORDER', (0,0), (-1,-1), 1, colors.HexColor("#38bdf8")),
        ('TOPPADDING', (0,0), (-1,-1), 7),
        ('BOTTOMPADDING', (0,0), (-1,-1), 7),
        ('LEFTPADDING', (0,0), (-1,-1), 10),
        ('RIGHTPADDING', (0,0), (-1,-1), 10),
    ]))
    elements.append(pip_box)
    elements.append(Spacer(1, 6))

    elements.append(Paragraph("<b>Opsi B: Menggunakan Tombol Pip di cPanel UI</b>", h2_style))
    elements.append(Paragraph(
        "1. Di halaman <b>Setup Python App</b>, scroll ke bagian <b>Configuration files</b>.<br/>"
        "2. Ketik <b>requirements.txt</b> lalu klik <b>Add</b>.<br/>"
        "3. Klik tombol <b>Run Pip Install</b> di samping file requirements.txt.",
        body_style
    ))
    elements.append(Spacer(1, 8))

    # SECTION 5: Environment Variables & Restart
    elements.append(Paragraph("5. Konfigurasi Environment &amp; Restart Aplikasi", h1_style))
    elements.append(Paragraph(
        "1. Di halaman <b>Setup Python App</b>, scroll ke bagian <b>Environment variables</b>:<br/>"
        "   &bull; <b>TIMEZONE</b> = <font color='#059669'><b>Asia/Jakarta</b></font><br/>"
        "   &bull; <b>DEFAULT_DECART_API_KEY</b> = <font color='#1e429f'><b>dct_mapmirrovton1_pDDIZqPuydEshqGXLumKLVjJQIYQZTagJYIMRuGWhmVHNHRlLQkKBPpegiQmfjRW</b></font><br/>"
        "2. Klik tombol <b>Done</b> lalu klik <b>Save</b> di pojok kanan atas.<br/>"
        "3. Klik tombol <b>Restart</b> untuk menerapkan seluruh perubahan.",
        body_style
    ))
    elements.append(Spacer(1, 8))

    # SECTION 6: Pengujian & Integrasi Kiosk
    elements.append(Paragraph("6. Pengujian &amp; Menghubungkan Android Kiosk", h1_style))
    elements.append(Paragraph(
        "<b>A. Uji Coba Web &amp; API di Browser:</b><br/>"
        "&bull; Akses Web Dashboard Fleet: <b>https://vton.domainanda.com/</b><br/>"
        "&bull; Akses Swagger API Docs: <b>https://vton.domainanda.com/docs</b><br/>"
        "&bull; Verifikasi Jam WIB: <b>https://vton.domainanda.com/api/v1/fleet/devices</b><br/><br/>"
        "<b>B. Menghubungkan Aplikasi Android Kiosk:</b><br/>"
        "1. Buka aplikasi <b>MAP LiveMirror</b> di Android Kiosk / Smart Mirror 32\".<br/>"
        "2. Tap <b>5 kali pada Logo MAP</b> untuk membuka dialog Admin Settings.<br/>"
        "3. Masukkan PIN Admin: <b>1234</b>.<br/>"
        "4. Ubah <b>Server URL</b> menjadi URL domain Rumahweb: <b>https://vton.domainanda.com</b>.<br/>"
        "5. Klik <b>Save Settings</b>. Kiosk akan otomatis terhubung (&bull; Fleet Synced) dan katalog busana langsung sinkron!",
        body_style
    ))

    # Build PDF Document
    doc.build(elements)
    print(f"✓ PDF Re-Generated Successfully with High Contrast Text at: {output_path}")

if __name__ == "__main__":
    out = "/Users/prahata/Documents/3.Tutorial/image_processing_clothesmatching_rev_decart/Panduan_Deploy_Python_Backend_cPanel_Rumahweb.pdf"
    create_cpanel_guide_pdf(out)
