# -*- coding: utf-8 -*-
"""
cli.py：公共入口。

程序调用（推荐）:
    from lzwcai_mcpskills_generate_reports.cli import generate_report, scan_report

    generate_report(
        template="./模板.docx",
        data={"project_name": "x", ...},
        out="_out/a.docx",
    )
    scan_report(template="./模板.docx")

命令行:
    generate-report generate --template ./模板.docx --data data.json --out _out/a.docx
    generate-report scan --template ./模板.docx
"""
import argparse
import json
import os
import sys

try:
    sys.stdout.reconfigure(encoding="utf-8")
except (AttributeError, OSError):
    pass

from lzwcai_mcpskills_generate_reports import generate, scan_template


def _load_data(data):
    """把 data 归一化为 dict：支持 dict 或 JSON 文件路径字符串。"""
    if isinstance(data, str):
        if not os.path.isfile(data):
            raise FileNotFoundError(f"数据文件不存在: {data}")
        with open(data, "r", encoding="utf-8") as f:
            data = json.load(f)

    if not isinstance(data, dict):
        raise TypeError(f"data 必须是 dict 或 JSON 文件路径字符串，实际类型: {type(data).__name__}")
    return data


def generate_report(template, data, out, style_ref=None):
    """生成 docx 报告。

    参数:
        template:  模板 docx 文件路径
        data:      dict 数据 或 JSON 文件路径字符串
        out:       输出 docx 文件路径
        style_ref: 用户样式参考 docx 路径（可选）

    返回:
        dict: {"output": 输出文件绝对路径}
    """
    data = _load_data(data)
    out = generate(data=data, template=template, out_path=out, style_ref=style_ref)
    return {"output": out}


def scan_report(template):
    """扫描模板占位符。

    参数:
        template: 模板 docx 文件路径

    返回:
        dict: 占位符扫描结果
    """
    return scan_template(template)


def _build_arg_parser():
    parser = argparse.ArgumentParser(
        description="docx 模板渲染与占位符扫描",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
    generate-report generate --template ./模板.docx --data data.json --out _out/a.docx
    generate-report generate --template ./模板.docx --data data.json --style-ref 用户样式.docx --out _out/b.docx
    generate-report scan --template ./模板.docx
        """,
    )
    sub = parser.add_subparsers(dest="command", required=True)

    gen_parser = sub.add_parser("generate", help="渲染生成 docx")
    gen_parser.add_argument("--template", required=True, help="模板 docx 文件路径")
    gen_parser.add_argument("--data", required=True, help="数据 JSON 文件路径")
    gen_parser.add_argument("--out", required=True, help="输出 docx 文件路径")
    gen_parser.add_argument("--style-ref", default=None, help="用户上传的样式参考 docx（可选）")

    scan_parser = sub.add_parser("scan", help="扫描模板占位符")
    scan_parser.add_argument("--template", required=True, help="模板 docx 文件路径")

    return parser


def main():
    """命令行入口（console_scripts 调用）。"""
    parser = _build_arg_parser()
    args = parser.parse_args()

    try:
        if args.command == "generate":
            result = generate_report(
                template=args.template,
                data=args.data,
                out=args.out,
                style_ref=args.style_ref,
            )
            print(f"生成成功: {result['output']}")
        elif args.command == "scan":
            result = scan_report(template=args.template)
            print(json.dumps(result, ensure_ascii=False, indent=2))
    except Exception as e:
        print(f"错误: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    main()
