"""
文本工具模块
提供文本处理相关的工具函数
"""

import re

try:
    from ..config.config_loader import get_config
except ImportError:
    from config.config_loader import get_config


class TextUtils:
    """文本工具类"""
    
    def __init__(self):
        self.config = get_config()
    
    def extract_number_from_section_label(self, section_label):
        """
        从section_label中提取最低层级的编号
        
        例如：
        "【4】 挂篮计算荷载分析->4.2 挂篮荷载" -> "4.2"
        "【2】 编制依据、范围->2.3 风速 + 2.4 编制范围" -> "2.3+2.4"
        "1 工程概况->1.3 工程地质" -> "1.3"
        
        参数:
            section_label: section_label字符串，格式为 "一级->二级->三级" 或 "一级->二级 + 三级"
            
        返回:
            str: 编号部分，如果未找到则返回空字符串
        """
        if not section_label:
            return ""
        
        # 先找到最低层级部分（最后一个"->"后面的部分）
        if '->' in section_label:
            last_level_part = section_label.split('->')[-1].strip()
        else:
            last_level_part = section_label.strip()
        
        # 检查最低层级部分是否包含合并标记（" + "）
        if ' + ' in last_level_part:
            # 分割合并的部分
            merged_parts = last_level_part.split(' + ')
            numbers = []
            for part in merged_parts:
                part = part.strip()
                number = self.extract_title_number(part)
                if number:
                    numbers.append(number)
            
            if numbers:
                return '+'.join(numbers)
        
        # 没有合并的情况，直接提取最低层级的编号
        return self.extract_title_number(last_level_part)
    
    def extract_title_number(self, title):
        """
        从标题中提取编号部分（使用配置文件中的规则）
        
        例如：
        "1.5 施工条件" -> "1.5"
        "1.6 风险辨识与分级" -> "1.6"
        "1 工程概况" -> "1"
        "第七章验收要求" -> "第七章"
        "【1】预制场规划" -> "【1】"
        "〖1.1〗预制场规划" -> "〖1.1〗"
        
        参数:
            title: 标题字符串
            
        返回:
            str: 编号部分，如果未找到则返回空字符串
        """
        # 从配置中获取提取规则
        extraction_rules = self.config.title_number_extraction_rules
        
        # 如果没有配置规则，使用默认规则（向后兼容）
        if not extraction_rules:
            return self.extract_title_number_default(title)
        
        # 按配置的规则顺序尝试匹配
        for rule in extraction_rules:
            pattern = rule.get('pattern', '')
            group = rule.get('group', 1)
            name = rule.get('name', '')
            
            if not pattern:
                continue
            
            try:
                match = re.match(pattern, title)
                if match:
                    # 获取指定捕获组的内容
                    if match.lastindex >= group:
                        return match.group(group)
                    # 如果没有指定组或组不存在，尝试使用第一个捕获组
                    elif match.groups():
                        return match.group(1)
            except re.error as e:
                # 如果正则表达式有错误，跳过这条规则
                print(f"  警告: 标题编号提取规则 '{name}' 的正则表达式错误: {e}")
                continue
        
        return ""
    
    def extract_title_number_default(self, title):
        """
        默认的标题编号提取方法（向后兼容，当配置中没有规则时使用）
        
        参数:
            title: 标题字符串
            
        返回:
            str: 编号部分，如果未找到则返回空字符串
        """
        # 匹配章节格式（如 第七章、第1章等）
        chapter_match = re.match(r'^(第[一二三四五六七八九十\d]+[章节条款部分])', title)
        if chapter_match:
            return chapter_match.group(1)
        
        # 匹配方括号数字格式（如 【1】、【2】等）
        bracket_match = re.match(r'^(【\d+】)', title)
        if bracket_match:
            return bracket_match.group(1)
        
        # 匹配双方括号数字格式（如 〖1.1〗、〖2.3〗等）
        double_bracket_match = re.match(r'^(〖\d+(?:\.\d+)*〗)', title)
        if double_bracket_match:
            return double_bracket_match.group(1)
        
        # 匹配数字编号格式（如 1.5, 1.6, 1.2.3等，可能后跟空格或、）
        number_match = re.match(r'^(\d+(?:\.\d+)*)[\s、．.]?', title)
        if number_match:
            return number_match.group(1)
        
        # 匹配中文编号格式（如 一、二、三等）
        chinese_match = re.match(r'^([一二三四五六七八九十]+)[、．.]', title)
        if chinese_match:
            return chinese_match.group(1)
        
        # 匹配圆括号编号格式（如 (1)、（一）等）
        paren_match = re.match(r'^([\(（][一二三四五六七八九十\d]+[\)）])', title)
        if paren_match:
            return paren_match.group(1)
        
        return ""


