# -*- coding: utf-8 -*-
"""
export.py — 报告导出路由

从原 server.py 迁入：export_report（Word 文档导出）。
"""

from datetime import datetime
from io import BytesIO

from flask import Blueprint, request, jsonify, send_file, session

from decorators import login_required
from utils.audit import log_audit
from utils.response import error_response
from utils.error_codes import ErrorCodes
from utils.logger import get_logger

logger = get_logger(__name__)

bp = Blueprint('export', __name__)


@bp.route('/api/export', methods=['POST'])
@login_required
def export_report():
    """
    导出排查报告为 Word 文档。

    接收参数：
      - project_name: 项目名称
      - system_type: 系统类型
      - apk_product: APK 产品
      - query: 问题描述
      - matched_cases: 匹配的历史案例
      - response: AI 分析结果

    返回：
      Word 文档文件流
    """
    try:
        from docx import Document
        from docx.shared import Pt, RGBColor
    except ImportError:
        return jsonify(error_response(ErrorCodes.EXPORT_ERROR, '缺少 python-docx 库，请运行: pip install python-docx')), 500

    data = request.get_json() or {}

    # 收集参数
    project_name = data.get('project_name', '').strip()
    system_type = data.get('system_type', '').strip()
    apk_product = data.get('apk_product', '').strip()
    query = data.get('query', '').strip()
    matched_cases = data.get('matched_cases', [])
    response = data.get('response', '').strip()

    # 生成 Word 文档
    doc = Document()

    # 标题
    title = doc.add_heading('问题排查报告', 0)
    title.alignment = 1  # 居中

    # 导出时间
    doc.add_paragraph(f'导出时间：{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
    doc.add_paragraph('')

    # 基本信息
    doc.add_heading('基本信息', level=1)
    doc.add_paragraph(f'项目名称：{project_name}')
    doc.add_paragraph(f'系统类型：{system_type}')
    if apk_product:
        doc.add_paragraph(f'APK 产品：{apk_product}')
    doc.add_paragraph('')

    # 问题描述
    doc.add_heading('问题描述', level=1)
    doc.add_paragraph(query)
    doc.add_paragraph('')

    # 匹配的历史案例
    if matched_cases:
        doc.add_heading('匹配的历史案例', level=1)
        for c in matched_cases:
            p = doc.add_paragraph()
            rank = c.get('rank', '-')
            project = c.get('project', '')
            title_text = c.get('title', '')
            score = c.get('score', 0)
            p.add_run(f'{rank}. ').bold = True
            p.add_run(f'{project} - {title_text}（相似度：{score:.0%}）')
        doc.add_paragraph('')

    # AI 分析结果
    doc.add_heading('AI 分析结果', level=1)
    # 简单渲染 Markdown（粗体、标题、列表）
    for line in response.split('\n'):
        if line.startswith('### '):
            doc.add_heading(line[4:], level=2)
        elif line.startswith('## '):
            doc.add_heading(line[3:], level=2)
        elif line.startswith('- '):
            doc.add_paragraph(line[2:], style='List Bullet')
        elif line.strip():
            doc.add_paragraph(line)

    # 保存到内存流
    buffer = BytesIO()
    doc.save(buffer)
    buffer.seek(0)

    # 生成文件名
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f'排查报告_{project_name}_{timestamp}.docx'

    # 审计日志
    log_audit({
        'timestamp': datetime.now().isoformat(),
        'user': session.get('user', {}).get('username', ''),
        'module': 'troubleshoot',
        'action': 'export',
        'target': f'{project_name}: {query[:30]}...' if query and len(query) > 30 else f'{project_name}: {query}',
        'ip': request.remote_addr or '',
        'export_format': 'docx',
        'filename': filename,
    })

    # 返回文件流
    return send_file(
        buffer,
        as_attachment=True,
        download_name=filename,
        mimetype='application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    )
