# -*- coding: utf-8 -*-
"""生成「任免文件文头模板」.docx（党政机关公文红头格式）
   版头：发文机关标志（红色小标宋）+ 发文字号 + 红色反线
   正文：标题 2 号小标宋、主送机关与正文 3 号仿宋、落款右空四字
   规格参照 GB/T 9704-2012：A4，上 37mm 下 35mm 左 28mm 右 26mm，正文 3 号（16pt）行距 28.8pt
"""
import os
from docx import Document
from docx.shared import Pt, Mm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING, WD_TAB_ALIGNMENT
from docx.enum.section import WD_SECTION
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

RED = RGBColor(0xC0, 0x00, 0x00)
BLACK = RGBColor(0, 0, 0)
ORG = "中共海东市委组织部"
WENHAO_PREFIX = "东组干"


def set_font(run, name, size_pt, color=BLACK, bold=False):
    run.font.name = name
    run.font.size = Pt(size_pt)
    run.font.color.rgb = color
    run.font.bold = bold
    rpr = run._element.get_or_add_rPr()
    rfonts = rpr.find(qn('w:rFonts'))
    if rfonts is None:
        rfonts = OxmlElement('w:rFonts')
        rpr.append(rfonts)
    rfonts.set(qn('w:eastAsia'), name)
    rfonts.set(qn('w:ascii'), name)
    rfonts.set(qn('w:hAnsi'), name)


def para(doc, text="", align=WD_ALIGN_PARAGRAPH.CENTER, space_before=0, space_after=0,
         line_pt=None, first_indent_chars=0, font="仿宋_GB2312", size=16, color=BLACK, bold=False):
    p = doc.add_paragraph()
    p.alignment = align
    pf = p.paragraph_format
    pf.space_before = Pt(space_before)
    pf.space_after = Pt(space_after)
    if line_pt:
        pf.line_spacing = Pt(line_pt)
    if first_indent_chars:
        pf.first_line_indent = Pt(size * first_indent_chars)
    if text:
        set_font(p.add_run(text), font, size, color, bold)
    return p


def red_line(doc, width_pt=1.5):
    """红色反线：用段落底边框模拟"""
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(0)
    set_font(p.add_run(""), "仿宋_GB2312", 6)
    pPr = p._p.get_or_add_pPr()
    borders = OxmlElement('w:pBdr')
    bottom = OxmlElement('w:bottom')
    bottom.set(qn('w:val'), 'single')
    bottom.set(qn('w:sz'), str(int(width_pt * 8)))   # 单位 1/8 pt
    bottom.set(qn('w:space'), '1')
    bottom.set(qn('w:color'), 'C00000')
    borders.append(bottom)
    pPr.append(borders)
    return p


def _thin_border(p, edge='top', color='000000', sz=6):
    """版记分隔细线（edge: top / bottom）"""
    pPr = p._p.get_or_add_pPr()
    borders = OxmlElement('w:pBdr')
    el = OxmlElement('w:' + edge)
    el.set(qn('w:val'), 'single')
    el.set(qn('w:sz'), str(sz))
    el.set(qn('w:space'), '1')
    el.set(qn('w:color'), color)
    borders.append(el)
    pPr.append(borders)


def build(out_path):
    doc = Document()

    # 页面：A4 + 公文页边距
    sec = doc.sections[0]
    sec.page_width, sec.page_height = Mm(210), Mm(297)
    sec.top_margin, sec.bottom_margin = Mm(37), Mm(35)
    sec.left_margin, sec.right_margin = Mm(28), Mm(26)

    # 默认正文样式
    st = doc.styles['Normal']
    st.font.name = '仿宋_GB2312'
    st.font.size = Pt(16)
    st.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')

    # ---------- 版头 ----------
    # 11 个字必须在一行内：34pt 时约 132mm，稳在版心 156mm 内（换字体也不会折行）
    para(doc, ORG + "文件", font="方正小标宋简体", size=34, color=RED, space_before=18)
    para(doc, "", size=16, space_before=6)

    # 发文字号（3 号仿宋，居中）
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_before = Pt(0)
    p.paragraph_format.space_after = Pt(0)
    set_font(p.add_run(WENHAO_PREFIX), "仿宋_GB2312", 16)
    set_font(p.add_run("〔2026〕"), "仿宋_GB2312", 16)
    set_font(p.add_run("　　　"), "仿宋_GB2312", 16)
    set_font(p.add_run("号"), "仿宋_GB2312", 16)

    # 红色反线
    red_line(doc, 1.5)

    # ---------- 标题 ----------
    para(doc, "", size=16, space_before=10)
    para(doc, "关于×××等×名同志任免的通知", font="方正小标宋简体", size=22, space_before=8)
    para(doc, "", size=16, space_before=4)

    # ---------- 主送机关 ----------
    para(doc, "各区县委组织部，市委各部门，市直各单位党组（党委）：",
         align=WD_ALIGN_PARAGRAPH.LEFT, line_pt=28.8)

    # ---------- 正文 ----------
    para(doc, "经市委研究决定：", align=WD_ALIGN_PARAGRAPH.JUSTIFY, line_pt=28.8, first_indent_chars=2)
    para(doc, "×××同志任中共×××委员会委员、书记；", align=WD_ALIGN_PARAGRAPH.JUSTIFY, line_pt=28.8, first_indent_chars=2)
    para(doc, "×××同志任×××局党组书记，提名为×××局局长人选；", align=WD_ALIGN_PARAGRAPH.JUSTIFY, line_pt=28.8, first_indent_chars=2)
    para(doc, "免去×××同志的中共×××委员会副书记、委员职务。", align=WD_ALIGN_PARAGRAPH.JUSTIFY, line_pt=28.8, first_indent_chars=2)
    para(doc, "请按有关规定办理任免手续。", align=WD_ALIGN_PARAGRAPH.JUSTIFY, line_pt=28.8, first_indent_chars=2)

    para(doc, "", size=16, space_before=10)

    # ---------- 落款（右空四字） ----------
    para(doc, ORG + "　　　　", align=WD_ALIGN_PARAGRAPH.RIGHT, line_pt=28.8)
    para(doc, "2026年　　月　　日　　　　", align=WD_ALIGN_PARAGRAPH.RIGHT, line_pt=28.8)

    # ---------- 版记（抄送/印发） ----------
    para(doc, "", size=16, space_before=16)
    p_cs = para(doc, "抄送：市委常委，市人大常委会党组，市政府党组，市政协党组。",
                align=WD_ALIGN_PARAGRAPH.LEFT, size=14, line_pt=22)
    _thin_border(p_cs, 'top')
    p_yf = doc.add_paragraph()
    p_yf.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p_yf.paragraph_format.space_before = Pt(0)
    p_yf.paragraph_format.space_after = Pt(0)
    p_yf.paragraph_format.line_spacing = Pt(22)
    p_yf.paragraph_format.tab_stops.add_tab_stop(Mm(155), WD_TAB_ALIGNMENT.RIGHT)
    set_font(p_yf.add_run(ORG + "办公室"), "仿宋_GB2312", 14)
    set_font(p_yf.add_run("\t2026年　　月　　日印发"), "仿宋_GB2312", 14)
    _thin_border(p_yf, 'bottom')

    os.makedirs(os.path.dirname(out_path), exist_ok=True)
    doc.save(out_path)
    return out_path


if __name__ == '__main__':
    import sys
    target = sys.argv[1] if len(sys.argv) > 1 else '/tmp/任免文件文头模板.docx'
    print("已生成:", build(target), os.path.getsize(target), "字节")
