#!/usr/bin/env python3
"""Main entry point for the Co-location MVP system."""

import argparse
import logging
import os
import sys
from pathlib import Path

# 代码包位于 src/，将 src 加入路径以便导入（必须在导入之前）
project_root = Path(__file__).parent.absolute()
src_dir = project_root / "src"
if str(src_dir) not in sys.path:
    sys.path.insert(0, str(src_dir))

from controller.manager import PipelineManager


def setup_logging(log_level: str = "INFO", log_file: str = None):
    """Setup logging configuration.
    
    Args:
        log_level: Logging level
        log_file: Optional log file path
    """
    # 创建日志目录
    if log_file:
        log_dir = os.path.dirname(log_file)
        if log_dir:
            os.makedirs(log_dir, exist_ok=True)
    
    # 配置日志格式
    log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    date_format = '%Y-%m-%d %H:%M:%S'
    
    handlers = [logging.StreamHandler()]
    if log_file:
        handlers.append(logging.FileHandler(log_file, encoding='utf-8'))
    
    logging.basicConfig(
        level=getattr(logging, log_level.upper()),
        format=log_format,
        datefmt=date_format,
        handlers=handlers
    )


def main():
    """Main function."""
    parser = argparse.ArgumentParser(
        description="交互式 Co-location 模式挖掘系统 (MVP)",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  python main.py
  python main.py --config config/config.yaml
  python main.py --query "我更关注高置信度的三阶模式"
        """
    )
    
    parser.add_argument(
        '--config',
        type=str,
        default='config/config.yaml',
        help='配置文件路径 (默认: config/config.yaml)'
    )
    
    parser.add_argument(
        '--query',
        type=str,
        default=None,
        help='直接执行查询（非交互模式）'
    )
    
    parser.add_argument(
        '--train',
        action='store_true',
        help='手动触发模型训练'
    )
    
    parser.add_argument(
        '--log-level',
        type=str,
        default='INFO',
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
        help='日志级别 (默认: INFO)'
    )
    
    parser.add_argument(
        '--log-file',
        type=str,
        default='logs/mvp.log',
        help='日志文件路径 (默认: logs/mvp.log)'
    )
    
    parser.add_argument(
        '--web',
        action='store_true',
        help='启动 Web 服务 (FastAPI)'
    )
    
    parser.add_argument(
        '--host',
        type=str,
        default='0.0.0.0',
        help='Web 服务主机地址 (默认: 0.0.0.0)'
    )
    
    parser.add_argument(
        '--port',
        type=int,
        default=8000,
        help='Web 服务端口 (默认: 8000)'
    )
    
    parser.add_argument(
        '--iter',
        type=int,
        default=None,
        help='迭代轮数 (Stage4，默认从配置文件读取)'
    )
    
    args = parser.parse_args()
    
    # 设置日志
    setup_logging(args.log_level, args.log_file)
    logger = logging.getLogger(__name__)
    
    try:
        if args.web:
            # Web 模式：启动 FastAPI 服务
            import uvicorn
            logger.info("Starting Web server...")
            uvicorn.run(
                "web.app:app",
                host=args.host,
                port=args.port,
                reload=False,
                log_level=args.log_level.lower()
            )
        else:
            # CLI 模式
            # 初始化管理器
            logger.info("Initializing PipelineManager...")
            manager = PipelineManager(config_path=args.config)
            
            if args.train:
                # 训练模式：手动触发训练
                logger.info("Manual training triggered")
                success = manager.train_model()
                sys.exit(0 if success else 1)
            elif args.query:
                # 非交互模式：直接执行查询
                logger.info(f"Processing query: {args.query}")
                result = manager.process_query(args.query, iteration_rounds=args.iter)
                manager._display_results(result)
            else:
                # 交互模式
                manager.run_pipeline()
            
    except KeyboardInterrupt:
        logger.info("Interrupted by user")
        print("\n\n程序已中断")
        sys.exit(0)
    except Exception as e:
        logger.error(f"Fatal error: {e}", exc_info=True)
        print(f"错误: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()
