#!/usr/bin/env python3
"""Generate PGS-15 Audit Checklist DOCX from pipe-delimited content."""

import os
from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml

INPUT = "/root/projects/jg/2026-pgs15-audit-toolkit/working/03_pgs15_checklist_docx_content.txt"
OUTPUT = "/root/projects/jg/2026-pgs15-audit-toolkit/deliverables/docx/PGS15_Audit_Checklist_v1.0.docx"

PRIMARY = RGBColor(0x00, 0x33, 0x66)
ACCENT = RGBColor(0x00, 0xA8, 0xE8)

def set_cell_shading(cell, color_hex):
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def set_cell_text(cell, text, bold=False, italic=False, size=Pt(10), color=None, align=WD_ALIGN_PARAGRAPH.LEFT):
    cell.text = ""
    p = cell.paragraphs[0]
    p.alignment = align
    p.paragraph_format.space_before = Pt(1)
    p.paragraph_format.space_after = Pt(1)
    run = p.add_run(text)
    run.font.size = size
    run.font.name = "Calibri"
    run.bold = bold
    run.italic = italic
    if color:
        run.font.color.rgb = color

def add_border(cell, **kwargs):
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    tcBorders = parse_xml(f'<w:tcBorders {nsdecls("w")}></w:tcBorders>')
    for edge, val in kwargs.items():
        el = parse_xml(f'<w:{edge} {nsdecls("w")} w:val="{val.get("val","single")}" w:sz="{val.get("sz","4")}" w:space="0" w:color="{val.get("color","000000")}"/>')
        tcBorders.append(el)
    tcPr.append(tcBorders)

def set_table_borders(table):
    tbl = table._tbl
    tblPr = tbl.tblPr if tbl.tblPr is not None else parse_xml(f'<w:tblPr {nsdecls("w")}/>') 
    borders = parse_xml(
        f'<w:tblBorders {nsdecls("w")}>'
        f'  <w:top w:val="single" w:sz="4" w:space="0" w:color="003366"/>'
        f'  <w:left w:val="single" w:sz="4" w:space="0" w:color="003366"/>'
        f'  <w:bottom w:val="single" w:sz="4" w:space="0" w:color="003366"/>'
        f'  <w:right w:val="single" w:sz="4" w:space="0" w:color="003366"/>'
        f'  <w:insideH w:val="single" w:sz="4" w:space="0" w:color="003366"/>'
        f'  <w:insideV w:val="single" w:sz="4" w:space="0" w:color="003366"/>'
        f'</w:tblBorders>'
    )
    tblPr.append(borders)

def parse_input(filepath):
    sections = []
    current = None
    with open(filepath, "r", encoding="utf-8") as f:
        for line in f:
            line = line.rstrip("\n")
            if not line:
                continue
            if line.startswith("--- SECTIE"):
                current = {"header": line.replace("--- ", ""), "rows": []}
                sections.append(current)
                continue
            if line.startswith("---") or line.startswith("=="):
                continue
            if current is None:
                continue
            parts = line.split("|")
            if len(parts) >= 8:
                current["rows"].append({
                    "nr": parts[0],
                    "bron": parts[1],
                    "vraag": parts[2],
                    "opm": parts[7],
                })
    return sections

