# -*- coding: utf-8 -*-
"""为种子数据生成真实可下载的 Word 文件
目的：客户点「下载」拿到的是真文档，而不是「文件不存在」。
内容取自数据库本身（任免表字段 / 简历 / 家庭成员 / 主要表现），保证与页面一致。
输出目录：src/Rmsys.Api/App_Data/（与 Material.FilePath 对应）
"""
import os

import pymysql
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.shared import Pt

APP_DATA = '/data/www/files/rmsys-app/backend/src/Rmsys.Api/App_Data'

c = pymysql.connect(host='192.168.20.66', user='tanghouhu', password='admin123#@!',
                    database='rmsys', charset='utf8mb4')
cur = c.cursor(pymysql.cursors.DictCursor)


def new_doc():
    d = Document()
    st = d.styles['Normal']
    st.font.name = '仿宋'
    st.font.size = Pt(12)
    st.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
    return d


def title(d, text, size=18):
    p = d.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = p.add_run(text)
    r.font.name = '方正小标宋简体'
    r._element.rPr.rFonts.set(qn('w:eastAsia'), '方正小标宋简体')
    r.font.size = Pt(size)
    r.bold = False
    return p


def body(d, text, indent=True, size=12):
    p = d.add_paragraph()
    if indent:
        p.paragraph_format.first_line_indent = Pt(size * 2)
    p.paragraph_format.line_spacing = 1.5
    r = p.add_run(text)
    r.font.name = '仿宋'
    r._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
    r.font.size = Pt(size)
    return p


def h2(d, text, size=14):
    p = d.add_paragraph()
    r = p.add_run(text)
    r.font.name = '黑体'
    r._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    r.font.size = Pt(size)
    return p


def ensure(path):
    full = os.path.join(APP_DATA, path)
    os.makedirs(os.path.dirname(full), exist_ok=True)
    return full


# ---------------- 干部与子表 ----------------
cur.execute('select * from cadres order by Id')
cadres = {r['Id']: r for r in cur.fetchall()}
cur.execute('select * from cadreresumes order by CadreId, Sort')
resumes = {}
for r in cur.fetchall():
    resumes.setdefault(r['CadreId'], []).append(r)
cur.execute('select * from cadrefamilies order by CadreId, Sort')
families = {}
for r in cur.fetchall():
    families.setdefault(r['CadreId'], []).append(r)


def build_t30(cd):
    """任免审批表"""
    d = new_doc()
    title(d, '干部任免审批表')
    rows = [
        ('姓　　名', cd['Name'], '性　　别', cd['Sex']),
        ('出生年月', cd['Birth'], '民　　族', cd['Nation']),
        ('籍　　贯', cd['NativePlace'], '出生地', cd['BirthPlace']),
        ('入党时间', cd['PartyDate'], '参加工作时间', cd['WorkDate']),
        ('健康状况', cd['Health'], '专业技术职务', cd['TechPost']),
        ('全日制教育', f"{cd['EduFullLevel'] or ''}　{cd['EduFullSchool'] or ''}　{cd['EduFullMajor'] or ''}",
         '在职教育', f"{cd['EduInLevel'] or ''}　{cd['EduInSchool'] or ''}"),
        ('现任职务', cd['CurrentPost'] or '', None, None),
        ('拟任职务', cd['ProposedPost'] or '—', '拟免职务', cd['DismissPost'] or '—'),
    ]
    t = d.add_table(rows=0, cols=4)
    t.style = 'Table Grid'
    for a, b, cc, dd in rows:
        cells = t.add_row().cells
        cells[0].text = a
        if cc is None:                      # 通栏
            cells[1].merge(cells[3])
            cells[1].text = b
        else:
            cells[1].text = str(b or '')
            cells[2].text = cc
            cells[3].text = str(dd or '')
    h2(d, '简　　历')
    for r in resumes.get(cd['Id'], []):
        body(d, f"{r['Period']}　{r['Content']}")
    h2(d, '奖惩情况')
    body(d, cd['Rewards'] or '无')
    h2(d, '任免理由')
    body(d, cd['AppointReason'] or '')
    h2(d, '家庭主要成员及重要社会关系')
    for f in families.get(cd['Id'], []):
        body(d, f"{f['Relation']}　{f['Name']}　{f['Age']}岁　{f['Political'] or ''}　{f['WorkUnit'] or ''}")
    return d


