"""
pdf_worker_adapter
==================

将 PDF 处理实现包装为 file_parse 的 PipelineComponents，
并提供一个方便复用的构建函数。

【修改记录】2025-03-27: OCR 引擎从 MinerU 替换为 GLM-OCR 本地 API
"""

from __future__ import annotations

from dataclasses import dataclass
from typing import List, Optional

from ..config.provider import default_config_provider
from ..interfaces import DocumentPipeline, FileParseFacade, ResultWriter
from ..classification.hierarchy_classifier import HierarchyClassifier
from ..classification.chunk_classifier import ChunkClassifier
from .fulltext_extractor import PdfFullTextExtractor
from .hybrid_extractor import HybridFullTextExtractor
from .json_writer import PdfJsonResultWriter
from .text_splitter import PdfTextSplitter
from .toc_extractor import PdfTOCExtractor
from ..pipeline import (
    DefaultDocumentPipeline,
    DefaultFileParseFacade,
    PipelineComponents,
)


@dataclass
class PdfWorkerConfig:
    """用于构建 pdf_worker 管线的简单配置封装。"""

    writers: Optional[List[ResultWriter]] = None


def build_pdf_facade(config: Optional[PdfWorkerConfig] = None) -> FileParseFacade:
    """
    构建一个处理 PDF 的 FileParseFacade（智能混合模式）。

    【已升级为智能混合模式】
    - 自动检测扫描页（含表格区域）并使用 GLM-OCR 识别
    - 电子页使用 PyMuPDF 本地提取，兼顾速度与准确率
    - 保留准确的分页信息，无需云端 API
    """
    # 默认使用混合模式
    return build_hybrid_facade(config)


def build_hybrid_facade(config: Optional[PdfWorkerConfig] = None) -> FileParseFacade:
    """
    构建一个使用混合提取策略的 FileParseFacade。
    
    - 智能路由：电子页走本地提取，扫描页走 GLM-OCR 识别。
    - 兼顾速度与准确率，并保留准确的分页信息。
    - 无需云端 API，完全本地化部署。
    """
    if config is None:
        config = PdfWorkerConfig()

    writers: List[ResultWriter] = config.writers or [PdfJsonResultWriter()]

    components = PipelineComponents(
        config=default_config_provider,
        toc_extractor=PdfTOCExtractor(),
        classifier=HierarchyClassifier(),
        fulltext_extractor=HybridFullTextExtractor(),
        splitter=PdfTextSplitter(),
        writers=writers,
        chunk_classifier=ChunkClassifier(),
    )

    pipeline: DocumentPipeline = DefaultDocumentPipeline(components)
    facade: FileParseFacade = DefaultFileParseFacade(pipeline)
    return facade
