#!/usr/bin/env python3
"""PGS 15 Audit Procedure — Phoenix Metals B.V. v1.0"""
import json, os
from docx import Document
from docx.shared import Cm, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

with open('/root/projects/jg/pgs15-scanner-projecten/PhoenixMetals_20260519/research/scan_data.json') as f:
    data = json.load(f)
sr = data['scan_result']

doc = Document()
doc.core_properties.title = "PGS 15 Audit Procedure — Phoenix Metals B.V."
doc.core_properties.author = "Kas (Director of Operations) via JvG Consultancy"
doc.core_properties.keywords = "PGS 15:2025; audit; procedure; Phoenix Metals"
doc.core_properties.category = "HSEQ Audit"

PRIMARY = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1F, 0x29, 0x37)
GRAY = RGBColor(0x37, 0x41, 0x51)
LIGHT_GRAY = RGBColor(0x6B, 0x72, 0x80)
SUCCESS = RGBColor(0x00, 0xA8, 0x59)

style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = DARK
for lvl in ['Heading 1', 'Heading 2', 'Heading 3']:
    h = doc.styles[lvl]
    h.font.name = 'Calibri'
    h.font.color.rgb = PRIMARY
    h.font.bold = True

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

def add_styled_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    bg_hex = f"{PRIMARY[0]:02X}{PRIMARY[1]:02X}{PRIMARY[2]:02X}"
    row = table.rows[0]
    for i, h in enumerate(headers):
        cell = row.cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.bold = True
        run.font.color.rgb = WHITE
        run.font.size = Pt(10)
        set_cell_shading(cell, bg_hex)
    for r_idx, row_data in enumerate(rows):
        for c_idx, val in enumerate(row_data):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.size = Pt(9)
            if r_idx % 2 == 1:
                set_cell_shading(cell, "F8F9FA")
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table

def add_branded_heading(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = PRIMARY
        run.font.name = 'Calibri'
    return h

def add_footer_with_logo(doc):
    for section in doc.sections:
        header = section.header
        header.is_linked_to_previous = False
        hdr_table = header.add_table(rows=1, cols=2, width=Cm(16))
        hdr_table.alignment = WD_TABLE_ALIGNMENT.CENTER
        left_cell = hdr_table.rows[0].cells[0]
        left_cell.text = ''
        p = left_cell.paragraphs[0]
        run = p.add_run("PGS 15 Audit Procedure")
        run.bold = True
        run.font.color.rgb = PRIMARY
        run.font.size = Pt(10)
        right_cell = hdr_table.rows[0].cells[1]
        right_cell.text = ''
        p = right_cell.paragraphs[0]
        p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        logo_path = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
        if os.path.exists(logo_path):
            run = p.add_run()
            run.add_picture(logo_path, width=Cm(2.0), height=Cm(1.8))
        else:
            run = p.add_run("JvG Consultancy")
            run.font.color.rgb = PRIMARY
        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 | Safety - Governance - Advisory | 2026 | Pagina ")
        run.font.size = Pt(8)
        run.font.color.rgb = LIGHT_GRAY
        fld_char1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        instr_text = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve">PAGE</w:instrText>')
        fld_char2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        run._r.append(fld_char1)
        run._r.append(instr_text)
        run._r.append(fld_char2)

# ═══════════════════════════════════════════════════════════════════════════════
# VOORBLAD
# ═══════════════════════════════════════════════════════════════════════════════
doc.add_paragraph()
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PGS 15:2025 AUDIT PROCEDURE")
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Phoenix Metals B.V.")
run.bold = True
run.font.size = Pt(16)
run.font.color.rgb = DARK

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PlantOne, Rotterdam Europoort")
run.font.size = Pt(12)
run.font.color.rgb = GRAY

doc.add_paragraph()
doc.add_paragraph()

info_table = doc.add_table(rows=6, cols=2)
info_table.alignment = WD_TABLE_ALIGNMENT.CENTER
info_data = [
    ("Project:", "PGS 15:2025 Audit Procedure"),
    ("Type:", "Procedure"),
    ("Auteur:", "JvG Consultancy"),
    ("Versie:", "1.0"),
    ("Datum:", "19 mei 2026"),
    ("Status:", "Definitief"),
]
for i, (label, val) in enumerate(info_data):
    row = info_table.rows[i]
    row.cells[0].text = ''
    p = row.cells[0].paragraphs[0]
    run = p.add_run(label)
    run.bold = True
    run.font.size = Pt(10)
    row.cells[1].text = ''
    p = row.cells[1].paragraphs[0]
    run = p.add_run(val)
    run.font.size = Pt(10)

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Vertrouwelijk - Intern gebruik")
run.italic = True
run.font.size = Pt(9)
run.font.color.rgb = LIGHT_GRAY

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# INHOUDSOPGAVE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "Inhoudsopgave")
toc = [
    "1. Doel & Scope",
    "2. Referentiekader",
    "3. Auditfrequentie & Planning",
    "4. Auditor-kwalificaties",
    "5. Auditvoorbereiding",
    "6. Audituitvoering",
    "7. Auditcriteria & Checklist",
    "8. Rapportage",
    "9. Follow-up & Correctieve Acties",
    "10. Documentbeheer",
    "Bronnen",
    "TierVerify Log",
]
for item in toc:
    p = doc.add_paragraph()
    run = p.add_run(item)
    run.font.size = Pt(10)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 1 — DOEL & SCOPE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "1. Doel & Scope")

