import subprocess
import time
import sys
import os
from pathlib import Path
from logger import get_system_logger

# ==========================================
# 配置区：确保脚本文件名与你本地一致
# ==========================================
SCRIPTS = [
    "monitor.py",             # 1. 监控 stage，触发视频转录 (调用 video2srt.py)
    "monitorSrt.py",          # 2. 监控 session，触发 Codex 歌词识别
    "monitorSongs.py",        # 3. 监控 session，触发 FFmpeg 视频切片
    "upload.py",              # 4. 监控 session，触发 biliup 自动投稿
    "session_top_comment.py",  # 5. 监控 session，触发 B 站评论置顶
    "add_to_collection.py",   # 5. 新增：监控 session，触发合集归档 <--- 添加这一行
]

# Python 解释器路径 (通常直接用 sys.executable)
PYTHON_EXE = sys.executable

# 初始化日志
logger = get_system_logger('start_all')

# ==========================================

def start_pipeline():
    processes = []
    
    logger.info("="*50)
    logger.info("直播切片 & 自动投稿全自动流水线")
    logger.info("="*50)
    logger.info(f"启动时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
    logger.info(f"当前路径: {os.getcwd()}")
    logger.info(f"Python: {PYTHON_EXE}")

    # 检查所有脚本是否存在
    for script in SCRIPTS:
        if not Path(script).exists():
            logger.error(f"找不到脚本 {script}，请确保它们在同一目录下")
            print(f"[X] 错误: 找不到脚本 {script}，请确保它们在同一目录下。")
            return

    # 逐一启动
    for script in SCRIPTS:
        logger.info(f"正在启动模块: {script}")
        try:
            # 使用 subprocess.Popen 异步启动
            # creationflags=subprocess.CREATE_NEW_CONSOLE 可以让每个脚本在独立窗口运行（仅限 Windows）
            # 如果你希望所有日志都在这一个窗口显示，去掉 creationflags
            p = subprocess.Popen(
                [PYTHON_EXE, script],
                creationflags=subprocess.CREATE_NEW_CONSOLE if os.name == 'nt' else 0
            )
            processes.append((script, p))
            logger.info(f"模块已启动: {script} (PID: {p.pid})")
            time.sleep(1) # 稍微错开启动时间，防止瞬间抢占 IO
        except Exception as e:
            logger.error(f"启动 {script} 失败: {e}")
            print(f"[X] 启动 {script} 失败: {e}")

    logger.info("")
    logger.info("="*50)
    logger.info("所有监控模块已启动！")
    logger.info("请勿关闭此主窗口，除非你想停止整个流水线")
    logger.info("="*50)
    
    print("\n" + "="*50)
    print("[√] 所有监控模块已启动！")
    print("[!] 请勿关闭此主窗口，除非你想停止整个流水线。")
    print("[!] 详细日志请查看 ./logs/system/ 目录")
    print("="*50)

    try:
        # 循环检查子进程状态
        while True:
            for name, p in processes:
                if p.poll() is not None:
                    logger.warning(f"模块 {name} 已意外停止 (Exit Code: {p.poll()})")
                    print(f"\n[⚠️] 警告: 模块 {name} 已意外停止 (Exit Code: {p.poll()})")
                    # 这里可以加入自动重启逻辑
            time.sleep(10)
    except KeyboardInterrupt:
        logger.info("接收到停止信号，正在关闭所有监控模块...")
        print("\n[*] 正在关闭所有监控模块...")
        for name, p in processes:
            p.terminate()
            logger.info(f"模块已终止: {name}")
        logger.info("已安全退出")
        print("[√] 已安全退出。")

if __name__ == "__main__":
    start_all_dir = Path(__file__).parent
    os.chdir(start_all_dir) # 确保工作路径正确
    start_pipeline()