"""
运行管理模块
管理每次运行的输出目录，确保每次运行的结果独立存储
"""

from datetime import datetime
from pathlib import Path
from typing import Optional

from .logger import get_logger


class RunManager:
    """
    运行管理类：为每次运行创建独立的输出目录

    每次运行都会在基础输出目录下创建一个独立的子目录
    用于存储该次运行的所有结果文件，便于区分和管理不同运行的结果

    使用示例：
        >>> run_manager = RunManager(base_output_dir="output")
        >>> run_dir = run_manager.create_run_directory()
        >>> print(run_dir) # 输出: output/run_20250101_120000
    """

    def __init__(self, base_output_dir: str = "output"):
        """
        初始化运行管理器

        Args:
            base_output_dir: 基础输出目录
        """
        self.base_output_dir = Path(base_output_dir)
        self.base_output_dir.mkdir(parents=True, exist_ok=True)
        self.current_run_dir: Optional[Path] = None
        self.run_id: Optional[str] = None
        self.logger = get_logger("taskflow.run_manager")

    def create_run_directory(self, run_id: Optional[str] = None) -> str:
        """
        创建本次运行的输出目录

        Args:
            run_id: 运行ID（如果为None，使用当前时间戳）

        Returns:
            str: 本次运行的输出目录路径
        """
        if run_id is None:
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            run_id = f"run_{timestamp}"

        self.run_id = run_id
        self.current_run_dir = self.base_output_dir / run_id
        self.current_run_dir.mkdir(parents=True, exist_ok=True)

        self.logger.info(f"本次运行的输出目录: {self.current_run_dir}")
        return str(self.current_run_dir)

    def get_run_directory(self) -> str:
        """
        获取本次运行的输出目录

        Returns:
            str: 本次运行的输出目录路径

        Raises:
            RuntimeError: 未创建运行目录
        """
        if self.current_run_dir is None:
            raise RuntimeError("未创建运行目录, 请先调用 create_run_directory 方法")
        return str(self.current_run_dir)

    def get_run_id(self) -> str:
        """
        获取本次运行的运行ID

        Returns:
            str: 本次运行的运行ID
        """
        if self.run_id is None:
            raise RuntimeError("未创建运行目录, 请先调用 create_run_directory 方法")
        return self.run_id
    
    def list_runs(self) -> list:
        """
        列出所有以存在的运行目录

        Returns:
            运行ID列表，按时间排序，最新的运行排在前面
        """
        runs = []
        for item in self.base_output_dir.iterdir():
            if item.is_dir() and item.name.startswith("run_"):
                runs.append({
                    "run_id": item.name,
                    "path": str(item),
                    "created_at": datetime.fromtimestamp(item.stat().st_ctime).isoformat()
                })
        
        runs.sort(key=lambda x: x["created_at"], reverse=True)
        return runs
        
