"""BaseParser 抽象基类和 ParserRegistry 解析器注册表"""

import os
from abc import ABC, abstractmethod
from typing import List

from exceptions import ParseError, UnsupportedFormatError


class BaseParser(ABC):
    """文件解析器抽象基类"""

    @abstractmethod
    def supported_extensions(self) -> List[str]:
        """返回支持的文件扩展名列表，如 ['.pdf']"""
        pass

    @abstractmethod
    def parse(self, file_path: str) -> str:
        """
        解析文件并返回纯文本/Markdown 内容。

        Args:
            file_path: 文件路径

        Returns:
            提取的文本内容（Markdown 格式优先）

        Raises:
            ParseError: 文件损坏、格式不支持或编码无法识别时抛出
        """
        pass


class ParserRegistry:
    """根据文件扩展名自动选择合适的解析器"""

    def __init__(self):
        self._parsers: List[BaseParser] = []

    def register(self, parser: BaseParser) -> None:
        """注册一个解析器"""
        self._parsers.append(parser)

    def get_parser(self, file_path: str) -> BaseParser:
        """
        根据文件扩展名返回对应的解析器。

        Args:
            file_path: 文件路径

        Returns:
            匹配的解析器实例

        Raises:
            UnsupportedFormatError: 未找到匹配的解析器时抛出
        """
        ext = os.path.splitext(file_path)[1].lower()
        for parser in self._parsers:
            if ext in parser.supported_extensions():
                return parser
        raise UnsupportedFormatError(os.path.basename(file_path), ext)
