"""Shared helpers for all Unit section scripts"""
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn

FONT = "Niramit"
BLUE = RGBColor(0x1a, 0x55, 0x9e)
DARK = RGBColor(0x22, 0x22, 0x22)
GRAY = RGBColor(0x66, 0x66, 0x66)
GREEN = RGBColor(0x33, 0x6d, 0x5c)

def new_doc():
    doc = Document()
    for s in doc.sections:
        s.top_margin = Cm(2); s.bottom_margin = Cm(2)
        s.left_margin = Cm(2.5); s.right_margin = Cm(2.5)
    return doc

def run(p, text, size=11, bold=False, color=DARK, italic=False):
    r = p.add_run(text)
    r.font.name = FONT; r.font.size = Pt(size)
    r.bold = bold; r.font.color.rgb = color; r.italic = italic
    return r

def title(doc, text, sz=16):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run(p, text, sz, True, BLUE)

def subtitle(doc, text, sz=10):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run(p, text, sz, False, GRAY)

def heading(doc, text, sz=13):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(12)
    run(p, text, sz, True, BLUE)

def subhead(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(10)
    run(p, text, 11, True, GREEN)

def body(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(4)
    run(p, text, 10.5)

def tip(doc, text):
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Cm(0.5)
    p.paragraph_format.space_after = Pt(1)
    p.paragraph_format.space_before = Pt(0)
    run(p, text, 10, False, GRAY)

def add_table(doc, headers, rows):
    table = doc.add_table(rows=1+len(rows), cols=len(headers))
    table.style = 'Table Grid'
    for i, h in enumerate(headers):
        c = table.cell(0, i); c.text = ""
        p = c.paragraphs[0]; p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.paragraph_format.space_before = Pt(2)
        p.paragraph_format.space_after = Pt(2)
        r = p.add_run(h)
        r.font.name = FONT; r.font.size = Pt(10); r.bold = True
        r.font.color.rgb = RGBColor(0xff, 0xff, 0xff)
        sh = c._element.get_or_add_tcPr()
        sd = sh.makeelement(qn('w:shd'), {qn('w:val'): 'clear', qn('w:color'): 'auto', qn('w:fill'): '1a559e'})
        sh.append(sd)
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            c = table.cell(ri+1, ci); c.text = ""
            p = c.paragraphs[0]
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER if ci < len(headers)-1 else WD_ALIGN_PARAGRAPH.LEFT
            p.paragraph_format.space_before = Pt(1)
            p.paragraph_format.space_after = Pt(1)
            r = p.add_run(val)
            r.font.name = FONT; r.font.size = Pt(9.5)
    doc.add_paragraph()
    return table

def add_q(doc, num, stem, opts):
    doc.add_paragraph()
    p = doc.add_paragraph()
    p.paragraph_format.space_before = Pt(6)
    run(p, f"{num}. {stem}", 11, True)
    for o in opts:
        p2 = doc.add_paragraph()
        p2.paragraph_format.left_indent = Cm(1)
        p2.paragraph_format.space_before = Pt(1)
        p2.paragraph_format.space_after = Pt(1)
        run(p2, o, 10.5)

def passage_box(doc, text, title_txt=None):
    if title_txt:
        p = doc.add_paragraph()
        run(p, title_txt, 11, True, DARK, italic=True)
    t = doc.add_table(rows=1, cols=1)
    c = t.cell(0, 0); p = c.paragraphs[0]
    r = p.add_run(text)
    r.font.name = FONT; r.font.size = Pt(11); r.italic = True
    sh = c._element.get_or_add_tcPr()
    sd = sh.makeelement(qn('w:shd'), {qn('w:val'): 'clear', qn('w:color'): 'auto', qn('w:fill'): 'F5F8FC'})
    sh.append(sd)
    doc.add_paragraph()
