"""
PDF 批量处理命令行入口

支持处理单个文件或目录中的所有文件

用法示例：
  # 处理单个文件
  python -m doc_worker.pdf_worker.batch_cli input.pdf
  
  # 批量处理目录中的所有PDF文件
  python -m doc_worker.pdf_worker.batch_cli data/
  
  # 批量处理并指定输出目录
  python -m doc_worker.pdf_worker.batch_cli data/ -o output/

  # 使用混合模式（扫描件自动使用 GLM-OCR）
  python -m doc_worker.pdf_worker.batch_cli data/ --engine hybrid

【修改记录】2025-03-27: 移除 MinerU 引擎选项，仅保留 hybrid 和 pdf
"""

from __future__ import annotations

import argparse
from pathlib import Path
from typing import List

from .adapter import build_pdf_facade, build_hybrid_facade


def find_pdf_files(path: Path) -> List[Path]:
    """查找目录中的所有PDF文件"""
    if path.is_file():
        return [path] if path.suffix.lower() == '.pdf' else []
    elif path.is_dir():
        return sorted(path.glob('**/*.pdf'))
    return []


def main() -> None:
    parser = argparse.ArgumentParser(
        description="PDF 文档批量分类切分工具"
    )
    parser.add_argument(
        "path", 
        help="PDF 文件路径或包含PDF文件的目录路径"
    )
    parser.add_argument(
        "--engine",
        choices=["pdf", "hybrid"],
        default="hybrid",
        help="选择全文提取引擎：hybrid (智能混合模式，默认), pdf (纯本地 PyMuPDF)",
    )
    parser.add_argument(
        "-l",
        "--level",
        type=int,
        default=None,
        help="要分类的目标层级（默认读取配置 text_splitting.target_level）",
    )
    parser.add_argument(
        "--max-size",
        type=int,
        default=None,
        help="最大分块字符数（默认读取配置 text_splitting.max_chunk_size）",
    )
    parser.add_argument(
        "--min-size",
        type=int,
        default=None,
        help="最小分块字符数（默认读取配置 text_splitting.min_chunk_size）",
    )
    parser.add_argument(
        "-o",
        "--output",
        help="输出目录（可选，默认按配置 output.default_dir_name 放在源文件同目录）",
    )

    args = parser.parse_args()

    input_path = Path(args.path)
    if not input_path.exists():
        raise SystemExit(f"错误：路径不存在 -> {input_path}")

    # 查找所有PDF文件
    pdf_files = find_pdf_files(input_path)
    
    if not pdf_files:
        raise SystemExit(f"错误：未找到PDF文件 -> {input_path}")

    print(f"\n找到 {len(pdf_files)} 个PDF文件")
    print(f"使用引擎: {args.engine}")
    print("=" * 80)

    # 根据引擎选择 facade
    if args.engine == "hybrid":
        print("使用智能混合引擎（扫描件自动使用 GLM-OCR）...")
        facade = build_hybrid_facade()
    else:  # default to pdf
        print("使用本地 PyMuPDF 引擎...")
        facade = build_pdf_facade()
    
    success_count = 0
    failed_files = []

    for idx, file_path in enumerate(pdf_files, 1):
        print(f"\n[{idx}/{len(pdf_files)}] 处理: {file_path.name}")
        print("-" * 80)
        
        try:
            result = facade.process_file(
                file_path=file_path,
                target_level=args.level,
                max_chunk_size=args.max_size,
                min_chunk_size=args.min_size,
                output_dir=args.output,
            )

            chunks = result.get("chunks", []) or []
            toc_info = result.get("toc_info", {}) or {}
            classification = result.get("classification", {}) or {}

            print(f"[OK] 完成")
            print(f"  目录项数: {toc_info.get('toc_count', len(toc_info.get('toc_items', [])))}")
            print(f"  文本块总数: {len(chunks)}")
            print(f"  分类目标层级: {classification.get('target_level')}")
            
            success_count += 1
            
        except Exception as e:
            print(f"[FAIL] 失败: {e}")
            failed_files.append((file_path.name, str(e)))

    # 输出汇总信息
    print("\n" + "=" * 80)
    print("批量处理完成")
    print("=" * 80)
    print(f"总文件数: {len(pdf_files)}")
    print(f"成功: {success_count}")
    print(f"失败: {len(failed_files)}")
    
    if failed_files:
        print("\n失败文件列表:")
        for filename, error in failed_files:
            print(f"  - {filename}: {error}")


if __name__ == "__main__":
    main()