def main():
    os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
    sections = parse_input(INPUT)
    
    doc = Document()
    
    # Landscape
    for section in doc.sections:
        section.orientation = WD_ORIENT.LANDSCAPE
        section.page_width = Cm(29.7)
        section.page_height = Cm(21.0)
        section.left_margin = Cm(1.5)
        section.right_margin = Cm(1.5)
        section.top_margin = Cm(2.0)
        section.bottom_margin = Cm(2.0)
    
    # Default font
    style = doc.styles['Normal']
    font = style.font
    font.name = 'Calibri'
    font.size = Pt(10)
    
    # ===== COVER PAGE =====
    for _ in range(4):
        doc.add_paragraph()
    
    # Title
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("PGS-15 Audit Checklist")
    run.font.size = Pt(28)
    run.font.color.rgb = PRIMARY
    run.font.name = "Calibri"
    run.bold = True
    
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("Versie 1.0")
    run.font.size = Pt(16)
    run.font.color.rgb = ACCENT
    run.font.name = "Calibri"
    
    # Accent line
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("━" * 50)
    run.font.color.rgb = ACCENT
    run.font.size = Pt(12)
    
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run("JvG Consultancy")
    run.font.size = Pt(18)
    run.font.color.rgb = PRIMARY
    run.font.name = "Calibri"
    run.bold = True
    
    doc.add_paragraph()
    
    # Fields table on cover
    cover_fields = [
        ("Bedrijfsnaam:", "_" * 40),
        ("Locatie:", "_" * 40),
        ("Auditdatum:", "_" * 40),
        ("Auditor:", "_" * 40),
    ]
    for label, val in cover_fields:
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(label + "  ")
        run.font.size = Pt(12)
        run.font.bold = True
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
        run = p.add_run(val)
        run.font.size = Pt(12)
        run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)
        run.font.name = "Calibri"
    
    # Page break
    doc.add_page_break()
    
    # ===== AUDIT INFO TABLE =====
    p = doc.add_paragraph()
    run = p.add_run("Auditgegevens")
    run.font.size = Pt(14)
    run.font.color.rgb = PRIMARY
    run.font.name = "Calibri"
    run.bold = True
    
    info_fields = [
        ("Bedrijfsnaam:", ""),
        ("Locatie:", ""),
        ("Contactpersoon:", ""),
        ("Auditdatum:", ""),
        ("Auditor:", ""),
        ("Type opslag (inpandig / uitpandig / beide):", ""),
        ("Totale opslaghoeveelheid:", ""),
        ("ADR-klassen aanwezig:", ""),
    ]
    
    tbl = doc.add_table(rows=len(info_fields), cols=2)
    tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
    set_table_borders(tbl)
    
    for i, (label, _) in enumerate(info_fields):
        set_cell_text(tbl.cell(i, 0), label, bold=True, size=Pt(10), color=PRIMARY)
        set_cell_shading(tbl.cell(i, 0), "E8F0FE")
        set_cell_text(tbl.cell(i, 1), "", size=Pt(10))
        # Widths
        tbl.cell(i, 0).width = Cm(10)
        tbl.cell(i, 1).width = Cm(20)
    
    doc.add_paragraph()
    doc.add_page_break()
    
    # ===== CHECKLIST SECTIONS =====
    headers = ["Nr", "Bronvermelding", "Toetsvraag", "C", "AW", "NC", "Nvt", "Opmerkingen"]
    col_widths = [Cm(1.2), Cm(4.0), Cm(12.0), Cm(1.0), Cm(1.0), Cm(1.0), Cm(1.0), Cm(6.5)]
    
    for sec in sections:
        # Section header
        p = doc.add_paragraph()
        run = p.add_run(sec["header"])
        run.font.size = Pt(14)
        run.font.color.rgb = PRIMARY
        run.font.name = "Calibri"
        run.bold = True
        
        if not sec["rows"]:
            doc.add_paragraph()
            continue
        
        # Header row
        num_rows = len(sec["rows"]) + 1
        tbl = doc.add_table(rows=num_rows, cols=8)
        tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
        set_table_borders(tbl)
        
        # Set header
        for j, h in enumerate(headers):
            set_cell_text(tbl.cell(0, j), h, bold=True, size=Pt(9), color=RGBColor(0xFF,0xFF,0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
            set_cell_shading(tbl.cell(0, j), "003366")
        
        # Data rows
        for i, row in enumerate(sec["rows"]):
            ci = i + 1
            set_cell_text(tbl.cell(ci, 0), row["nr"], size=Pt(9), align=WD_ALIGN_PARAGRAPH.CENTER)
            set_cell_text(tbl.cell(ci, 1), row["bron"], italic=True, size=Pt(8), color=RGBColor(0x00,0x33,0x66))
            set_cell_text(tbl.cell(ci, 2), row["vraag"], size=Pt(9))
            for j in range(3, 7):
                set_cell_text(tbl.cell(ci, j), "☐", size=Pt(12), align=WD_ALIGN_PARAGRAPH.CENTER)
            set_cell_text(tbl.cell(ci, 7), row["opm"], size=Pt(9))
            # Alternating row shading
            if i % 2 == 0:
                for j in range(8):
                    set_cell_shading(tbl.cell(ci, j), "F5F8FC")
        
        # Set column widths
        for i in range(num_rows):
            for j, w in enumerate(col_widths):
                tbl.cell(i, j).width = w
        
        doc.add_paragraph()
    
    # ===== SUMMARY =====
    doc.add_page_break()
    p = doc.add_paragraph()
    run = p.add_run("Samenvatting Bevindingen")
    run.font.size = Pt(14)
    run.font.color.rgb = PRIMARY
    run.font.name = "Calibri"
    run.bold = True
    
    sum_tbl = doc.add_table(rows=2, cols=4)
    sum_tbl.alignment = WD_TABLE_ALIGNMENT.CENTER
    set_table_borders(sum_tbl)
    
    sum_headers = ["Conform", "Afwijking", "Niet Conform", "N.v.t."]
    sum_colors = ["28A745", "FFC107", "DC3545", "6C757D"]
    for j, h in enumerate(sum_headers):
        set_cell_text(sum_tbl.cell(0, j), h, bold=True, size=Pt(11), color=RGBColor(0xFF,0xFF,0xFF), align=WD_ALIGN_PARAGRAPH.CENTER)
        set_cell_shading(sum_tbl.cell(0, j), sum_colors[j])
        set_cell_text(sum_tbl.cell(1, j), "", size=Pt(14), align=WD_ALIGN_PARAGRAPH.CENTER)
        sum_tbl.cell(0, j).width = Cm(6)
        sum_tbl.cell(1, j).width = Cm(6)
    
    doc.add_paragraph()
    p = doc.add_paragraph()
    run = p.add_run("Handtekening auditor:")
    run.font.size = Pt(11)
    run.font.bold = True
    run.font.color.rgb = PRIMARY
    p = doc.add_paragraph()
    p.add_run("_" * 50)
    
    p = doc.add_paragraph()
    p.add_run("Handtekening geauditeerde:")
    run = p.runs[0] if p.runs else p.add_run("Handtekening geauditeerde:")
    p.runs[0].font.size = Pt(11)
    p.runs[0].font.bold = True
    p.runs[0].font.color.rgb = PRIMARY
    p = doc.add_paragraph()
    p.add_run("_" * 50)
    
    # ===== FOOTER =====
    for section in doc.sections:
        footer = section.footer
        footer.is_linked_to_previous = False
        p = footer.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run("JvG Consultancy — PGS-15 Audit Toolkit v1.0  |  Pagina ")
        run.font.size = Pt(8)
        run.font.color.rgb = RGBColor(0x99, 0x99, 0x99)
        run.font.name = "Calibri"
        
        # Page number field
        fldChar1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        run._r.append(fldChar1)
        instrText = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve"> PAGE </w:instrText>')
        run._r.append(instrText)
        fldChar2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        run._r.append(fldChar2)
    
    doc.save(OUTPUT)
    size = os.path.getsize(OUTPUT)
    print(f"Generated: {OUTPUT}")
    print(f"Size: {size:,} bytes ({size/1024:.1f} KB)")
    print(f"Sections: {len(sections)}")

if __name__ == "__main__":
    main()