def build_exam(cd):
    """考察材料"""
    d = new_doc()
    title(d, f"关于{cd['Name']}同志的考察材料")
    body(d, f"{cd['Name']}，{cd['Sex']}，{cd['Nation']}，{cd['Birth']}出生，"
            f"{cd['NativePlace']}人，{cd['PartyDate']}加入中国共产党，{cd['WorkDate']}参加工作，"
            f"现任{cd['CurrentPost']}。")
    h2(d, '一、政治素质')
    body(d, cd['Perf'] or '')
    h2(d, '二、工作实绩')
    body(d, cd['Care'] or '')
    h2(d, '三、作风和廉洁情况')
    body(d, '该同志严格遵守中央八项规定精神，未发现违纪违法问题。')
    h2(d, '四、民主推荐和考察情况')
    body(d, cd['Suggest'] or '')
    body(d, '考察组组长（签字）：　　　　　　考察组成员（签字）：', indent=False)
    return d


def build_report(cd):
    """汇报材料"""
    d = new_doc()
    title(d, f"关于{cd['Name']}同志的汇报材料")
    body(d, f"拟任{cd['ProposedPost'] or '—'}。" if cd['ProposedPost'] else
            f"拟免{cd['DismissPost'] or '—'}。")
    h2(d, '一、基本情况')
    body(d, f"{cd['Name']}，{cd['Sex']}，{cd['Nation']}，{cd['Birth']}出生，{cd['NativePlace']}人，"
            f"全日制学历为{cd['EduFullLevel'] or '—'}，现任{cd['CurrentPost']}。")
    h2(d, '二、主要表现')
    body(d, cd['Perf'] or '')
    h2(d, '三、任免理由')
    body(d, cd['AppointReason'] or '')
    return d


def build_note(cd):
    d = new_doc()
    title(d, f"{cd['Name']}同志有关情况说明")
    body(d, cd['Care'] or '该同志有关情况经核实无异常。')
    return d


def build_att(cd):
    d = new_doc()
    title(d, '干部档案审核情况登记表')
    body(d, f"姓名：{cd['Name']}　　性别：{cd['Sex']}　　出生年月：{cd['Birth']}")
    body(d, f"工作单位及职务：{cd['CurrentPost']}")
    h2(d, '审核结论')
    body(d, '经审核，干部档案材料齐全、信息一致，“三龄两历一身份”无涂改、无造假，'
            '与本人档案记载相符。')
    body(d, '审核人（签字）：　　　　　　　审核日期：　　年　　月　　日', indent=False)
    return d


BUILDERS = {'t30': build_t30, 'exam': build_exam, 'report': build_report,
            'note': build_note, 'att': build_att}

# ---------------- 生成材料文件 ----------------
cur.execute("""select Id, CadreId, Type, FilePath, FileName from materials
               where Status<>'missing' and FilePath is not null""")
mats = cur.fetchall()
n = 0
for m in mats:
    cd = cadres.get(m['CadreId'])
    if not cd:
        continue
    fn = BUILDERS.get(m['Type'])
    if not fn:
        continue
    full = ensure(m['FilePath'])
    fn(cd).save(full)
    n += 1
print('材料文件 %d 个已生成' % n)

# ---------------- 生成任免文件 ----------------
cur.execute("""select Id, MeetingId, DeptId, DocNo, Title, FilePath from appointdocs""")
docs = cur.fetchall()
cur.execute('select Id, Code, Name from depts')
depts = {r['Id']: r for r in cur.fetchall()}
m = 0
for d0 in docs:
    dp = depts.get(d0['DeptId'])
    d = new_doc()
    title(d, '中共海东市委组织部文件')
    body(d, d0['DocNo'] or '', indent=False)
    d.add_paragraph()
    title(d, f"关于{dp['Name'] if dp else '有关处室'}干部任免的通知", size=16)
    cur.execute("""select c.Name, c.CurrentPost, c.ProposedPost, c.DismissPost
                   from meetingcadres mc join cadres c on c.Id=mc.CadreId
                   where mc.MeetingId=%s and (%s is null or c.DeptId=%s)
                   order by mc.SortNo""", (d0['MeetingId'], d0['DeptId'], d0['DeptId']))
    for r in cur.fetchall():
        line = f"{r['Name']}同志任{r['ProposedPost']}" if r['ProposedPost'] else \
               f"免去{r['Name']}同志的{r['DismissPost']}"
        body(d, line + '。')
    body(d, '中共海东市委组织部', indent=False)
    body(d, '2026年10月10日', indent=False)
    if d0['FilePath']:
        full = ensure(d0['FilePath'].replace('.docx', '_seed.docx') if False else d0['FilePath'])
        d.save(full)
        m += 1
print('任免文件 %d 个已生成' % m)

c.close()
