package com.agent.management.external;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.Instant;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 外部 API 运行注册表：跟踪「已创建未启动」的运行状态（CREATED）。
 *
 * 工作流：
 * 1. POST /runs 创建运行 → register(runId, workflowId, inputs, ttlHours)
 * 2. POST /runs/{runId}/start 启动 → consume(runId) 取出 inputs 传给引擎
 * 3. 注册表中的运行在启动后或 TTL 到期后自动清理
 *
 * WorkflowRun 表只能记录 RUNNING/SUCCESS/FAILED，无法表达「未启动」状态，
 * 故此处单独维护内存表（重启后 CREATED 状态会丢失，但工作目录保留，可重新 POST /runs）。
 */
@Slf4j
@Component
public class ExternalRunRegistry {

    private final Map<String, CreatedRun> store = new ConcurrentHashMap<>();

    /**
     * 注册一个新建的运行。
     */
    public void register(String runId, Long workflowId, String workflowName, Map<String, Object> inputs, int ttlHours) {
        Instant expiresAt = Instant.now().plusSeconds(ttlHours * 3600L);
        store.put(runId, new CreatedRun(workflowId, workflowName, inputs, expiresAt));
    }

    /**
     * 取出并移除一个新建的运行（启动时调用）。
     * @return null 表示不存在或已过期
     */
    public CreatedRun consume(String runId) {
        CreatedRun run = store.remove(runId);
        if (run == null) return null;
        if (run.expiresAt.isBefore(Instant.now())) {
            log.debug("[ExternalRunRegistry] runId={} 已过期", runId);
            return null;
        }
        return run;
    }

    /**
     * 查询（不消费）一个运行的元数据。
     */
    public CreatedRun peek(String runId) {
        CreatedRun run = store.get(runId);
        if (run == null) return null;
        if (run.expiresAt.isBefore(Instant.now())) {
            store.remove(runId);
            return null;
        }
        return run;
    }

    public record CreatedRun(Long workflowId, String workflowName, Map<String, Object> inputs, Instant expiresAt) {}
}
