import os
import sys
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, HRFlowable
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfgen import canvas

class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 9)
        self.setFillColor(colors.HexColor("#7E6861"))
        
        # Header (setiap halaman kecuali halaman 1)
        if self._pageNumber > 1:
            self.drawString(54, 800, "MANUAL BOOK — SISTEM TOKO KUE EDELYS")
            self.setStrokeColor(colors.HexColor("#EFEBE9"))
            self.setLineWidth(0.5)
            self.line(54, 792, 541, 792)

        # Footer
        self.setStrokeColor(colors.HexColor("#EFEBE9"))
        self.setLineWidth(0.5)
        self.line(54, 45, 541, 45)
        
        page_str = f"Halaman {self._pageNumber} dari {page_count}"
        self.drawRightString(541, 30, page_str)
        self.drawString(54, 30, "© Toko Kue Edelys — Hak Cipta Dilindungi")
        self.restoreState()

def generate_pdf():
    root_dir = r"c:\Users\Cahaya\Documents\file cahaya\PROJECTSKRIPSI"
    output_dir = os.path.join(root_dir, "assets", "downloads")
    os.makedirs(output_dir, exist_ok=True)
    
    pdf_path_assets = os.path.join(output_dir, "Manual_Penggunaan_Toko_Kue_Edelys.pdf")
    pdf_path_root = os.path.join(root_dir, "Manual_Penggunaan_Toko_Kue_Edelys.pdf")

    doc = SimpleDocTemplate(
        pdf_path_assets,
        pagesize=A4,
        leftMargin=54,
        rightMargin=54,
        topMargin=54,
        bottomMargin=54
    )

    styles = getSampleStyleSheet()
    
    # Custom Styles
    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Heading1'],
        fontName='Helvetica-Bold',
        fontSize=24,
        leading=28,
        textColor=colors.HexColor("#3E2723"),
        alignment=0,
        spaceAfter=6
    )
    
    subtitle_style = ParagraphStyle(
        'DocSubTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=12,
        leading=16,
        textColor=colors.HexColor("#C5A880"),
        spaceAfter=15
    )

    h1_style = ParagraphStyle(
        'Heading1_Custom',
        parent=styles['Heading1'],
        fontName='Helvetica-Bold',
        fontSize=15,
        leading=19,
        textColor=colors.HexColor("#3E2723"),
        spaceBefore=16,
        spaceAfter=8
    )

    h2_style = ParagraphStyle(
        'Heading2_Custom',
        parent=styles['Heading2'],
        fontName='Helvetica-Bold',
        fontSize=12,
        leading=16,
        textColor=colors.HexColor("#C5A880"),
        spaceBefore=12,
        spaceAfter=6
    )

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9.5,
        leading=14,
        textColor=colors.HexColor("#2C1E1A"),
        spaceAfter=8
    )

    bullet_style = ParagraphStyle(
        'Bullet_Custom',
        parent=body_style,
        leftIndent=15,
        firstLineIndent=-10,
        spaceAfter=4
    )

    callout_style = ParagraphStyle(
        'Callout_Custom',
        parent=body_style,
        fontName='Helvetica-Oblique',
        fontSize=9,
        leading=13,
        textColor=colors.HexColor("#3E2723")
    )

    story = []

    # Banner Title Box
    story.append(Spacer(1, 10))
    story.append(Paragraph("BUKU PANDUAN PENGGUNAAN", subtitle_style))
    story.append(Paragraph("Sistem Informasi Toko Kue Edelys", title_style))
    story.append(Paragraph("Panduan Lengkap untuk Pelanggan, Staff, & Owner / Admin Toko", ParagraphStyle('Sub', fontName='Helvetica', fontSize=10, textColor=colors.HexColor("#7E6861"))))
    story.append(Spacer(1, 12))
    story.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor("#C5A880"), spaceBefore=0, spaceAfter=15))

    # Ringkasan Informasi Sistem Box
    info_data = [
        [Paragraph("<b>Nama Aplikasi</b>", body_style), Paragraph("Sistem Penjualan & Manajemen Toko Kue Edelys", body_style)],
        [Paragraph("<b>Platform & Basis Data</b>", body_style), Paragraph("PHP (Native Core) & MySQL Database (XAMPP / phpMyAdmin)", body_style)],
        [Paragraph("<b>Fitur Utama</b>", body_style), Paragraph("Katalog Interaktif, Keranjang & Checkout, Upload Bukti Transfer, Verifikasi Pembayaran Admin, Manajemen Produk & Foto, Mutasi Stok, Laporan Penjualan.", body_style)],
        [Paragraph("<b>Akses Default Admin</b>", body_style), Paragraph("URL: <i>/admin/login.php</i> | Username: <b>admin</b> | Password: <b>admin123</b>", body_style)]
    ]
    t = Table(info_data, colWidths=[130, 357])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#FAF8F5")),
        ('BORDER', (0,0), (-1,-1), 0.5, colors.HexColor("#EFEBE9")),
        ('PADDING', (0,0), (-1,-1), 8),
        ('VALIGN', (0,0), (-1,-1), 'TOP')
    ]))
    story.append(t)
    story.append(Spacer(1, 15))

    # BAB 1: PENDAHULUAN
    story.append(Paragraph("1. Pendahuluan & Gambaran Umum", h1_style))
    story.append(Paragraph("Aplikasi Toko Kue Edelys dirancang untuk mempermudah operasional pemesanan kue secara daring bagi pelanggan, sekaligus memberikan kontrol penuh kepada Admin, Owner, dan Staff dalam mengelola pesanan, stok kue, kategori, bukti pembayaran, hingga laporan keuangan.", body_style))
    story.append(Paragraph("Sistem dibagi menjadi dua bagian utama:", body_style))
    story.append(Paragraph("• <b>Halaman Utama (Pelanggan)</b>: Memungkinkan pelanggan melihat katalog produk, menyaring berdasarkan kategori, memasukkan kue ke keranjang, melakukan checkout, mengunggah bukti transfer, dan mengonfirmasi via WhatsApp.", bullet_style))
    story.append(Paragraph("• <b>Portal Admin (Owner & Staff)</b>: Memungkinkan pengelola memverifikasi pembayaran pelanggan, memperbarui status pesanan, menambah/mengedit produk & foto kue, mengelola kategori, mencatat stok masuk/keluar, dan mencetak laporan penjualan.", bullet_style))

    story.append(Spacer(1, 10))

    # BAB 2: PANDUAN PELANGGAN
    story.append(Paragraph("2. Panduan Penggunaan Sisi Pelanggan (Customer)", h1_style))
    
    story.append(Paragraph("2.1 Menjelajahi Katalog & Filter Kategori", h2_style))
    story.append(Paragraph("Pelanggan dapat melihat daftar kue premium pada halaman utama (<code>index.php</code>). Untuk mempermudah pencarian, pelanggan dapat mengklik tombol kategori di bagian atas katalog (seperti <i>Cake, Cheesecake, Crepe, Kue Basah, Kue Kering</i>). Setiap kartu produk menampilkan nama, deskripsi, harga, dan sisa stok kue.", body_style))

    story.append(Paragraph("2.2 Memasukkan Kue ke Keranjang & Pemesanan", h2_style))
    story.append(Paragraph("1. Klik tombol <b>Detail</b> pada kue yang diinginkan untuk melihat informasi lengkap.", bullet_style))
    story.append(Paragraph("2. Masukkan jumlah kue (pcs) yang hendak dibeli, lalu klik <b>+ Tambah ke Keranjang</b>.", bullet_style))
    story.append(Paragraph("3. Untuk menyelesaikan belanja, klik ikon <b>Keranjang</b> di navigasi atas.", bullet_style))
    story.append(Paragraph("4. Pada halaman Keranjang Belanja (<code>cart.php</code>), periksa rincian pesanan Anda.", bullet_style))
    story.append(Paragraph("5. Isi formulir pengiriman (Nama Penerima, No. WhatsApp, Alamat Lengkap), pilih metode pembayaran (<i>Transfer Bank BCA</i> atau <i>QRIS</i>), lalu klik <b>Proses & Selesaikan Pemesanan</b>.", bullet_style))

    story.append(Paragraph("2.3 Upload Bukti Transfer & Konfirmasi", h2_style))
    story.append(Paragraph("1. Setelah checkout, sistem mengarahkan Anda ke halaman <b>Pemesanan Berhasil</b> (<code>order_success.php</code>) yang memuat nomor Invoice resmi.", bullet_style))
    story.append(Paragraph("2. Lakukan transfer sesuai nominal total pembayaran ke nomor rekening BCA atau scan QRIS yang tertera.", bullet_style))
    story.append(Paragraph("3. Pilih file gambar foto/screenshot bukti transfer pada bagian <b>Upload Bukti Pembayaran</b> (format: JPG, PNG, WEBP), lalu klik <b>Kirim Bukti Pembayaran</b>.", bullet_style))
    story.append(Paragraph("4. Status pembayaran akan berubah menjadi <i>Bukti Pembayaran Berhasil Diunggah (Menunggu Verifikasi Admin/Staff)</i>. Anda juga dapat mengklik tombol <b>Konfirmasi Pembayaran via WhatsApp</b> untuk menghubungi pihak toko.", bullet_style))

    story.append(Spacer(1, 10))

    # BAB 3: PANDUAN ADMIN & STAFF
    story.append(Paragraph("3. Panduan Penggunaan Portal Admin (Owner & Staff)", h1_style))
    
    story.append(Paragraph("3.1 Login Portal Admin", h2_style))
    story.append(Paragraph("Akses alamat <code>/admin/login.php</code>, kemudian masukkan username dan password akun admin Anda (Default: <b>admin / admin123</b>).", body_style))

    story.append(Paragraph("3.2 Verifikasi Pembayaran & Kelola Pesanan (orders.php)", h2_style))
    story.append(Paragraph("Fitur verifikasi pesanan memungkinkan Admin/Owner/Staff memeriksa keaslian bukti bayar yang dikirim pelanggan:", body_style))
    story.append(Paragraph("1. Buka menu <b>Pesanan</b> pada navigasi sidebar.", bullet_style))
    story.append(Paragraph("2. Kolom <b>Bukti Transfer</b> di tabel utama menampilkan thumbnail gambar beserta indikator status (<i>Diverifikasi</i>, <i>Perlu Verifikasi</i>, atau <i>Belum Unggah</i>).", bullet_style))
    story.append(Paragraph("3. Klik tombol <b>Detail / Verifikasi</b> pada baris pesanan yang ingin diperiksa.", bullet_style))
    story.append(Paragraph("4. Di panel sebelah kanan, gambar bukti transfer ditampilkan dengan jelas. Klik tombol <b>Setujui / Verifikasi</b> untuk memverifikasi pembayaran. Sistem secara otomatis menyetujui pembayaran dan memindahkan status pesanan ke <b>Diproses (Processing)</b>.", bullet_style))
    story.append(Paragraph("5. Jika bukti tidak valid, klik tombol <b>Tolak Bukti</b>.", bullet_style))
    story.append(Paragraph("6. Anda juga dapat memperbarui status transaksi secara manual (<i>Pending, Processing, Completed, Cancelled</i>). Jika pesanan dibatalkan (<i>Cancelled</i>), stok kue akan otomatis dikembalikan ke stok produk secara presisi.", bullet_style))

    story.append(Paragraph("3.3 Tambah Kategori Kue Baru & Upload Foto Produk (products.php)", h2_style))
    story.append(Paragraph("1. Buka menu <b>Produk Kue</b>.", bullet_style))
    story.append(Paragraph("2. <b>Menambah Kategori Baru</b>: Pada panel 'Tambah Kategori Kue Baru', ketikkan nama kategori baru (misal: <i>Tart Special, Donat, Brownies</i>) lalu klik <b>+ Tambah Kategori</b>. Kategori baru akan langsung aktif dan muncul di filter katalog pelanggan.", bullet_style))
    story.append(Paragraph("3. <b>Menambah/Mengedit Produk Kue</b>: Isi Nama Kue, Kategori (dapat memilih dari dropdown atau mengetik kategori baru), Harga, dan Stok Awal.", bullet_style))
    story.append(Paragraph("4. <b>Upload Foto Kue</b>: Klik pada bagian <b>Upload Foto Kue Baru</b> untuk memilih file foto produk asli dari komputer (dukungan format: JPG, JPEG, PNG, WEBP max 5MB). Foto yang diunggah otomatis disimpan ke folder <code>assets/uploads/products/</code> dan menjadi tampilan utama di katalog.", bullet_style))

    story.append(Paragraph("3.4 Mutasi Stok & Laporan Penjualan", h2_style))
    story.append(Paragraph("• <b>Mutasi Stok (<code>stock.php</code>)</b>: Gunakan menu ini untuk mencatat penambahan stok kue dari dapur (Stok Masuk) atau pembuangan kue rusak/kadaluarsa (Stok Keluar) beserta riwayat catatan log.", bullet_style))
    story.append(Paragraph("• <b>Laporan Penjualan (<code>reports.php</code>)</b>: Menampilkan data omset bulanan, statistik kue terlaris, serta fitur cetak laporan penjualan berdasarkan rentang tanggal.", bullet_style))

    story.append(Spacer(1, 10))

    # BAB 4: FREQUENTLY ASKED QUESTIONS (FAQ) & TROUBLESHOOTING
    story.append(Paragraph("4. FAQ & Pemecahan Masalah (Troubleshooting)", h1_style))
    
    faq_table_data = [
        [Paragraph("<b>Pertanyaan / Masalah</b>", body_style), Paragraph("<b>Solusi & Penjelasan</b>", body_style)],
        [
            Paragraph("Ukuran foto kue / bukti transfer terlalu besar saat diunggah", body_style),
            Paragraph("Sistem membatasi maksimal ukuran file gambar sebesar 5MB dengan format JPG, JPEG, PNG, atau WEBP. Pastikan gambar dikompresi sebelum diunggah.", body_style)
        ],
        [
            Paragraph("Bagaimana jika pesanan dibatalkan oleh admin?", body_style),
            Paragraph("Saat status pesanan diubah menjadi <i>Cancelled (Dibatalkan)</i> di menu <code>orders.php</code>, sistem otomatis mengembalikan stok kue yang sempat dipotong kembali ke inventaris gudang.", body_style)
        ],
        [
            Paragraph("Kategori baru tidak tampil di katalog depan", body_style),
            Paragraph("Kategori baru akan otomatis tampil pada tombol filter katalog depan segera setelah terdapat minimal 1 produk aktif yang menggunakan kategori tersebut.", body_style)
        ]
    ]

    t_faq = Table(faq_table_data, colWidths=[180, 307])
    t_faq.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#C5A880")),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#EFEBE9")),
        ('PADDING', (0,0), (-1,-1), 6),
        ('VALIGN', (0,0), (-1,-1), 'TOP')
    ]))
    story.append(t_faq)

    doc.build(story, canvasmaker=NumberedCanvas)
    import shutil
    shutil.copyfile(pdf_path_assets, pdf_path_root)
    print(f"PDF berhasil dibuat di: {pdf_path_assets} dan {pdf_path_root}")

if __name__ == '__main__':
    generate_pdf()
