#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成 Word 格式的报告"""

from docx import Document
from docx.shared import Pt, Inches, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn

# 报告数据
REPORT_TITLE = "2026 年 4 月 7 日储能设备过温告警记录"
COLUMNS = [
    {"label": "观测值", "key": "观测值"},
    {"label": "上报时间", "key": "上报时间"},
    {"label": "故障名称", "key": "故障名称"},
    {"label": "阈值", "key": "阈值"},
    {"label": "根因", "key": "根因"},
    {"label": "故障代码", "key": "故障代码"},
    {"label": "电池组名称", "key": "电池组名称"},
    {"label": "处置建议", "key": "处置建议"}
]
DATA = [
    {"观测值": 52.28, "上报时间": "2026-04-07 14:04:00", "故障名称": "单体过温", "阈值": 45.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 63.26, "上报时间": "2026-04-07 15:04:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 58.56, "上报时间": "2026-04-07 15:24:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 59.42, "上报时间": "2026-04-07 15:34:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 50.89, "上报时间": "2026-04-07 15:39:00", "故障名称": "单体过温", "阈值": 45.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 63.62, "上报时间": "2026-04-07 15:44:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -2", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 64.1, "上报时间": "2026-04-07 15:44:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 61.3, "上报时间": "2026-04-07 15:49:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 58.24, "上报时间": "2026-04-07 16:14:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -3", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 56.65, "上报时间": "2026-04-07 16:19:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 51.59, "上报时间": "2026-04-07 16:54:00", "故障名称": "单体过温", "阈值": 45.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"},
    {"观测值": 63.11, "上报时间": "2026-04-07 17:04:00", "故障名称": "单体过温", "阈值": 55.0, "根因": "散热不良、充放电倍率过高、环境温度过高、内部短路", "故障代码": "CELL_OT", "电池组名称": "蓄电池测试 -1", "处置建议": "预警：降低充放电功率，检查散热系统；告警：立即停机，启动散热，排查内短路风险"}
]

# 创建文档
doc = Document()

# 设置中文字体
doc.styles['Normal'].font.name = u'微软雅黑'
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')

# 添加标题
title = doc.add_heading(REPORT_TITLE, level=1)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
title_run = title.runs[0]
title_run.font.size = Pt(16)
title_run.font.bold = True

# 添加概要信息
doc.add_paragraph()
summary = doc.add_paragraph()
summary.add_run(f"报告生成时间：2026-04-07\n")
summary.add_run(f"告警总数：{len(DATA)} 条\n")
summary.add_run(f"时间范围：14:04 - 17:04\n")
summary.add_run(f"最高温度：64.1°C\n")
summary.add_run(f"告警阈值：45.0°C（预警）/ 55.0°C（严重）")

# 添加电池组分布统计
doc.add_paragraph()
doc.add_heading("电池组分布", level=2)

battery_stats = {}
for row in DATA:
    name = row["电池组名称"]
    battery_stats[name] = battery_stats.get(name, 0) + 1

dist_table = doc.add_table(rows=len(battery_stats) + 1, cols=3)
dist_table.style = 'Table Grid'
dist_table.alignment = WD_TABLE_ALIGNMENT.CENTER

# 表头
header_cells = dist_table.rows[0].cells
header_cells[0].text = "电池组"
header_cells[1].text = "告警数量"
header_cells[2].text = "占比"

# 数据行
for i, (name, count) in enumerate(battery_stats.items(), 1):
    row_cells = dist_table.rows[i].cells
    row_cells[0].text = name
    row_cells[1].text = str(count)
    row_cells[2].text = f"{count/len(DATA)*100:.1f}%"

# 添加严重告警说明
doc.add_paragraph()
doc.add_heading("严重告警（超过 55°C）", level=2)
severe_count = sum(1 for row in DATA if row["观测值"] > 55)
doc.add_paragraph(f"当日共有 {severe_count} 条告警超过 55°C 严重告警阈值。")

# 添加详细数据表格
doc.add_paragraph()
doc.add_heading("详细数据记录", level=2)

# 创建表格
table = doc.add_table(rows=len(DATA) + 1, cols=len(COLUMNS))
table.style = 'Table Grid'
table.alignment = WD_TABLE_ALIGNMENT.CENTER

# 设置列宽（近似）
for col in table.columns:
    col.width = Cm(3.5)

# 表头
header_cells = table.rows[0].cells
for i, col in enumerate(COLUMNS):
    header_cells[i].text = col["label"]
    # 加粗表头
    for run in header_cells[i].paragraphs[0].runs:
        run.font.bold = True
        run.font.size = Pt(10)

# 数据行
for i, row_data in enumerate(DATA, 1):
    row_cells = table.rows[i].cells
    for j, col in enumerate(COLUMNS):
        value = row_data.get(col["key"], "-")
        row_cells[j].text = str(value) if value is not None else "-"

# 添加处置建议
doc.add_paragraph()
doc.add_heading("处置建议", level=2)
doc.add_paragraph("• 预警级别（45-55°C）：降低充放电功率，检查散热系统")
doc.add_paragraph("• 严重级别（>55°C）：立即停机，启动散热，排查内短路风险")

# 添加重点关注
doc.add_paragraph()
doc.add_heading("重点关注", level=2)
doc.add_paragraph("蓄电池测试 -1 电池组在 3 小时内触发 10 条过温告警，且温度持续攀升至 64.1°C，建议优先排查该电池组的散热系统和充放电策略。")

# 保存文档
output_path = "/workspace/skills/skill-router/tool/sql-report-generator/output/report_1776827054.docx"
doc.save(output_path)
print(f"Word 报告已生成：{output_path}")
