import docx
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
import os

DOCX_PATH = r"C:\xampp\htdocs\os sm ctc\SME_Restaurant_OS_Manual.docx"
SCREENSHOT_DIR = r"C:\xampp\htdocs\os sm ctc\images"

def set_cell_background(cell, fill_hex):
    tcPr = cell._element.get_or_add_tcPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), fill_hex)
    tcPr.append(shd)

def set_cell_margins(cell, top=120, bottom=120, left=150, right=150):
    tcPr = cell._element.get_or_add_tcPr()
    tcMar = OxmlElement('w:tcMar')
    for m, val in [('top', top), ('bottom', bottom), ('left', left), ('right', right)]:
        node = OxmlElement(f'w:{m}')
        node.set(qn('w:w'), str(val))
        node.set(qn('w:type'), 'dxa')
        tcMar.append(node)
    tcPr.append(tcMar)

def build_user_manual():
    doc = docx.Document()

    # ตั้งค่าหน้ากระดาษ A4
    for section in doc.sections:
        section.page_width = Inches(8.27)
        section.page_height = Inches(11.69)
        section.left_margin = Inches(1.0)
        section.right_margin = Inches(1.0)
        section.top_margin = Inches(1.0)
        section.bottom_margin = Inches(1.0)

    # Style มาตรฐาน TH Sarabun PSK
    style = doc.styles['Normal']
    font = style.font
    font.name = 'TH Sarabun PSK'
    font.size = Pt(16)
    font.color.rgb = RGBColor(30, 41, 59)
    style.paragraph_format.line_spacing = 1.15
    style.paragraph_format.space_after = Pt(4)

    def add_title(text):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(22)
        run.font.bold = True
        run.font.color.rgb = RGBColor(255, 107, 0)
        p.paragraph_format.space_before = Pt(8)
        p.paragraph_format.space_after = Pt(4)
        return p

    def add_subtitle(text):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(16)
        run.font.bold = True
        run.font.color.rgb = RGBColor(71, 85, 105)
        p.paragraph_format.space_after = Pt(12)
        return p

    def add_chapter_header(text):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(18)
        run.font.bold = True
        run.font.color.rgb = RGBColor(15, 23, 42)
        p.paragraph_format.space_before = Pt(14)
        p.paragraph_format.space_after = Pt(6)
        return p

    def add_section_header(text):
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(16)
        run.font.bold = True
        run.font.color.rgb = RGBColor(255, 107, 0)
        p.paragraph_format.space_before = Pt(10)
        p.paragraph_format.space_after = Pt(4)
        return p

    def add_body(text, indent=True):
        p = doc.add_paragraph()
        if indent:
            p.paragraph_format.first_line_indent = Inches(0.4)
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(16)
        p.paragraph_format.space_after = Pt(4)
        return p

    def add_bullet(text, level=1):
        p = doc.add_paragraph()
        p.paragraph_format.left_indent = Inches(0.3 * level)
        p.paragraph_format.first_line_indent = Inches(-0.15)
        r_dot = p.add_run("•  ")
        r_dot.font.name = 'TH Sarabun PSK'
        r_dot.font.bold = True
        r_dot.font.color.rgb = RGBColor(255, 107, 0)
        run = p.add_run(text)
        run.font.name = 'TH Sarabun PSK'
        run.font.size = Pt(16)
        p.paragraph_format.space_after = Pt(3)
        return p

    def add_callout(title, text, bg_hex="F1F5F9", border_color="00E5FF"):
        tbl = doc.add_table(rows=1, cols=1)
        tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
        cell = tbl.cell(0, 0)
        cell.width = Inches(6.27)
        set_cell_background(cell, bg_hex)
        set_cell_margins(cell, top=140, bottom=140, left=180, right=180)
        p = cell.paragraphs[0]
        p.paragraph_format.space_after = Pt(2)
        r1 = p.add_run(f"📌 {title}\n")
        r1.font.name = 'TH Sarabun PSK'
        r1.font.size = Pt(16)
        r1.font.bold = True
        r1.font.color.rgb = RGBColor(15, 23, 42)
        r2 = p.add_run(text)
        r2.font.name = 'TH Sarabun PSK'
        r2.font.size = Pt(15)
        doc.add_paragraph().paragraph_format.space_after = Pt(4)

    def add_img(img_name, caption, width_inch=5.8):
        img_path = os.path.join(SCREENSHOT_DIR, img_name)
        if not os.path.exists(img_path):
            img_path = os.path.join(r"C:\xampp\htdocs\os sm ctc", img_name)
        if os.path.exists(img_path):
            p_img = doc.add_paragraph()
            p_img.alignment = WD_ALIGN_PARAGRAPH.CENTER
            p_img.paragraph_format.space_before = Pt(6)
            p_img.paragraph_format.space_after = Pt(2)
            run = p_img.add_run()
            run.add_picture(img_path, width=Inches(width_inch))
            
            p_cap = doc.add_paragraph()
            p_cap.alignment = WD_ALIGN_PARAGRAPH.CENTER
            p_cap.paragraph_format.space_after = Pt(8)
            r_cap = p_cap.add_run(f"ภาพที่: {caption}")
            r_cap.font.name = 'TH Sarabun PSK'
            r_cap.font.size = Pt(14)
            r_cap.font.italic = True
            r_cap.font.color.rgb = RGBColor(100, 116, 139)

    # ==================== COVER / HEADER ====================
    add_title("คู่มือการใช้งานระบบ SME Restaurant OS (User Manual)")
    add_subtitle("ระบบบริหารจัดการร้านอาหารและสั่งอาหารออนไลน์อัจฉริยะ\nครอบคลุมตั้งแต่การสมัครแพ็กเกจ การใช้งานร้านค้า และระบบผู้ดูแลระบบ (Admin)")
    
    add_callout(
        "คำแนะนำด้านความปลอดภัยและการเข้าใช้งานระบบ",
        "• ร้านอาหารสามารถเข้าสู่ระบบผ่านบัญชีร้านค้าที่ได้รับจากการลงทะเบียน\n"
        "• ผู้ดูแลระบบ (Admin) สามารถเข้าสู่ระบบผ่านบัญชีส่วนกลางที่ได้รับมอบหมายตามสิทธิ์\n"
        "• URL หน้าเว็บระบบหลัก: https://pos.cm.in.th/"
    )

    doc.add_page_break()

    # ==================== ส่วนที่ 1 ====================
    add_chapter_header("ส่วนที่ 1: การสมัครใช้บริการและการเลือกแพ็กเกจ (Subscription & Registration)")
    add_body("ระบบ SME Restaurant OS ออกแบบให้ผู้ประกอบการสามารถเลือกแพ็กเกจที่เหมาะสมกับขนาดธุรกิจ พร้อมสิทธิ์ทดลองใช้งานฟรี (Free Trial) 30 วัน ทุกแพ็กเกจ โดยไม่ต้องลงโปรแกรมหรือซื้ออุปกรณ์ฮาร์ดแวร์เพิ่มเติม")
    
    add_section_header("1.1 หน้า Portal และข้อมูลแพ็กเกจบริการ")
    add_body("ผู้ประกอบการสามารถเข้าสู่หน้าหลักผ่านทางเว็บบราวเซอร์ เพื่อดูข้อมูลคุณสมบัติระบบ จุดเด่น และตารางเปรียบเทียบแพ็กเกจราคา ซึ่งประกอบด้วย 3 แพ็กเกจหลัก:")
    add_bullet("Starter Package (฿490/เดือน): เหมาะสำหรับร้านค้าขนาดเล็ก รองรับการสั่งอาหารผ่าน QR Code และจัดการเมนูอาหารพื้นฐาน")
    add_bullet("Standard Package (฿990/เดือน - ยอดนิยม): เหมาะกับร้านหมูกระทะ ชาบู บุฟเฟต์ มีระบบจัดการผังโต๊ะ จอรับออเดอร์ครัว (KDS) และ PromptPay QR Code")
    add_bullet("Premium Package (฿1,590/เดือน): ร้านอาหารเต็มรูปแบบ ปลดล็อกระบบคำนวณเวลารออาหารจริง (Lead Time Module) และรายงานวิเคราะห์ยอดขายเชิงลึก")

    add_img("01_landing_portal.png", "1.1 หน้า Portal หลักของระบบ SME Restaurant OS")
    add_img("02_landing_packages.png", "1.2 ตารางแพ็กเกจราคาและการทดลองใช้งานฟรี 30 วัน")

    add_section_header("1.2 ขั้นตอนการลงทะเบียนสมัครใช้งาน")
    add_body("เมื่อผู้ประกอบการเลือกแพ็กเกจที่ต้องการ ระบบจะแสดงหน้าต่างแบบฟอร์มลงทะเบียน (Registration Form) เพื่อกรอกข้อมูลสำคัญ ได้แก่:")
    add_bullet("1. ระบุชื่อร้านอาหาร (Shop Name)")
    add_bullet("2. ระบุชื่อ-นามสกุลของผู้ติดต่อหรือเจ้าของร้าน (Contact Owner)")
    add_bullet("3. ระบุเบอร์โทรศัพท์ติดต่อ (Phone Number)")
    add_bullet("4. กดปุ่ม 'ยืนยันสมัครเข้าร่วม' หรือปุ่ม 'ไปสมัครที่ pos.cm.in.th' เพื่อเริ่มต้นเข้าใช้งานระบบร้านค้าทันที")

    add_img("03_package_registration_modal.png", "1.3 แบบฟอร์มลงทะเบียนสมัครใช้งานแพ็กเกจ")

    doc.add_page_break()

    # ==================== ส่วนที่ 2 ====================
    add_chapter_header("ส่วนที่ 2: คู่มือการใช้งานสำหรับร้านค้า (Restaurant User Guide)")
    add_body("คู่มือส่วนนี้อธิบายขั้นตอนการทำงานของร้านค้า ตั้งแต่การเข้าสู่ระบบ การจัดการเมนูอาหาร การตั้งค่าผังโต๊ะ การรับออเดอร์ในครัว (KDS) และการคิดเงินหน้าร้าน")

    add_section_header("2.1 การเข้าสู่ระบบร้านค้า (Shop Login)")
    add_body("ขั้นตอนการเข้าสู่ระบบของร้านอาหาร:")
    add_bullet("1. ไปที่เว็บไซต์ https://pos.cm.in.th/")
    add_bullet("2. ในส่วน 'เข้าสู่ระบบร้านค้า' ให้กรอกชื่อผู้ใช้งาน (Username) และรหัสผ่าน (Password) ของร้านค้า")
    add_bullet("3. กดปุ่ม 'เข้าสู่ระบบ' เพื่อเข้าสู่หน้าแดชบอร์ดหลักของร้านค้า")

    add_img("04_pos_portal_entry.png", "2.1 หน้าทางเข้าสู่ระบบ POS Portal")
    add_img("06_shop_dashboard.png", "2.2 แดชบอร์ดสรุปภาพรวมร้านค้า (Shop Backoffice Dashboard)")

    add_section_header("2.2 ขั้นตอนการจัดการและเพิ่มเมนูอาหาร (Food Menu Management)")
    add_body("ร้านค้าสามารถเพิ่ม แก้ไข ลบ และจัดการสถานะวัตถุดิบหมดได้ตลอดเวลาผ่านเมนู 'จัดการเมนูอาหาร' โดยมีขั้นตอนดังนี้:")
    add_bullet("1. ไปที่แถบเมนูด้านข้าง คลิกเลือก 'จัดการเมนูอาหาร'")
    add_bullet("2. ระบบจะแสดงรายการเมนูอาหารทั้งหมด พร้อมรูปภาพ หมวดหมู่ ราคา และสถานะพร้อมเสิร์ฟ")
    add_bullet("3. การเพิ่มเมนูใหม่: กดปุ่ม 'เพิ่มรายการอาหาร' (ปุ่มสีส้ม/น้ำเงินด้านบน)")
    add_bullet("4. กรอกข้อมูลรายการอาหาร: ระบุชื่อเมนู, เลือกหมวดหมู่ (เช่น ต้ม, ผัด, ทอด, เครื่องดื่ม), กำหนดราคาขาย, เวลาเฉลี่ยในการปรุง (Lead Time นาที), และอัปโหลดรูปภาพเมนู")
    add_bullet("5. กดปุ่ม 'บันทึกรายการ' เพื่อให้เมนูแสดงผลบนหน้าสั่งอาหารของลูกค้าทันที")
    add_bullet("6. สลับสถานะวัตถุดิบหมด (Out of Stock): สามารถกดปุ่มสลับสถานะเปิด/ปิดเมนูได้ทันทีเมื่อของหมด โดยระบบจะซ่อนจากหน้าสแกนสั่งของลูกค้าอัตโนมัติ")

    add_img("07_shop_menu_management.png", "2.3 หน้ารายการเมนูอาหารทั้งหมดของร้าน")
    add_img("08_shop_add_menu_modal.png", "2.4 หน้าต่างเพิ่มรายการอาหารใหม่และการตั้งราคา")

    add_section_header("2.3 ขั้นตอนการจัดการโต๊ะอาหารและพิมพ์ QR Code ประจำโต๊ะ (Table & QR Management)")
    add_body("ระบบรองรับการกำหนดผังโต๊ะอาหารและสร้าง Dynamic QR Code ประจำโต๊ะอัตโนมัติ:")
    add_bullet("1. คลิกเลือกเมนู 'จัดการโต๊ะ & QR Code' จากแถบเมนูด้านข้าง")
    add_bullet("2. ระบบจะแสดงผังโต๊ะทั้งหมด พร้อมสถานะ (โต๊ะว่าง / กำลังรับประทาน / รอชำระเงิน)")
    add_bullet("3. การเพิ่มโต๊ะอาหาร: กดปุ่ม 'เพิ่มโต๊ะอาหารใหม่' ระบุหมายเลขโต๊ะ (เช่น โต๊ะ 01, โต๊ะ 02) และจำนวนที่นั่ง")
    add_bullet("4. การนำ QR Code ไปใช้งาน: คลิกที่ปุ่ม 'พิมพ์ QR Code' หรือดาวน์โหลด QR ประจำโต๊ะ เพื่อนำไปติดที่โต๊ะอาหาร ให้ลูกค้านำสมาร์ตโฟนมาสแกนสั่งอาหารได้ทันทีโดยไม่ต้องโหลดแอปพลิเคชัน")

    add_img("09_shop_table_management.png", "2.5 หน้าจัดการผังโต๊ะและ QR Code ประจำโต๊ะ")
    add_img("10_shop_add_table_modal.png", "2.6 หน้าต่างการเพิ่มหมายเลขโต๊ะอาหารใหม่")

    add_section_header("2.4 หน้าจอรับออเดอร์ห้องครัวอัจฉริยะ (Kitchen Display System - KDS)")
    add_body("หน้าจอ KDS ออกแบบมาสำหรับตั้งไว้ในห้องครัว เพื่อให้เชฟและพนักงานปรุงอาหารเห็นรายการออเดอร์แบบเรียลไทม์:")
    add_bullet("1. คลิกเลือกเมนู 'จอรับออเดอร์ครัว (KDS)'")
    add_bullet("2. เมื่อลูกค้าสั่งอาหารผ่าน QR Code ออเดอร์จะเด้งเข้าหน้าจอครัวทันทีพร้อมเสียงแจ้งเตือน")
    add_bullet("3. แสดงรายละเอียดโต๊ะ, รายการอาหาร, ตัวเลือกพิเศษ (เช่น เผ็ดน้อย, ไม่ใส่ผัก), และเวลารอสะสม")
    add_bullet("4. เชฟสามารถแตะที่การ์ดออเดอร์เพื่อสลับสถานะ 'กำลังปรุง' -> 'ปรุงเสร็จพร้อมเสิร์ฟ'")

    add_img("11_shop_kitchen_kds.png", "2.7 จอรับออเดอร์ห้องครัว KDS แบบ Real-time")

    add_section_header("2.5 ระบบแคชเชียร์และการชำระเงิน (POS & Cashier Screen)")
    add_body("หน้าจอคิดเงินหน้าร้านและเช็คบิล:")
    add_bullet("1. คลิกเลือกเมนู 'POS / ขายหน้าร้าน'")
    add_bullet("2. เลือกโต๊ะที่ต้องการเช็คบิล ระบบจะรวมยอดรายการอาหารทั้งหมดอัตโนมัติ")
    add_bullet("3. รองรับการชำระเงินทั้งเงินสด และ Dynamic PromptPay QR Code ตามยอดเงินจริง")
    add_bullet("4. เมื่อชำระเงินเสร็จสิ้น โต๊ะจะถูกเคลียร์สถานะกลับเป็น 'โต๊ะว่าง' พร้อมรับลูกค้ากลุ่มถัดไป")

    add_img("12_shop_pos_screen.png", "2.8 หน้าจอ POS แคชเชียร์และระบบเช็คบิล")

    doc.add_page_break()

    # ==================== ส่วนที่ 3 ====================
    add_chapter_header("ส่วนที่ 3: คู่มือการใช้งานสำหรับผู้ดูแลระบบ (Admin User Guide)")
    add_body("คู่มือส่วนนี้อธิบายขั้นตอนการเข้าสู่ระบบของผู้ดูแลระบบ (Admin) เพื่อควบคุมดูแลร้านอาหารทั้งหมดในระบบ การสวมสิทธิ์ร้านค้า (Impersonation) และการจัดการ/แก้ไขสิทธิ์ร้านค้า")

    add_section_header("3.1 การเข้าสู่ระบบผู้ดูแลระบบ (Admin Login)")
    add_body("ขั้นตอนการเข้าสู่ระบบ Admin:")
    add_bullet("1. ไปที่เว็บไซต์ https://pos.cm.in.th/ ในส่วน 'เข้าสู่ระบบแอดมิน (Admin Portal)'")
    add_bullet("2. กรอกชื่อผู้ใช้งานหรืออีเมล และรหัสผ่านของผู้ดูแลระบบ")
    add_bullet("3. กดปุ่ม 'เข้าสู่ระบบ' เพื่อเข้าสู่ Admin Backoffice Management Dashboard")

    add_img("15_admin_dashboard.png", "3.1 หน้าแดชบอร์ดหลักของผู้ดูแลระบบ (Admin Overview Dashboard)")

    add_section_header("3.2 การจัดการร้านอาหารทั้งหมด และฟังก์ชัน 'สวมสิทธิ์ร้านค้า' (Impersonate Store)")
    add_body("ผู้ดูแลระบบสามารถตรวจสอบรายชื่อร้านอาหารทั้งหมดที่ลงทะเบียนในระบบ และสามารถ 'สวมสิทธิ์' เพื่อเข้าไปดูหน้าจอและช่วยแก้ไขปัญหาให้ร้านค้าได้เสมือนเป็นเจ้าของร้านเอง:")
    add_bullet("1. ไปที่แถบเมนู 'ร้านอาหารทั้งหมด' หรือ 'จัดการร้านค้า' (Restaurants / Stores Management)")
    add_bullet("2. ระบบจะแสดงตารางรายชื่อร้านค้า, ชื่อผู้ติดต่อ, เบอร์โทร, แพ็กเกจที่ใช้งาน, และสถานะการเปิดใช้งาน")
    add_bullet("3. ฟังก์ชันการสวมสิทธิ์ (Impersonate): ในแถวของร้านอาหารที่ต้องการ ให้คลิกที่ปุ่ม 'สวมสิทธิ์' หรือ 'เข้าสู่ร้าน (Login as Store)'")
    add_bullet("4. ระบบ Admin จะทำการสลับ Session เข้าสู่หน้าแดชบอร์ดของร้านค้านั้นๆ ทันทีโดยไม่ต้องขอรหัสผ่านของร้าน เพื่อให้ผู้ดูแลระบบสามารถตรวจสอบข้อผิดพลาด ช่วยเพิ่มเมนู หรือตั้งค่าระบบให้แก่ลูกค้าได้อย่างรวดเร็ว")

    add_img("16_admin_stores_management.png", "3.2 หน้ารายการร้านอาหารทั้งหมด และปุ่มการสวมสิทธิ์ / จัดการสิทธิ์")

    add_section_header("3.3 การแก้ไขสิทธิ์และขอบเขตการใช้งานของร้านค้า (Edit Store Permissions & Packages)")
    add_body("ผู้ดูแลระบบสามารถปรับเปลี่ยนสิทธิ์ แพ็กเกจ และการเปิด/ปิดการเข้าถึงโมดูลต่างๆ ของแต่ละร้านอาหารได้:")
    add_bullet("1. ในตารางรายชื่อร้านค้า ให้คลิกปุ่ม 'แก้ไขสิทธิ์' (Edit Permissions) หรือ 'แก้ไขข้อมูลร้าน'")
    add_bullet("2. การปรับเปลี่ยนสิทธิ์การใช้งาน (Permissions):")
    add_bullet("   - สิทธิ์การใช้งานระบบคิวครัว (KDS Module Enable/Disable)", level=2)
    add_bullet("   - สิทธิ์การใช้งานระบบคำนวณเวลารออาหารจริง (Real-time Lead Time Module)", level=2)
    add_bullet("   - สิทธิ์การเชื่อมต่อ PromptPay QR Code ชำระเงิน", level=2)
    add_bullet("   - กำหนดจำนวนโต๊ะสูงสุดที่อนุญาตให้เปิดได้ตามแพ็กเกจ", level=2)
    add_bullet("   - ขยายระยะเวลาทดลองใช้งาน (Extend Trial Period) หรือปรับสถานะการชำระเงิน", level=2)
    add_bullet("3. กดปุ่ม 'บันทึกการแก้ไขสิทธิ์' เพื่อให้การตั้งค่ามีผลกับร้านค้าทันที")

    add_img("17_admin_edit_store_permissions.png", "3.3 หน้าต่างการแก้ไขสิทธิ์และการกำหนดขอบเขตของร้านค้า")

    add_section_header("3.4 การจัดการแพ็กเกจบริการและการดูแลผู้ใช้งานระบบ")
    add_body("ผู้ดูแลระบบสามารถจัดการแพ็กเกจราคา กำหนดเงื่อนไขฟังก์ชันของแต่ละแพ็กเกจ และตรวจสอบบัญชีผู้ใช้งานส่วนกลางได้อย่างครอบคลุม:")
    add_bullet("1. เมนู 'จัดการแพ็กเกจ (Packages)': ใช้สำหรับตั้งราคา กำหนดฟีเจอร์เด่น และเปิด/ปิดแพ็กเกจโปรโมชัน")
    add_bullet("2. เมนู 'ผู้ใช้งานระบบ (Users)': ใช้สำหรับจัดการสิทธิ์ของทีมงาน Support, พนักงานระบบ, และตรวจสอบบันทึกการเข้าใช้งาน (System Audit Log)")

    add_img("18_admin_packages_management.png", "3.4 หน้าการจัดการแพ็กเกจราคาในระบบ Admin")
    add_img("19_admin_users_management.png", "3.5 หน้าการจัดการบัญชีผู้ใช้งานและสิทธิ์ผู้ดูแล")

    # ==================== บันทึกเอกสาร ====================
    doc.save(DOCX_PATH)
    print(f"[SUCCESS] Cleaned User manual generated at: {DOCX_PATH}")

if __name__ == "__main__":
    build_user_manual()
