#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""客户版 Tth 报告版式：中文字体、Logo 页眉、slogan 页脚、页码。"""
import os
from docx import Document
from docx.shared import Pt, Mm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
DOC = os.path.join(ROOT, '对外物料/Tth酶体系引物探针设计_客户报告_20261101_V01.docx')
LOGO = os.path.expanduser('~/work/公司资料/logo_transparent.png')

doc = Document(DOC)
sec = doc.sections[0]
sec.top_margin = Mm(24)
sec.bottom_margin = Mm(22)
sec.left_margin = Mm(23)
sec.right_margin = Mm(23)
sec.header_distance = Mm(8)
sec.footer_distance = Mm(8)


def set_eastasia(obj, font_name):
    rpr = obj.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'), font_name)


def style_font(style, name, size=None, bold=None, color=None):
    style.font.name = name
    set_eastasia(style, name)
    if size is not None:
        style.font.size = Pt(size)
    if bold is not None:
        style.font.bold = bold
    if color is not None:
        style.font.color.rgb = RGBColor.from_string(color)


def p_border_bottom(paragraph, color='D8E2EE', sz='4'):
    pPr = paragraph._p.get_or_add_pPr()
    pBdr = pPr.find(qn('w:pBdr'))
    if pBdr is None:
        pBdr = OxmlElement('w:pBdr')
        pPr.append(pBdr)
    bottom = OxmlElement('w:bottom')
    bottom.set(qn('w:val'), 'single')
    bottom.set(qn('w:sz'), sz)
    bottom.set(qn('w:space'), '4')
    bottom.set(qn('w:color'), color)
    pBdr.append(bottom)


def p_left_border(paragraph, color='2E6DA4', sz='16'):
    pPr = paragraph._p.get_or_add_pPr()
    pBdr = pPr.find(qn('w:pBdr'))
    if pBdr is None:
        pBdr = OxmlElement('w:pBdr')
        pPr.append(pBdr)
    left = OxmlElement('w:left')
    left.set(qn('w:val'), 'single')
    left.set(qn('w:sz'), sz)
    left.set(qn('w:space'), '8')
    left.set(qn('w:color'), color)
    pBdr.append(left)


def p_shading(paragraph, fill='EAF2FA'):
    pPr = paragraph._p.get_or_add_pPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:fill'), fill)
    pPr.append(shd)


# 样式
for sname in ['Normal', 'BodyCN', 'Lead', 'DocTitle', 'SubTitle', 'Refs']:
    if sname in doc.styles:
        s = doc.styles[sname]
        style_font(s, '宋体', 10.5, color='17212E')
        s.paragraph_format.line_spacing = 1.55
        s.paragraph_format.space_after = Pt(4)

if 'BodyCN' in doc.styles:
    b = doc.styles['BodyCN']
    b.paragraph_format.first_line_indent = Mm(7.4)
    b.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
    b.paragraph_format.line_spacing = 1.55
    b.paragraph_format.space_after = Pt(4)

if 'Lead' in doc.styles:
    l = doc.styles['Lead']
    style_font(l, '宋体', 10.5, False, '123A61')
    l.paragraph_format.first_line_indent = Mm(0)
    l.paragraph_format.left_indent = Mm(2)
    l.paragraph_format.right_indent = Mm(2)
    l.paragraph_format.space_before = Pt(8)
    l.paragraph_format.space_after = Pt(10)
    l.paragraph_format.line_spacing = 1.55

if 'DocTitle' in doc.styles:
    t = doc.styles['DocTitle']
    style_font(t, '微软雅黑', 19, True, '1F4E79')
    t.paragraph_format.space_before = Pt(2)
    t.paragraph_format.space_after = Pt(4)

if 'SubTitle' in doc.styles:
    s = doc.styles['SubTitle']
    style_font(s, '微软雅黑', 8.8, False, '667085')
    s.paragraph_format.space_after = Pt(8)

if 'Heading 1' in doc.styles:
    h = doc.styles['Heading 1']
    style_font(h, '微软雅黑', 13, True, '1F4E79')
    h.paragraph_format.space_before = Pt(12)
    h.paragraph_format.space_after = Pt(4)
    h.paragraph_format.keep_with_next = True

