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

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

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 .mineru_extractor import LocalMinerUFullTextExtractor
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（智能混合模式）。

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


def build_local_mineru_facade(config: Optional[PdfWorkerConfig] = None) -> FileParseFacade:
    """
    构建一个使用本地部署 MinerU 提取全文的 FileParseFacade。
    
    需要在 config.yaml 中配置 mineru_local 相关参数：
    - server_ip: MinerU 服务器 IP
    - server_port: MinerU 服务器端口 (默认 23424)
    - api_key: 鉴权密钥
    - timeout: 请求超时时间
    """
    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=LocalMinerUFullTextExtractor(),
        splitter=PdfTextSplitter(),
        writers=writers,
        chunk_classifier=ChunkClassifier(),
    )

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


def build_hybrid_facade(config: Optional[PdfWorkerConfig] = None) -> FileParseFacade:
    """
    构建一个使用混合提取策略的 FileParseFacade。
    
    - 智能路由：电子页走本地提取，扫描页走本地 MinerU 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
