import { join } from 'node:path';

/**
 * 実行ログ/ランタイム成果物のパス解決（spec §10、計画5）。
 *
 * 成果物ツリーは `{worktreeDir}/space/{id}/files`（既存 spaceFilesDir）、
 * 実行ログはタスク単位の `runs/{taskId}`、競合台帳はスペース単位の `.conflict`。
 */

/** タスク単位の実行ログ root: `{worktreeDir}/space/{id}/runs/{taskId}`。 */
export function spaceRunsDir(worktreeDir: string, spaceId: string, taskId: number): string {
  return join(worktreeDir, 'space', spaceId, 'runs', String(taskId));
}

/** スペース単位の競合台帳 dir: `{worktreeDir}/space/{id}/.conflict`（files の外）。 */
export function spaceConflictDir(worktreeDir: string, spaceId: string): string {
  return join(worktreeDir, 'space', spaceId, '.conflict');
}

/**
 * タスクの実行ログ root を解決する（spec §10.4）。
 * runtime_dir があればそれ、無ければ従来の workspace_path/logs（後方互換）。
 * Phase A では runtime_dir は常に NULL なので現行と byte 一致。
 */
export function logRoot(task: { runtimeDir?: string | null; workspacePath?: string | null }): string {
  if (task.runtimeDir) return task.runtimeDir;
  return join(task.workspacePath ?? '.', 'logs');
}

/**
 * 進捗レポーター（LocalProgressReporter）に渡す runtime_dir を解決する（計画5 / Opus P1）。
 *
 * reporter は workspace 準備直後・local_task 解決より前に構築されるため、
 * ここで先に解決する必要がある。優先順位:
 *  1. local_task の runtime_dir（persistent スペースタスク = space/{id}/runs/{taskId}）
 *  2. job の runtime_dir（subtask など、job 側に焼かれている場合）
 *  3. どちらも無ければ undefined ＝ reporter は workspacePath/logs にフォールバック
 *     （ephemeral / legacy / gitea-issue で従来と byte 一致）。
 *
 * reader 側（file API の `logs` セクション = logRoot(task)）と同じ runtime_dir を
 * 指すことで writer/reader の split-brain を防ぐ。
 */
export function resolveReporterRuntimeDir(args: {
  jobRuntimeDir?: string | null;
  localTaskRuntimeDir?: string | null;
}): string | undefined {
  return args.localTaskRuntimeDir ?? args.jobRuntimeDir ?? undefined;
}
