Source: utils/idGenerator.js

/**
 * @module utils/idGenerator
 * @description Short, human-readable ID generators backed by SQLite counters.
 *
 * Produces IDs similar to major test management tools:
 * - Tests: `TC-1`, `TC-2` (like TestRail's C1234)
 * - Runs: `RUN-1`, `RUN-2` (like TestRail's R123)
 * - Projects: `PRJ-1`, `PRJ-2`
 * - Activities: `ACT-1`, `ACT-2`
 *
 * Counters are stored in the SQLite `counters` table and incremented atomically.
 *
 * ### Exports
 * - {@link generateTestId}, {@link generateRunId}, {@link generateProjectId}, {@link generateActivityId}
 * - {@link initCountersFromExistingData} — No-op (kept for backward compatibility).
 */

import * as counterRepo from "../database/repositories/counterRepo.js";

/**
 * generateTestId(db) → "TC-1", "TC-2", …
 * @param {Object} [_db] — Ignored (kept for backward compatibility).
 */
export function generateTestId(_db) {
  return `TC-${counterRepo.next("test")}`;
}

/**
 * generateRunId(db) → "RUN-1", "RUN-2", …
 * @param {Object} [_db] — Ignored (kept for backward compatibility).
 */
export function generateRunId(_db) {
  return `RUN-${counterRepo.next("run")}`;
}

/**
 * generateProjectId(db) → "PRJ-1", "PRJ-2", …
 * @param {Object} [_db] — Ignored (kept for backward compatibility).
 */
export function generateProjectId(_db) {
  return `PRJ-${counterRepo.next("project")}`;
}

/**
 * generateActivityId(db) → "ACT-1", "ACT-2", …
 * @param {Object} [_db] — Ignored (kept for backward compatibility).
 */
export function generateActivityId(_db) {
  return `ACT-${counterRepo.next("activity")}`;
}

/**
 * generateWebhookTokenId() → "WH-1", "WH-2", …
 * Used for per-project CI/CD trigger tokens (ENH-011).
 */
export function generateWebhookTokenId() {
  return `WH-${counterRepo.next("webhook")}`;
}

/**
 * generateScheduleId() → "SCH-1", "SCH-2", …
 * Used for project cron schedules (ENH-006).
 */
export function generateScheduleId() {
  return `SCH-${counterRepo.next("schedule")}`;
}

/**
 * generateWorkspaceId() → "WS-1", "WS-2", …
 * Used for multi-tenancy workspaces (ACL-001).
 */
export function generateWorkspaceId() {
  return `WS-${counterRepo.next("workspace")}`;
}

/**
 * generateWorkspaceMemberId() → "WM-1", "WM-2", …
 * Used for workspace membership records (ACL-002).
 */
export function generateWorkspaceMemberId() {
  return `WM-${counterRepo.next("workspace_member")}`;
}

/**
 * generateNotificationSettingId() → "NS-1", "NS-2", …
 * Used for per-project notification settings (FEA-001).
 */
export function generateNotificationSettingId() {
  return `NS-${counterRepo.next("notification_setting")}`;
}

/**
 * No-op — counters are now managed by the SQLite `counters` table.
 * Kept for backward compatibility so existing callers don't break.
 * The migration script (database/migrate.js) seeds the counters table
 * from existing IDs when migrating from the legacy JSON store.
 *
 * @param {Object} [_db] — Ignored.
 */
export function initCountersFromExistingData(_db) {
  // Intentionally empty — counters are seeded during migration.
}