'use strict';

var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);

// src/features/watch-pr-review/application/review-queue.ts
var ReviewQueue = class {
  constructor() {
    /** 처리 대기 중인 작업 목록 */
    __publicField(this, "pending", []);
    /** 대기 또는 진행 중인 PR URL 집합 (중복 적재 차단용) */
    __publicField(this, "tracked", /* @__PURE__ */ new Set());
    /** 진행 중인 작업의 시작 시각 맵 (URL → epoch ms) */
    __publicField(this, "inFlightStartedAt", /* @__PURE__ */ new Map());
    /** 진행 중인 작업의 PR 번호 맵 (하트비트 표시용) */
    __publicField(this, "inFlightPrNumber", /* @__PURE__ */ new Map());
  }
  /**
   * @description 작업을 큐에 적재한다. 이미 대기/진행 중인 PR이면 적재하지 않는다.
   * @param task 적재할 리뷰 작업
   * @returns 새로 적재되면 true, 중복이면 false
   */
  enqueue(task) {
    const { url } = task.pullRequest;
    if (this.tracked.has(url)) {
      return false;
    }
    this.tracked.add(url);
    this.pending.push(task);
    return true;
  }
  /**
   * @description 대기 중인 작업을 하나 꺼내 진행 중 상태로 표시한다.
   * @param now 현재 시각(epoch ms). 진행 경과시간 계산 기준이다.
   * @returns 꺼낸 작업. 비어 있으면 undefined
   */
  dequeue(now) {
    const task = this.pending.shift();
    if (task) {
      this.inFlightStartedAt.set(task.pullRequest.url, now);
      this.inFlightPrNumber.set(task.pullRequest.url, task.pullRequest.number);
    }
    return task;
  }
  /**
   * @description 작업 처리 완료를 표시해 추적/진행 상태에서 제거한다.
   * @param url 완료된 PR URL
   */
  markDone(url) {
    this.tracked.delete(url);
    this.inFlightStartedAt.delete(url);
    this.inFlightPrNumber.delete(url);
  }
  /**
   * @description 해당 PR이 대기 또는 진행 중으로 추적되고 있는지 확인한다.
   * @param url 확인할 PR URL
   * @returns 추적 중이면 true
   */
  isTracked(url) {
    return this.tracked.has(url);
  }
  /** 대기 중 작업 수다. */
  get pendingCount() {
    return this.pending.length;
  }
  /** 진행 중 작업 수다. */
  get inFlightCount() {
    return this.inFlightStartedAt.size;
  }
  /**
   * @description 진행 중 작업들의 경과시간 스냅샷을 반환한다. (하트비트 표시용)
   * @param now 현재 시각(epoch ms)
   * @returns 진행 중 작업 정보 목록
   */
  getInFlight(now) {
    const result = [];
    for (const [url, startedAt] of this.inFlightStartedAt) {
      result.push({
        elapsedMs: now - startedAt,
        prNumber: this.inFlightPrNumber.get(url) ?? 0,
        url
      });
    }
    return result;
  }
};

exports.ReviewQueue = ReviewQueue;