if 'Refs' in doc.styles:
    r = doc.styles['Refs']
    style_font(r, '宋体', 8, False, '667085')
    r.paragraph_format.line_spacing = 1.25
    r.paragraph_format.space_before = Pt(0)
    r.paragraph_format.space_after = Pt(1)

for p in doc.paragraphs:
    if p.style.name == 'DocTitle':
        p.alignment = WD_ALIGN_PARAGRAPH.LEFT
        p.text = 'Tth 一步法 RT-PCR 引物探针设计：'
        p.add_run().add_break()
        tail = p.add_run('现象、结论与依据')
        for rr in p.runs:
            rr.font.name = '微软雅黑'
            set_eastasia(rr, '微软雅黑')
            rr.font.size = Pt(19)
            rr.font.bold = True
            rr.font.color.rgb = RGBColor.from_string('1F4E79')
        p_border_bottom(p, '1F4E79', '8')
    elif p.style.name == 'Lead':
        p_shading(p, 'EAF2FA')
        p_left_border(p, '2E6DA4', '18')
    elif p.style.name == 'Heading 1':
        p_border_bottom(p, 'D8E2EE', '4')

# 页眉
header = sec.header
hp = header.paragraphs[0]
for r in list(hp.runs):
    r._element.getparent().remove(r._element)
hp.alignment = WD_ALIGN_PARAGRAPH.LEFT
hp.paragraph_format.space_after = Pt(2)
if os.path.exists(LOGO):
    run = hp.add_run()
    run.add_picture(LOGO, width=Mm(23))
    text_run = hp.add_run('    宝锐生物 BIORI BIOTECH · Tth 引物探针设计')
else:
    text_run = hp.add_run('宝锐生物 BIORI BIOTECH · Tth 引物探针设计')
for hr in [text_run]:
    hr.font.name = '微软雅黑'
    set_eastasia(hr, '微软雅黑')
    hr.font.size = Pt(8)
    hr.font.color.rgb = RGBColor.from_string('667085')
slogan_run = hp.add_run('  ｜  守护生命健康，缔造美好生活')
slogan_run.font.name = '微软雅黑'
set_eastasia(slogan_run, '微软雅黑')
slogan_run.font.size = Pt(7.2)
slogan_run.font.color.rgb = RGBColor.from_string('667085')
p_border_bottom(hp, 'D8E2EE', '4')

# 页脚
footer = sec.footer
fp = footer.paragraphs[0]
for r in list(fp.runs):
    r._element.getparent().remove(r._element)
fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
fp.add_run('守护生命健康，缔造美好生活  ｜  客户技术资料  ｜  第 ')
fld1 = OxmlElement('w:fldSimple')
fld1.set(qn('w:instr'), ' PAGE ')
r1 = OxmlElement('w:r')
t1 = OxmlElement('w:t')
t1.text = '1'
r1.append(t1)
fld1.append(r1)
fp._p.append(fld1)
fp.add_run(' 页 / 共 ')
fld2 = OxmlElement('w:fldSimple')
fld2.set(qn('w:instr'), ' NUMPAGES ')
r2 = OxmlElement('w:r')
t2 = OxmlElement('w:t')
t2.text = '2'
r2.append(t2)
fld2.append(r2)
fp._p.append(fld2)
fp.add_run(' 页')
for r in fp.runs:
    r.font.name = '微软雅黑'
    set_eastasia(r, '微软雅黑')
    r.font.size = Pt(8)
    r.font.color.rgb = RGBColor.from_string('667085')

# 更新字段
settings = doc.settings.element
update = settings.find(qn('w:updateFields'))
if update is None:
    update = OxmlElement('w:updateFields')
    settings.append(update)
update.set(qn('w:val'), 'true')

cp = doc.core_properties
cp.title = 'Tth 一步法 RT-PCR 引物探针设计：现象、结论与依据'
cp.subject = '客户技术资料'
cp.author = '宝锐生物'
cp.keywords = 'Tth, RT-PCR, 引物, 探针, Tm'
cp.comments = '客户技术资料'

doc.save(DOC)
print('SAVED', DOC, os.path.getsize(DOC))