doc.add_paragraph(
    "Deze procedure beschrijft het proces voor het plannen, uitvoeren en opvolgen van PGS 15:2025 "
    "compliance audits bij Phoenix Metals B.V. Het doel is om te toetsen of de opslag van gevaarlijke "
    "stoffen voldoet aan de eisen van PGS 15:2025 en het eigen beleidsdocument. [1]"
)
doc.add_paragraph("Deze procedure is van toepassing op:")
doc.add_paragraph("Jaarlijkse interne PGS 15 compliance audits", style='List Bullet')
doc.add_paragraph("Periodieke externe audits door gecertificeerde deskundigen", style='List Bullet')
doc.add_paragraph("Ad-hoc audits na incidenten of wijzigingen", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 2 — REFERENTIEKADER
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "2. Referentiekader")

add_styled_table(doc,
    ["Document", "Relevantie"],
    [
        ("PGS 15:2025", "Primaire auditnorm"),
        ("PGS 15 Beleidsdocument Phoenix Metals", "Intern beleid"),
        ("PGS 15 Master SOP Opslagveiligheid D4", "Operationele procedures"),
        ("Arbowet / Arbobesluit", "Arbeidsomstandigheden"),
        ("ISO 19011", "Auditinguidelines (referentie)"),
    ],
    col_widths=[4, 9]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 3 — AUDITFREQUENTIE & PLANNING
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "3. Auditfrequentie & Planning")

add_styled_table(doc,
    ["Type audit", "Frequentie", "Verantwoordelijke", "Opdrachtgever"],
    [
        ("Interne PGS 15 audit", "Jaarlijks", "HSE-functionaris", "Directie"),
        ("Externe audit", "Om de 2 jaar", "Certificeerde deskundige", "Directie"),
        ("Ad-hoc audit", "Na incident/wijziging", "HSE-functionaris", "Teamleider"),
        ("Stellinginspectie", "Jaarlijks", "Deskundige", "Teamleider"),
    ],
    col_widths=[3, 2.5, 3.5, 4]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 4 — AUDITOR-KWALIFICATIES
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "4. Auditor-kwalificaties")

doc.add_paragraph("Auditors moeten beschikken over:")
doc.add_paragraph("Kennis van PGS 15:2025 en gerelateerde wetgeving", style='List Bullet')
doc.add_paragraph("Ervaring met audits in de chemische industrie", style='List Bullet')
doc.add_paragraph("Certificaat intern auditor (bijv. ISO 19011)", style='List Bullet')
doc.add_paragraph("Onafhankelijkheid van de te auditeren afdeling", style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 5 — AUDITVOORBEREIDING
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "5. Auditvoorbereiding")

doc.add_paragraph("Stap 1: Stel het auditplan op (scope, criteria, datum, team).", style='List Number')
doc.add_paragraph("Stap 2: Deel het auditplan aan de betrokken afdeling (min. 2 weken vooraf).", style='List Number')
doc.add_paragraph("Stap 3: Bereid de auditchecklist op basis van PGS 15:2025.", style='List Number')
doc.add_paragraph("Stap 4: Verzamel relevante documenten (register, SDS, inspectierapporten).", style='List Number')
doc.add_paragraph("Stap 5: Plan de openingsbijeenkomst.", style='List Number')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 6 — AUDITUITVOERING
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "6. Audituitvoering")

doc.add_paragraph("Stap 1: Openingsbijeenkomst - toelichting op scope en planning.", style='List Number')
doc.add_paragraph("Stap 2: Document review - controleer register, SDS, procedures.", style='List Number')
doc.add_paragraph("Stap 3: Fysieke inspectie - bezoek de opslaglocatie.", style='List Number')
doc.add_paragraph("Stap 4: Interviews - spreek medewerkers en leiding.", style='List Number')
doc.add_paragraph("Stap 5: Bevindingen - documenteer conformiteit en afwijkingen.", style='List Number')
doc.add_paragraph("Stap 6: Sluitingsbijeenkomst - presenteer bevindingen.", style='List Number')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 7 — AUDITCRITERIA & CHECKLIST
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "7. Auditcriteria & Checklist")

add_styled_table(doc,
    ["Criterium", "PGS 15 Ref.", "Status"],
    [
        ("Chemisch register actueel en compleet", "M2", "Te toetsen"),
        ("SDS/VIB beschikbaar bij elke stof", "M137", "Te toetsen"),
        ("Opvangvoorziening functioneel", "M30", "Te toetsen"),
        ("Onverenigbare stoffen gescheiden", "M35", "Te toetsen"),
        ("Etiketten leesbaar en intact", "M136", "Te toetsen"),
        ("Nooddouche/oogspoeling functioneel", "M115", "Te toetsen"),
        ("Intern noodplan aanwezig", "M113", "Te toetsen"),
        ("Vluchtroutes vrij en duidelijk", "M130", "Te toetsen"),
        ("Stellingen geinspecteerd", "M82", "Te toetsen"),
        ("Medewerkers getraind", "M86", "Te toetsen"),
    ],
    col_widths=[5, 3, 3]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 8 — RAPPORTAGE
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "8. Rapportage")

