"""
OCR处理器

处理图片文件的OCR识别完整流程：图片识别 → Excel处理 → 标准采购单生成
"""

import os
from pathlib import Path
from typing import Optional, Dict, Any, List

from app.core.processors.base import BaseProcessor
from app.services.ocr_service import OCRService
from app.services.order_service import OrderService
from app.core.utils.log_utils import get_logger

logger = get_logger(__name__)


class OCRProcessor(BaseProcessor):
    """OCR处理器
    
    处理图片文件的完整OCR识别流程：
    1. OCR识别图片中的表格信息
    2. 处理识别结果生成Excel文件
    3. 转换为标准采购单格式
    """
    
    def __init__(self, config: Dict[str, Any]):
        """初始化OCR处理器
        
        Args:
            config: 配置信息
        """
        super().__init__(config)
        self.description = "OCR识别完整流程（图片→识别→Excel→采购单）"
        
        # 初始化服务
        self.ocr_service = OCRService(config)
        self.order_service = OrderService(config)
    
    def can_process(self, file_path: Path) -> bool:
        """判断是否为支持的图片文件
        
        Args:
            file_path: 文件路径
            
        Returns:
            是否能处理该文件
        """
        if not self.validate_input(file_path):
            return False
        
        # 支持的图片格式
        supported_extensions = ['.jpg', '.jpeg', '.png', '.bmp']
        
        if file_path.suffix.lower() in supported_extensions:
            self.logger.info(f"识别为图片文件: {file_path.name}")
            return True
        
        return False
    
    def process(self, input_file: Path, output_dir: Path) -> Optional[Path]:
        """处理图片文件的完整OCR流程
        
        Args:
            input_file: 输入图片文件路径
            output_dir: 输出目录路径
            
        Returns:
            输出文件路径，处理失败返回None
        """
        self.log_processing_start(input_file)
        
        try:
            self.logger.info("开始OCR识别流程...")
            
            # 步骤1: OCR识别
            self.logger.info("步骤1/3: OCR识别图片...")
            ocr_result = self._perform_ocr(input_file, output_dir)
            if not ocr_result:
                self.logger.error("OCR识别失败")
                self.log_processing_end(input_file, success=False)
                return None
            
            # 步骤2: Excel处理
            self.logger.info("步骤2/3: 处理Excel文件...")
            excel_result = self._process_excel(ocr_result, output_dir)
            if not excel_result:
                self.logger.error("Excel处理失败")
                self.log_processing_end(input_file, success=False)
                return None
            
            # 步骤3: 生成标准采购单
            self.logger.info("步骤3/3: 生成标准采购单...")
            final_result = self._generate_purchase_order(excel_result, output_dir)
            
            if final_result:
                self.logger.info(f"OCR处理流程完成，输出文件: {final_result}")
                self.log_processing_end(input_file, final_result, success=True)
                return final_result
            else:
                self.logger.error("生成采购单失败")
                self.log_processing_end(input_file, success=False)
                return None
                
        except Exception as e:
            self.logger.error(f"OCR处理流程出错: {e}", exc_info=True)
            self.log_processing_end(input_file, success=False)
            return None
    
    def get_required_columns(self) -> List[str]:
        """返回需要的列名列表"""
        # OCR处理不直接依赖列名，由后续处理步骤决定
        return []
    
    def get_supported_extensions(self) -> List[str]:
        """支持的文件扩展名"""
        return ['.jpg', '.jpeg', '.png', '.bmp']
    
    def _perform_ocr(self, input_file: Path, output_dir: Path) -> Optional[Path]:
        """执行OCR识别
        
        Args:
            input_file: 输入图片文件
            output_dir: 输出目录
            
        Returns:
            OCR生成的Excel文件路径，失败返回None
        """
        try:
            self.logger.info(f"开始OCR识别: {input_file}")
            
            # 使用OCR服务处理图片
            result_path = self.ocr_service.process_image(str(input_file))
            
            if result_path:
                # 确保结果文件在输出目录中
                result_path = Path(result_path)
                if result_path.exists():
                    self.logger.info(f"OCR识别成功，输出文件: {result_path}")
                    return result_path
                else:
                    self.logger.error(f"OCR结果文件不存在: {result_path}")
                    return None
            else:
                self.logger.error("OCR服务返回None")
                return None
                
        except Exception as e:
            self.logger.error(f"OCR识别失败: {e}", exc_info=True)
            return None
    
    def _process_excel(self, excel_file: Path, output_dir: Path) -> Optional[Path]:
        """处理Excel文件
        
        Args:
            excel_file: Excel文件路径
            output_dir: 输出目录
            
        Returns:
            处理后的Excel文件路径，失败返回None
        """
        try:
            self.logger.info(f"开始处理Excel文件: {excel_file}")
            
            # 使用订单服务处理Excel文件（生成采购单）
            result_path = self.order_service.process_excel(str(excel_file))
            
            if result_path:
                result_path = Path(result_path)
                if result_path.exists():
                    self.logger.info(f"Excel处理成功，输出文件: {result_path}")
                    return result_path
                else:
                    self.logger.error(f"Excel处理结果文件不存在: {result_path}")
                    return None
            else:
                self.logger.error("Excel处理服务返回None")
                return None
                
        except Exception as e:
            self.logger.error(f"Excel处理失败: {e}", exc_info=True)
            return None
    
    def _generate_purchase_order(self, processed_file: Path, output_dir: Path) -> Optional[Path]:
        """采购单生成由OrderService完成，此处直接返回处理结果"""
        try:
            if processed_file and processed_file.exists():
                return processed_file
            return None
        except Exception:
            return None
