import re
import os
import base64
from PyQt6.QtGui import QPixmap, QIcon

BOOTSTRAP_ICON_BASE_PATH = "third_party/Bootstrap/bootstrap-icons-1.13.1/" 

def get_colored_icon(name: str, color: str, width: int = 50, height: int = 50) -> QIcon:
    """读取SVG内容并替换currentColor为目标颜色，然后生成QIcon"""
    try:
        path = os.path.join(BOOTSTRAP_ICON_BASE_PATH, name)
        with open(path, 'r', encoding='utf-8') as f:
            svg_content = f.read()
        svg_content = svg_content.replace('currentColor', color)
        svg_content = re.sub(r'width="\d+"', f'width="{width}"', svg_content)
        svg_content = re.sub(r'height="\d+"', f'height="{height}"', svg_content)
        pi = QPixmap()
        pi.loadFromData(svg_content.encode('utf-8'), "SVG")
        return QIcon(pi)
    except Exception:
        return None

def get_colored_pixmap(name: str, color: str, width: int = 16, height: int = 16, view_box: str = None) -> QPixmap:
    """读取SVG内容并替换currentColor为目标颜色，然后生成QPixmap"""
    try:
        path = os.path.join(BOOTSTRAP_ICON_BASE_PATH, name)
        with open(path, 'r', encoding='utf-8') as f:
            svg_content = f.read()
        svg_content = svg_content.replace('currentColor', color)
        svg_content = re.sub(r'width="\d+"', f'width="{width}"', svg_content)
        svg_content = re.sub(r'height="\d+"', f'height="{height}"', svg_content)
        if view_box is not None:
            svg_content = re.sub(r'viewBox="[^"]*"', f'viewBox="{view_box}"', svg_content)
        pi = QPixmap()
        pi.loadFromData(svg_content.encode('utf-8'), "SVG")
        return pi
    except Exception:
        return None


def get_colored_svg_uri(name: str, color: str, width: int = 16, height: int = 16, view_box: str = None) -> str:
    """读取SVG内容并替换currentColor为空目标颜色，最后转换为HTML可识别的Base64字符串"""
    try:
        path = os.path.join(BOOTSTRAP_ICON_BASE_PATH, name)
        with open(path, 'r', encoding='utf-8') as f:
            svg_content = f.read()
        svg_content = svg_content.replace('currentColor', color)
        svg_content = re.sub(r'width="\d+"', f'width="{width}"', svg_content)
        svg_content = re.sub(r'height="\d+"', f'height="{height}"', svg_content)
        if view_box is not None:
            svg_content = re.sub(r'viewBox="[^"]*"', f'viewBox="{view_box}"', svg_content)
        b64 = base64.b64encode(svg_content.encode('utf-8')).decode('utf-8')
        return f"data:image/svg+xml;base64,{b64}"
    except Exception:
        return None