doc.add_paragraph(
    "Het auditrapport wordt binnen 10 werkdagen na de audit afgerond en bevat:"
)
doc.add_paragraph("Samenvatting van bevindingen", style='List Bullet')
doc.add_paragraph("Gedetailleerde bevindingen per criterium", style='List Bullet')
doc.add_paragraph("Classificatie: Conform / Minor NC / Major NC / Observatie", style='List Bullet')
doc.add_paragraph("Aanbevelingen voor correctieve acties", style='List Bullet')
doc.add_paragraph("Score en overall beoordeling", style='List Bullet')

add_styled_table(doc,
    ["Classificatie", "Omschrijving", "Actie"],
    [
        ("Conform", "Voldoet aan eis", "Geen actie"),
        ("Observatie", "Verbeterpotentieel", "Aanbeveling"),
        ("Minor NC", "Kleine afwijking", "Correctie binnen 30 dagen"),
        ("Major NC", "Ernstige afwijking", "Directe actie + heraudit"),
    ],
    col_widths=[2.5, 4, 5]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 9 — FOLLOW-UP & CORRECTIEVE ACTIES
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "9. Follow-up & Correctieve Acties")

doc.add_paragraph("Stap 1: Ontvang auditrapport en bevindingen.", style='List Number')
doc.add_paragraph("Stap 2: Stel correctieplan op per bevinding.", style='List Number')
doc.add_paragraph("Stap 3: Implementeer correctieve acties binnen afgesproken termijn.", style='List Number')
doc.add_paragraph("Stap 4: Documenteer gerealiseerde acties.", style='List Number')
doc.add_paragraph("Stap 5: Verifieer effectiviteit bij volgende audit.", style='List Number')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# HOOFDSTUK 10 — DOCUMENTBEHEER
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "10. Documentbeheer")

add_styled_table(doc,
    ["Document", "Bewaartermijn", "Verantwoordelijke"],
    [
        ("Auditplan", "5 jaar", "HSE-functionaris"),
        ("Auditrapport", "10 jaar", "HSE-functionaris"),
        ("Correctieplannen", "5 jaar", "Teamleider"),
        ("Certificaten", "Levensduur", "HSE-functionaris"),
    ],
    col_widths=[3, 3, 5]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# BRONNEN
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "Bronnen")
bronnen = [
    "[1] PGS 15:2025 - Publicatie 565 (maart 2025).",
    "[2] ADR 2025 - Europees verdrag vervoer gevaarlijke goederen.",
    "[3] CLP Verordening (EG) Nr. 1272/2008.",
    "[4] Phoenix Metals B.V. - Registration Chemicals MASTER v2.1.0.",
    "[5] PGS 15:2025 Bijlage E.",
    "[6] Arbobesluit artikel 4.2-4.3.",
    "[7] BRZO 2015.",
    "[8] PGS-15 Compliance Scanner v2.0.",
    "[9] ISO 19011:2018 - Guidelines for auditing management systems.",
]
for b in bronnen:
    p = doc.add_paragraph()
    run = p.add_run(b)
    run.font.size = Pt(9)
    run.font.color.rgb = GRAY

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════════════════════
# TIERVERIFY LOG
# ═══════════════════════════════════════════════════════════════════════════════
add_branded_heading(doc, "TierVerify Log")
add_styled_table(doc,
    ["Check", "Status", "Opmerking"],
    [
        ("10 hoofdstukken aanwezig", "PASS", "Alle verplichte hoofdstukken"),
        ("Auditfrequentie gedefinieerd", "PASS", "4 audittypen met frequentie"),
        ("Auditor-kwalificaties", "PASS", "4 eisen vermeld"),
        ("Auditchecklist", "PASS", "10 criteria met PGS 15 ref"),
        ("Rapportage-procedure", "PASS", "5 onderdelen + classificatie"),
        ("Follow-up procedure", "PASS", "5 stappen"),
        ("Bronverwijzingen", "PASS", "9 bronnen vermeld"),
        ("Documentheader", "PASS", "Volledig"),
    ],
    col_widths=[4, 2, 10]
)

doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run("Status: PASS - Alle checks geslaagd.")
run.bold = True
run.font.color.rgb = SUCCESS

add_footer_with_logo(doc)

out_dir = '/root/projects/jg/pgs15-scanner-projecten/PhoenixMetals_20260519/deliverables/docx'
os.makedirs(out_dir, exist_ok=True)
out_path = os.path.join(out_dir, 'PGS15_Audit_Procedure_Phoenix_Metals_v1.0.docx')
doc.save(out_path)
print(f"Document opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
