#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
OCR订单处理系统 - 主入口
---------------------
提供命令行接口，整合OCR识别、Excel处理和订单合并功能。
"""

import os
import sys
import argparse
from typing import List, Optional

from app.config.settings import ConfigManager
from app.core.utils.log_utils import get_logger, close_all_loggers, set_log_level
from app.services.ocr_service import OCRService
from app.services.order_service import OrderService
from app.services.tobacco_service import TobaccoService

logger = get_logger(__name__)

def parse_args():
    """
    解析命令行参数
    
    Returns:
        解析后的参数
    """
    parser = argparse.ArgumentParser(description='OCR订单处理系统')
    
    # 通用选项
    parser.add_argument('--config', type=str, help='配置文件路径')
    parser.add_argument('--log-level', type=str, choices=['debug', 'info', 'warning', 'error', 'critical'], help='日志级别')
    
    # 子命令
    subparsers = parser.add_subparsers(dest='command', help='子命令')
    
    # OCR识别命令
    ocr_parser = subparsers.add_parser('ocr', help='OCR识别')
    ocr_parser.add_argument('--input', type=str, help='输入图片路径')
    ocr_parser.add_argument('--batch', action='store_true', help='批量处理')
    ocr_parser.add_argument('--batch-size', type=int, default=5, help='批处理大小')
    ocr_parser.add_argument('--max-workers', type=int, default=4, help='最大线程数')
    
    # Excel处理命令
    excel_parser = subparsers.add_parser('excel', help='Excel处理')
    excel_parser.add_argument('--input', type=str, help='输入Excel文件路径')
    
    # 合并命令
    merge_parser = subparsers.add_parser('merge', help='合并采购单')
    merge_parser.add_argument('--input', type=str, help='输入采购单文件路径（逗号分隔）')
    
    # 完整流程命令
    pipeline_parser = subparsers.add_parser('pipeline', help='完整处理流程')
    pipeline_parser.add_argument('--input', type=str, help='输入图片路径')
    pipeline_parser.add_argument('--merge', action='store_true', help='是否合并采购单')
    
    # 烟草订单处理
    tobacco_parser = subparsers.add_parser('tobacco', help='处理烟草订单')
    tobacco_parser.add_argument('--input', type=str, help='输入订单明细文件路径')
    
    # 解析参数
    parsed_args = parser.parse_args()
    
    return parsed_args

def main():
    """
    主函数入口
    
    Returns:
        退出码
    """
    # 解析命令行参数
    args = parse_args()
    
    if not args.command:
        argparse.ArgumentParser().print_help()
        return 1
    
    # 加载配置
    config_path = args.config
    config_manager = ConfigManager(config_path)
    config = config_manager.config
    
    # 设置日志级别
    log_level = getattr(args, 'log_level', None)
    if log_level:
        set_log_level(log_level)
    
    try:
        if args.command == 'ocr':
            # OCR识别处理
            ocr_service = OCRService(config)
            if args.batch:
                # 批量处理
                total, success = ocr_service.batch_process(
                    batch_size=args.batch_size, 
                    max_workers=args.max_workers
                )
                return 0 if success > 0 else 1
            else:
                # 处理单个文件
                result = ocr_service.process_image(args.input)
                return 0 if result else 1
                
        elif args.command == 'excel':
            # Excel处理
            order_service = OrderService(config)
            if args.input:
                # 处理指定文件
                result = order_service.process_excel(args.input)
            else:
                # 处理最新文件
                result = order_service.process_excel()
            return 0 if result else 1
            
        elif args.command == 'merge':
            # 合并采购单
            order_service = OrderService(config)
            if args.input:
                # 合并指定文件
                file_list = args.input.split(',')
                result = order_service.merge_purchase_orders(file_list)
            else:
                # 合并所有采购单
                result = order_service.merge_all_purchase_orders()
            return 0 if result else 1
            
        elif args.command == 'pipeline':
            # 完整流程
            ocr_service = OCRService(config)
            order_service = OrderService(config)
            
            # 1. OCR处理
            if args.input:
                # 处理单个文件
                excel_file = ocr_service.process_image(args.input)
            else:
                # 批量处理
                total, success = ocr_service.batch_process()
                if total == 0:
                    logger.warning("没有找到需要处理的图片")
                elif success == 0:
                    logger.warning("OCR处理没有成功处理任何新文件")
                excel_file = None  # 批量处理不返回具体文件
            
            # 2. Excel处理
            if excel_file:
                # 处理指定的Excel文件
                result = order_service.process_excel(excel_file)
            else:
                # 处理最新的Excel文件
                result = order_service.process_excel()
                
            if not result:
                logger.error("Excel处理失败")
                return 1
                
            # 3. 合并采购单（可选）
            if args.merge:
                result = order_service.merge_all_purchase_orders()
                if not result:
                    logger.warning("合并采购单失败")
                    # 不影响整体流程，继续执行
            
            return 0
            
        elif args.command == 'tobacco':
            # 烟草订单处理
            tobacco_service = TobaccoService(config)
            if args.input:
                # 处理指定文件
                logger.info(f"开始处理烟草订单，输入文件: {args.input}")
                result = tobacco_service.process_tobacco_order(args.input)
            else:
                # 处理最新文件
                logger.info("开始烟草公司订单处理")
                result = tobacco_service.process_tobacco_order()
            
            # 检查结果是否为None
            if result is None:
                logger.error("烟草订单处理失败")
                return 1
            else:
                logger.info(f"烟草订单处理成功，输出文件: {result}")
                # 确保result是绝对路径
                if not os.path.isabs(result):
                    result = os.path.abspath(result)
                logger.info(f"烟草订单处理完成，绝对路径: {result}")
                return 0
            
        else:
            logger.error(f"未知命令: {args.command}")
            return 1
    
    except Exception as e:
        logger.error(f"执行过程中发生错误: {e}", exc_info=True)
        return 1
    finally:
        # 关闭所有日志记录器
        close_all_loggers()

if __name__ == "__main__":
    sys.exit(main()) 