#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：config.py
模块描述：功能测试报告生成子包配置模块，定义常量、路径配置和数据枚举值

移植自独立工具 FunctionalTestReportGeneration/src/config.py，
去除模块级目录创建副作用，路径配置改为由 functional_report_service 注入。

作者：czj
创建日期：2026-08-12
最后修改：2026-08-12
"""

from pathlib import Path
from typing import List

# ================================
# 测试结果枚举值
# ================================
TEST_RESULT_PASS = "通过"
TEST_RESULT_FAIL = "失败"
TEST_RESULT_UNVERIFIED = "未验证"
TEST_RESULT_UNDEVELOPED = "未开发"

# 所有测试结果枚举
TEST_RESULT_VALUES = [
    TEST_RESULT_PASS,
    TEST_RESULT_FAIL,
    TEST_RESULT_UNVERIFIED,
    TEST_RESULT_UNDEVELOPED
]

# ================================
# BUG状态枚举值
# ================================
BUG_STATUS_ACTIVE = "激活"
BUG_STATUS_RESOLVED = "已解决"
BUG_STATUS_CLOSED = "已关闭"

# 所有BUG状态枚举
BUG_STATUS_VALUES = [
    BUG_STATUS_ACTIVE,
    BUG_STATUS_RESOLVED,
    BUG_STATUS_CLOSED
]

# 遗留BUG状态（未关闭的BUG）
REMAINING_BUG_STATUS: List[str] = [
    BUG_STATUS_ACTIVE,
    BUG_STATUS_RESOLVED
]

# ================================
# BUG等级枚举值
# ================================
BUG_LEVEL_1 = "1级"  # 致命
BUG_LEVEL_2 = "2级"  # 严重
BUG_LEVEL_3 = "3级"  # 一般
BUG_LEVEL_4 = "4级"  # 轻微

# 所有BUG等级枚举
BUG_LEVEL_VALUES = [
    BUG_LEVEL_1,
    BUG_LEVEL_2,
    BUG_LEVEL_3,
    BUG_LEVEL_4
]

# BUG等级描述映射
BUG_LEVEL_DESCRIPTION = {
    BUG_LEVEL_1: "致命",
    BUG_LEVEL_2: "严重",
    BUG_LEVEL_3: "一般",
    BUG_LEVEL_4: "轻微"
}

# ================================
# 日期格式配置
# ================================
# 日期格式（用于报告生成）
DATE_FORMAT = "%Y年%m月%d日"

# 报告文件名中的日期格式
FILENAME_DATE_FORMAT = "%Y年%m月%d日"

# ================================
# Excel数据读取配置
# ================================
# 测试用例Excel数据起始行（表头在第3行，数据从第4行开始）
CASE_DATA_START_ROW = 4

# BUG列表Excel数据起始行（表头在第1行，数据从第2行开始）
BUG_DATA_START_ROW = 2

# 测试用例Excel列索引（从1开始）
CASE_COL_SERIAL_NUMBER = 1    # 序列号
CASE_COL_MODULE = 2            # 功能模块
CASE_COL_CATEGORY = 3          # 功能类别
CASE_COL_CASE_NUMBER = 4       # 用例编号
CASE_COL_DESCRIPTION = 5       # 功能描述
CASE_COL_LEVEL = 6             # 用例等级
CASE_COL_FUNCTION_NUMBER = 7   # 功能编号
CASE_COL_NAME = 8              # 用例名称
CASE_COL_PRE_CONDITION = 9     # 预置条件
CASE_COL_STEPS = 10            # STEP（测试步骤）
CASE_COL_JSON = 11             # JSON配置
CASE_COL_EXPECTED_RESULT = 12  # 预期结果
CASE_COL_TEST_RESULT = 13      # 测试结果
CASE_COL_TEST_FREQUENCY = 14   # 测试频次
CASE_COL_LOGS_SCREENSHOTS = 15 # 日志/截图/照片
CASE_COL_SCREENSHOT2 = 16      # 截图二
CASE_COL_REMARKS = 17          # 备注

# BUG列表Excel列索引（从1开始）
BUG_COL_PROJECT_NAME = 1       # 项目名称
BUG_COL_BUG_TYPE = 2           # BUG类型
BUG_COL_BUG_LEVEL = 3          # BUG等级
BUG_COL_BUG_STATUS = 4         # BUG状态
BUG_COL_BUG_NAME = 5           # BUG名称
BUG_COL_REPORTER = 6           # 提单人员
BUG_COL_OWNER = 7              # 主负责人员
BUG_COL_DEADLINE = 8           # 截止日期
BUG_COL_REPRODUCTION_STEPS = 9 # 复现步骤

# ================================
# 自动填充关键字配置
# ================================
# 测试用例预置条件中的关键字（使用【】标签格式）
KEYWORD_SERVER_INFO = "【服务器信息】"
KEYWORD_DEPLOYMENT_ENV = "【部署环境】"

# BUG列表复现步骤中的关键字（使用【】标签格式）
KEYWORD_VERSION_INFO = "【版本信息】"

# 版本信息结束标记（遇到这些标记时停止提取版本信息）
VERSION_STOP_MARKERS = ["【步骤】", "【结果】", "【预期】", "【期望】", "【备注】"]

# ================================
# 自动填充默认值配置
# ================================
# 测试概览默认值
DEFAULT_TEST_LEAD = "未填写"
DEFAULT_TESTER = "未填写"
DEFAULT_TEST_ENV = "未填写"

# 被测系统信息默认值
DEFAULT_SYSTEM_VERSION = "未填写"
DEFAULT_SERVER_ADDRESS = "未填写"
DEFAULT_DEPLOYMENT_ENV = "未填写"

# ================================
# 报告生成配置
# ================================
# 报告输出格式（支持的格式）
REPORT_FORMAT_DOCX = ".docx"
REPORT_FORMAT_MD = ".md"
REPORT_FORMATS = [REPORT_FORMAT_DOCX, REPORT_FORMAT_MD]

# 默认报告格式
DEFAULT_REPORT_FORMAT = REPORT_FORMAT_DOCX

# 报告命名规则：{项目名称}_功能测试报告_{日期}.{format}
REPORT_FILENAME_TEMPLATE = "{project_name}_功能测试报告_{date}{format}"

# 报告编号规则：{项目名称}-{日期}
REPORT_NUMBER_TEMPLATE = "{project_name}-{date}"

# Word文档样式配置
WORD_FONT_NAME = "宋体"
WORD_FONT_SIZE = 11
# 各级标题字号配置
WORD_TITLE_LEVEL_1_SIZE = 21  # 一级标题字号
WORD_TITLE_LEVEL_2_SIZE = 19  # 二级标题字号
WORD_TITLE_LEVEL_3_SIZE = 17  # 三级标题字号
WORD_TITLE_LEVEL_4_SIZE = 15  # 四级标题字号
# 段落格式配置
WORD_PARAGRAPH_FIRST_LINE_INDENT = 2  # 正文首行缩进字符数

# ================================
# 图表生成配置
# ================================
# 图表输出格式
CHART_FORMAT = ".png"

# 图表DPI（分辨率）
CHART_DPI = 300

# 图表尺寸（英寸）
CHART_FIGURE_SIZE = (10, 6)

# 中文字体配置
CHINESE_FONT = "Microsoft YaHei"

# 图表颜色配置
CHART_COLORS = {
    "pass": "#04AA6D",      # 绿色 - 通过
    "fail": "#bb4069",      # 红色 - 失败
    "unverified": "#f0c040",# 黄色 - 未验证
    "undeveloped": "#dcbdbd",# 灰色 - 未开发
    "bug_1": "#d32f2f",     # 深红 - 1级BUG
    "bug_2": "#f57c00",     # 橙色 - 2级BUG
    "bug_3": "#fbc02d",     # 黄色 - 3级BUG
    "bug_4": "#388e3c",     # 绿色 - 4级BUG
}

# ================================
# 交互配置
# ================================
# 默认超时时间（秒）
DEFAULT_TIMEOUT = 30

# 进度条显示配置
SHOW_PROGRESS_BAR = True

# ================================
# 日志配置
# ================================
# 日志级别
LOG_LEVEL = "INFO"

# 日志格式
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

# ================================
# ERP配置（默认值，可由 functional_report_service 动态覆盖）
# ================================
# ERP API密钥
ERP_API_KEY = "9adc1ce611544fae9bbbc5f6b1d6ce87"

# ERP基础URL（生产环境）
ERP_BASE_URL = "https://office.ubainsyun.com:5082/api/uerp"

# 测试单ID（可配置）
ERP_DEVELOPTESTING_ID = 397

# 报告类型ID（可配置，2=测试报告）
ERP_TYPE_ID = 2

# 重试间隔（秒）
ERP_RETRY_INTERVAL = 5

# 最大重试次数
ERP_MAX_RETRIES = 3

# ERP接口路径
ERP_UPLOAD_IMAGE_URL = "/openclaw/upload/richtext"  # 上传图片接口路径
ERP_CREATE_REPORT_URL = "/openclaw/report"              # 创建报告接口路径
ERP_STUFF_URL = "/openclaw/stuff"                        # 获取人员列表接口路径
ERP_UPLOAD_PROJECT_URL = "/openclaw/upload/project"     # 项目资料上传接口路径（fileGroup_id=4，仅归档，不创建协作）
ERP_UPLOAD_COOPERATION_URL = "/openclaw/upload/cooperation"  # 协作文档上传接口路径（fileGroup_id=1，创建OnlyOffice在线协作文档）

# 请求超时时间（秒）
ERP_REQUEST_TIMEOUT = 30

# 图片处理配置
ERP_SAVE_IMAGES_TEMP = True  # 是否将提取的图片保存到temp目录供检查
ERP_VALIDATE_IMAGES = True   # 是否验证图片有效性

# 调试配置
ERP_SAVE_HTML_TEMP = True    # 是否将转换后的HTML保存到temp目录供调试

# 图片URL前缀配置
ERP_IMAGE_URL_PREFIX = "https://office.ubainsyun.com:5015/"  # 图片URL前缀，用于拼接完整的访问地址（末尾含斜杠）

# ================================
# 版本信息
# ================================
__version__ = "1.0.0"
__author__ = "czj"
__description__ = "功能测试报告自动生成工具（平台集成版）"


def get_report_filename(project_name: str, date: str = None, format: str = DEFAULT_REPORT_FORMAT) -> str:
    """
    获取报告文件名

    Args:
        project_name: 项目名称
        date: 日期字符串（可选，默认使用当前日期）
        format: 报告格式（可选，默认为.docx）

    Returns:
        报告文件名
    """
    if date is None:
        from datetime import datetime
        date = datetime.now().strftime(FILENAME_DATE_FORMAT)

    # 确保格式以点开头
    if not format.startswith("."):
        format = "." + format

    return REPORT_FILENAME_TEMPLATE.format(
        project_name=project_name,
        date=date,
        format=format
    )


def get_report_number(project_name: str, date: str = None) -> str:
    """
    获取报告编号

    Args:
        project_name: 项目名称
        date: 日期字符串（可选，默认使用当前日期）

    Returns:
        报告编号
    """
    if date is None:
        from datetime import datetime
        date = datetime.now().strftime(FILENAME_DATE_FORMAT)

    return REPORT_NUMBER_TEMPLATE.format(
        project_name=project_name,
        date=date
    )


# ================================
# 模板配置工具函数
# ================================


def get_default_config() -> dict:
    """
    获取默认模板配置字典

    将当前硬编码常量组织为模板配置结构，供 ReportTemplate 模型和生成器使用。
    当用户未创建任何模板时，生成器使用此默认配置。

    Returns:
        dict: 完整的默认配置字典，包含 chapters/defaults/word_style/chart_style
    """
    return {
        "chapters": {
            "report_basic_info": True,
            "execution_summary": True,
            "test_scope": True,
            "case_details": True,
            "bug_list": True,
            "chart_analysis": True,
            "execution_records": True,
            "attachments": True,
            "risk_assessment": True,
            "appendix": True,
        },
        "defaults": {
            "test_lead": DEFAULT_TEST_LEAD,
            "tester": DEFAULT_TESTER,
            "test_env": DEFAULT_TEST_ENV,
            "system_version": DEFAULT_SYSTEM_VERSION,
            "server_address": DEFAULT_SERVER_ADDRESS,
            "deployment_env": DEFAULT_DEPLOYMENT_ENV,
        },
        "word_style": {
            "font_name": WORD_FONT_NAME,
            "font_size": WORD_FONT_SIZE,
            "title_level_1_size": WORD_TITLE_LEVEL_1_SIZE,
            "title_level_2_size": WORD_TITLE_LEVEL_2_SIZE,
            "title_level_3_size": WORD_TITLE_LEVEL_3_SIZE,
            "title_level_4_size": WORD_TITLE_LEVEL_4_SIZE,
            "paragraph_first_line_indent": WORD_PARAGRAPH_FIRST_LINE_INDENT,
            "title_color": "#000000",
        },
        "chart_style": {
            "dpi": CHART_DPI,
            "figure_width": CHART_FIGURE_SIZE[0],
            "figure_height": CHART_FIGURE_SIZE[1],
            "chinese_font": CHINESE_FONT,
            "colors": dict(CHART_COLORS),
        },
    }


def merge_template_config(base_config: dict, template_config: dict) -> dict:
    """
    将模板配置与默认配置深合并，缺失字段用默认值填充

    Args:
        base_config: 默认配置（get_default_config() 返回值）
        template_config: 用户模板配置（可能只包含部分字段）

    Returns:
        dict: 合并后的完整配置
    """

    def deep_merge(base, override):
        result = dict(base)
        for k, v in (override or {}).items():
            if isinstance(v, dict) and isinstance(result.get(k), dict):
                result[k] = deep_merge(result[k], v)
            else:
                result[k] = v
        return result

    return deep_merge(base_config, template_config or {})