package com.qqchen.deploy.backend.deploy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.core.task.AsyncTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class ThreadPoolConfig {
    
    /**
     * Jenkins任务同步线程池 - 使用虚拟线程（Java 21+）
     * 
     * ⚠️ 为什么使用虚拟线程？
     * 1. Jenkins API调用是典型的**网络I/O密集型**任务
     * 2. 等待Jenkins响应时线程会长时间阻塞
     * 3. 虚拟线程在阻塞时不占用OS线程，资源消耗极低
     * 4. 支持数百个并发Jenkins构建同步
     */
    @Bean("jenkinsTaskExecutor")
    public SimpleAsyncTaskExecutor jenkinsTaskExecutor() {
        SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("jenkins-virtual-");
        executor.setVirtualThreads(true);
        executor.setConcurrencyLimit(-1); // 无限制
        return executor;
    }

    /**
     * 仓库项目同步线程池 - 使用虚拟线程（Java 21+）
     * 
     * ⚠️ 为什么使用虚拟线程？
     * 1. Git操作（clone/fetch/pull）是**I/O密集型**任务
     * 2. 网络I/O（从远程仓库拉取代码）+ 磁盘I/O（写入本地）
     * 3. 虚拟线程支持大量并发仓库同步，无线程池限制
     */
    @Bean("repositoryProjectExecutor")
    public SimpleAsyncTaskExecutor repositoryProjectExecutor() {
        SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("repo-project-virtual-");
        executor.setVirtualThreads(true);
        executor.setConcurrencyLimit(-1); // 无限制
        return executor;
    }

    /**
     * 仓库分支同步线程池 - 使用虚拟线程（Java 21+）
     * 
     * ⚠️ 为什么使用虚拟线程？
     * 1. Git分支操作（checkout/merge/rebase）是**I/O密集型**任务
     * 2. 大量磁盘I/O（读取/写入Git对象）
     * 3. 虚拟线程支持数百个并发分支同步
     */
    @Bean("repositoryBranchExecutor")
    public SimpleAsyncTaskExecutor repositoryBranchExecutor() {
        SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("repo-branch-virtual-");
        executor.setVirtualThreads(true);
        executor.setConcurrencyLimit(-1); // 无限制
        return executor;
    }

    /**
     * 服务器监控线程池 - 使用虚拟线程（Java 21+）
     * 
     * ⚠️ 为什么使用虚拟线程？
     * 1. SSH连接 + 远程命令执行是**网络I/O密集型**任务
     * 2. 等待SSH响应时线程会长时间阻塞
     * 3. 虚拟线程在阻塞时不占用OS线程，资源消耗极低
     * 4. 支持数百台服务器并发监控，无需担心线程池耗尽
     * 
     * 💡 场景：
     * - 定时采集服务器CPU、内存、磁盘、网络指标
     * - 并发检测服务器在线状态
     * - SSH命令执行（top、free、df等）
     */
    @Bean("serverMonitorExecutor")
    public SimpleAsyncTaskExecutor serverMonitorExecutor() {
        SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("server-monitor-virtual-");
        executor.setVirtualThreads(true);
        executor.setConcurrencyLimit(-1); // 无限制，支持大量并发
        return executor;
    }

    /**
     * 通用应用任务线程池 - 保留平台线程（不使用虚拟线程）
     * 
     * ⚠️ 为什么不使用虚拟线程？
     * 1. 通用线程池用途未知，可能包含**CPU密集型**任务
     * 2. CPU密集型任务使用虚拟线程反而会降低性能（线程调度开销）
     * 3. 虚拟线程适合I/O密集型，不适合计算密集型
     * 4. 平台线程对CPU密集型任务更高效
     * 
     * 💡 如果确认只用于I/O密集型任务，可改为虚拟线程
     */
    @Bean("applicationTaskExecutor")
    public AsyncTaskExecutor applicationTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() * 2);
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 4);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("application-task-");
        executor.setKeepAliveSeconds(60);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);
        executor.initialize();
        return executor;
    }
    
    // ========== 注意 ==========
    // sshOutputExecutor 已迁移到 Framework 层
    // 见: framework.ssh.websocket.SSHWebSocketConfig
    // SSH WebSocket 框架自己管理线程池，业务层无需关心
} 