import os
import requests
import zipfile
from pathlib import Path

class PDFProcessor:
    """PDF处理器：使用API提取图片（参考 ExtraPdf.py）"""
    
    def __init__(self, api_url=None):
        # API配置（参考 ExtraPdf.py）
        self.api_url = api_url or "https://pdf.lutong.space/api/v1/misc/extract-images"
        print("📄 PDF处理器初始化")
        print(f"   API端点: {self.api_url}")
    
    def update_config(self, api_url=None):
        """
        更新PDF处理器配置
        
        Args:
            api_url: API端点URL
        """
        if api_url:
            self.api_url = api_url
            print(f"🔄 PDF处理器配置已更新:")
            print(f"   API端点: {self.api_url}")
    
    def process(self, pdf_path, process_id):
        """
        处理PDF文件（使用API提取图片）
        
        Args:
            pdf_path: PDF文件路径
            process_id: 动态处理ID（作为文件夹名称）
            
        Returns:
            dict: {'images': [...], 'text': '...', 'page_count': N}
        """
        try:
            print(f"\n   📄 开始处理PDF文件")
            print(f"   📁 PDF路径: {pdf_path}")
            print(f"   🆔 Process ID: {process_id}")
            
            # 使用API提取图片（参考 ExtraPdf.py）
            images = self._extract_images_via_api(pdf_path, process_id)
            
            # 不提取文本（专注于图片）
            text = []
            
            return {
                'images': images,
                'text': text,
                'page_count': len(images) if images else 0
            }
            
        except Exception as e:
            print(f"   ❌ PDF处理错误: {str(e)}")
            import traceback
            traceback.print_exc()
            raise
    
    def _extract_images_via_api(self, pdf_path, process_id):
        """
        使用API从PDF中提取图片（参考 ExtraPdf.py）
        
        Args:
            pdf_path: PDF文件路径
            process_id: 动态处理ID（作为文件夹名称）
            
        Returns:
            list: 提取的图片信息列表
        """
        images = []
        
        try:
            # 创建输出目录：processed/images/{process_id}/
            # 注意：这里使用 process_id 作为文件夹名称
            output_dir = os.path.join('processed', 'images', process_id)
            os.makedirs(output_dir, exist_ok=True)
            
            print(f"   🌐 调用PDF图片提取API...")
            print(f"   📂 输出目录: {output_dir}")
            
            # 打开PDF文件并准备multipart/form-data请求
            with open(pdf_path, 'rb') as pdf_file:
                files = {
                    'fileInput': (os.path.basename(pdf_path), pdf_file, 'application/pdf')
                }
                data = {
                    'format': 'png',
                    'allowDuplicates': 'false'
                }
                headers = {
                    'accept': '*/*'
                }
                
                print(f"   📤 发送请求到API...")
                
                # 发送POST请求
                response = requests.post(
                    self.api_url, 
                    files=files, 
                    data=data, 
                    headers=headers,
                    timeout=120  # 增加超时时间
                )
                
                # 检查响应状态
                if response.status_code != 200:
                    error_msg = f"API请求失败，状态码: {response.status_code}"
                    print(f"   ❌ {error_msg}")
                    return images
                
                print(f"   ✅ 成功接收到ZIP文件 ({len(response.content)} 字节)")
                
                # 保存ZIP文件到临时位置
                temp_zip_path = os.path.join(output_dir, f"{process_id}_temp.zip")
                with open(temp_zip_path, 'wb') as zip_file:
                    zip_file.write(response.content)
                
                print(f"   📦 开始解压ZIP文件...")
                
                # 解压ZIP文件
                with zipfile.ZipFile(temp_zip_path, 'r') as zip_ref:
                    # 提取所有PNG文件
                    png_count = 0
                    for file_info in zip_ref.namelist():
                        if file_info.lower().endswith('.png'):
                            # 解压到输出目录
                            zip_ref.extract(file_info, output_dir)
                            
                            # 获取解压后的文件路径
                            extracted_path = os.path.join(output_dir, file_info)
                            
                            # 添加到图片列表
                            images.append({
                                'path': f'/processed/images/{process_id}/{file_info}',
                                'filename': file_info,
                                'local_path': extracted_path
                            })
                            
                            png_count += 1
                            print(f"      ✓ 已解压: {file_info}")
                
                # 删除临时ZIP文件
                if os.path.exists(temp_zip_path):
                    os.remove(temp_zip_path)
                    print(f"   🗑️  已删除临时ZIP文件")
                
                print(f"   ✅ 成功提取 {len(images)} 张图片到: {output_dir}")
                
                return images
                
        except FileNotFoundError:
            print(f"   ❌ PDF文件不存在: {pdf_path}")
            return images
        except requests.exceptions.Timeout:
            print(f"   ❌ API请求超时（120秒）")
            return images
        except requests.exceptions.RequestException as e:
            print(f"   ❌ 网络请求错误: {str(e)}")
            return images
        except zipfile.BadZipFile:
            print(f"   ❌ 下载的文件不是有效的ZIP文件")
            return images
        except Exception as e:
            print(f"   ❌ 图片提取错误: {str(e)}")
            import traceback
            traceback.print_exc()
            return images
