"""
图片处理工具
"""

import re
import json
import logging
from typing import List, Optional
from urllib.parse import urlparse

logger = logging.getLogger(__name__)


class ImageProcessor:
    """图片链接处理器"""
    
    def __init__(self, splitter_pattern: str = r'[;|]+'):
        """
        初始化图片处理器

        Args:
            splitter_pattern: 分隔符正则表达式
            注意：不再使用空格作为分隔符，避免URL被错误截断
        """
        self.splitter_pattern = splitter_pattern
    
    def process_image_links(self, image_text: Optional[str]) -> List[str]:
        """
        处理图片链接文本，返回有效URL列表

        Args:
            image_text: 原始图片链接文本

        Returns:
            有效的图片URL列表
        """
        # 数据类型安全检查和转换
        if isinstance(image_text, list):
            if image_text:
                if len(image_text) == 1:
                    image_text = str(image_text[0]) if image_text[0] is not None else ""
                else:
                    # 多个元素时，用逗号连接
                    non_empty = [str(x) for x in image_text if x is not None and str(x).strip()]
                    image_text = ','.join(non_empty) if non_empty else ""
            else:
                image_text = ""
        elif image_text is None:
            image_text = ""
        else:
            image_text = str(image_text)

        if not image_text or not isinstance(image_text, str):
            return []

        # 特殊处理：如果只有一个URL且没有分隔符，直接返回
        text_stripped = image_text.strip()
        if text_stripped.startswith('http') and ';' not in text_stripped and '|' not in text_stripped:
            # 单个URL，可能包含空格或其他字符
            # 提取从http开始的完整URL
            urls = re.findall(r'https?://[^\s;|]+', text_stripped)
            if urls:
                return urls

        # 按分隔符拆分（不再包含空格）
        parts = re.split(self.splitter_pattern, text_stripped)

        valid_urls = []
        for part in parts:
            part = part.strip()
            # 从每个部分中提取URL
            urls = re.findall(r'https?://[^\s;|]+', part)
            for url in urls:
                if self._is_valid_url(url):
                    valid_urls.append(url)

        return valid_urls
    
    def _is_valid_url(self, url: str) -> bool:
        """
        验证URL是否有效
        
        Args:
            url: URL字符串
            
        Returns:
            是否为有效URL
        """
        if not url or len(url) < 10:  # 太短的不太可能是URL
            return False
        
        # 检查是否包含http协议
        if not (url.startswith('http://') or url.startswith('https://')):
            return False
        
        # 尝试解析URL
        try:
            parsed = urlparse(url)
            return bool(parsed.netloc and parsed.scheme)
        except:
            return False
    
    def get_image_count(self, image_links: List[str]) -> int:
        """获取有效图片数量"""
        return len(image_links)
    
    def get_primary_image(self, image_links: List[str]) -> Optional[str]:
        """获取主图（第一张图片）"""
        return image_links[0] if image_links else None
    
    def serialize_images(self, image_links: List[str]) -> Optional[str]:
        """
        将图片链接序列化为JSON字符串
        
        Args:
            image_links: 图片链接列表
            
        Returns:
            JSON字符串，如果为空返回None
        """
        if not image_links:
            return None
        
        try:
            return json.dumps(image_links, ensure_ascii=False)
        except:
            logger.warning(f"Failed to serialize image links: {image_links}")
            return None
    
    def deserialize_images(self, image_json: Optional[str]) -> List[str]:
        """
        从JSON字符串反序列化图片链接
        
        Args:
            image_json: JSON字符串
            
        Returns:
            图片链接列表
        """
        if not image_json:
            return []
        
        try:
            links = json.loads(image_json)
            if isinstance(links, list):
                return [str(link) for link in links if link]
            return []
        except:
            logger.warning(f"Failed to deserialize image JSON: {image_json}")
            return []