"""
cli.py - 命令行入口

用法：
    # 单文件模式（所有表格放入一个 DOCX）
    python -m pdf_table_to_docx <pdf_path>

    # 目录模式（JSON 元数据 + 每个表格独立 DOCX）
    python -m pdf_table_to_docx <pdf_path> --dir

示例：
    python -m pdf_table_to_docx data/sample.pdf
    python -m pdf_table_to_docx data/sample.pdf -o output.docx
    python -m pdf_table_to_docx data/sample.pdf --dir -o output_dir/
    python -m pdf_table_to_docx data/sample.pdf --dir --verbose
"""

import argparse
import logging
import sys

from .extractor import PDFTableExtractor


def setup_logging(verbose: bool = False):
    """配置日志输出。"""
    level = logging.DEBUG if verbose else logging.INFO
    fmt = "%(asctime)s [%(levelname)s] %(message)s"
    datefmt = "%H:%M:%S"

    logging.basicConfig(
        level=level,
        format=fmt,
        datefmt=datefmt,
        stream=sys.stderr,
    )


def main():
    parser = argparse.ArgumentParser(
        description="从 PDF 中提取表格并生成 DOCX 文件",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  %(prog)s document.pdf                          # 单 DOCX 模式
  %(prog)s document.pdf --dir                    # 目录模式（JSON + 每表独立 DOCX）
  %(prog)s document.pdf -o result.docx           # 指定输出文件
  %(prog)s document.pdf --dir -o output_dir/     # 指定输出目录
  %(prog)s document.pdf --verbose                # 详细日志
  %(prog)s document.pdf --page-width 42 --page-height 29.7  # A3 横版
        """,
    )

    parser.add_argument(
        "pdf_path",
        help="输入的 PDF 文件路径",
    )
    parser.add_argument(
        "-o", "--output",
        help="输出路径（单文件模式时是 .docx，目录模式时是文件夹路径）",
    )
    parser.add_argument(
        "--dir", "--directory",
        action="store_true",
        dest="dir_mode",
        help="目录模式：输出 JSON 元数据 + 每个表格独立的 DOCX 文件",
    )
    parser.add_argument(
        "--verbose", "-v",
        action="store_true",
        help="输出详细日志",
    )
    parser.add_argument(
        "--page-width",
        type=float,
        default=21.0,
        help="页面宽度，单位厘米（默认 21.0，即 A4）",
    )
    parser.add_argument(
        "--page-height",
        type=float,
        default=29.7,
        help="页面高度，单位厘米（默认 29.7，即 A4）",
    )
    parser.add_argument(
        "--margin",
        type=float,
        default=2.0,
        help="页边距，单位厘米（默认 2.0）",
    )

    args = parser.parse_args()

    setup_logging(verbose=args.verbose)

    logger = logging.getLogger(__name__)

    try:
        extractor = PDFTableExtractor(args.pdf_path)

        if args.dir_mode:
            # ---- 目录模式 ----
            output_dir = extractor.to_docx_directory(
                output_dir=args.output,
                page_width_cm=args.page_width,
                page_height_cm=args.page_height,
                margin_cm=args.margin,
            )
            if output_dir:
                print(f"\n✅ 表格已提取至目录: {output_dir}", file=sys.stderr)
                print(f"   元数据: {output_dir}/tables.json", file=sys.stderr)
                print(f"   表格:   {output_dir}/tables/", file=sys.stderr)
            else:
                print("\n⚠️  未检测到表格或处理失败", file=sys.stderr)
                sys.exit(1)
        else:
            # ---- 单文件模式（默认） ----
            output = extractor.to_docx(
                output_path=args.output,
                page_width_cm=args.page_width,
                page_height_cm=args.page_height,
                margin_cm=args.margin,
            )
            if output:
                print(f"\n✅ 表格已提取并保存至: {output}", file=sys.stderr)
            else:
                print("\n⚠️  未检测到表格或处理失败", file=sys.stderr)
                sys.exit(1)

    except FileNotFoundError as e:
        logger.error(e)
        sys.exit(1)
    except Exception as e:
        logger.exception(f"处理失败: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()
