const TERMINAL = new Set(['succeeded', 'failed', 'cancelled', 'expired'])

type JobErrorSource = {
  error?: string
  progress?: {
    steps?: Array<{ status: string; message?: string }>
  }
}

/** 任務失敗時的錯誤訊息（優先 failed step，其次 job.error）。 */
export function jobErrorMessage(job: JobErrorSource): string | null {
  const failedStep = job.progress?.steps?.find((step) => step.status === 'failed')
  const message = failedStep?.message?.trim() || job.error?.trim()
  return message || null
}

export function isTerminalJobStatus(status: string): boolean {
  return TERMINAL.has(status)
}

export function isActiveJobStatus(status: string): boolean {
  const normalized = status.trim()
  if (!normalized) return false
  return !isTerminalJobStatus(normalized)
}

/** 研究地圖／圖譜擴展按鈕文案（依任務狀態） */
export function expandGraphActionLabel(status?: string | null, hasExistingMap?: boolean): string {
  if (!status) {
    return hasExistingMap ? '重新產生' : '產生研究地圖'
  }
  if (status === 'cancel_requested') return '取消中…'
  if (isActiveJobStatus(status)) return '產生中…'
  return hasExistingMap ? '重新產生' : '產生研究地圖'
}

/** 進行中任務的說明（含取消中） */
export function activeExpandJobHint(job: { status: string; progress?: { summary?: string } }): string {
  if (job.status === 'cancel_requested') {
    return '上一個任務正在取消，通常幾秒內完成。結束後才能重新產生研究地圖。'
  }
  return job.progress?.summary?.trim() || '研究地圖產生中，請稍候…'
}

/** 終態任務結束後給使用者的提示 */
export function expandJobTerminalMessage(status: string): string | null {
  switch (status) {
    case 'succeeded':
      return '研究地圖已更新'
    case 'cancelled':
      return '任務已取消，可以重新產生研究地圖。'
    case 'expired':
      return '任務已過期（執行逾時），可以重新產生研究地圖。'
    case 'failed':
      return null
    default:
      return null
  }
}

/** 409「已有進行中任務」→ 使用者看得懂的中文 */
export function formatActiveJobConflictError(message: string): string {
  if (/active job already exists|已有進行中的任務/i.test(message)) {
    return '此主題仍有進行中的背景任務（可能正在取消）。請稍候任務結束後，再按「重新產生」。'
  }
  return message
}

export function jobStatusLabel(status: string): string {
  switch (status) {
    case 'pending':
      return '等待中'
    case 'queued':
      return '已排隊'
    case 'running':
      return '執行中'
    case 'waiting_worker':
      return '等待 Worker'
    case 'cancel_requested':
      return '取消中'
    case 'succeeded':
      return '已完成'
    case 'failed':
      return '失敗'
    case 'cancelled':
      return '已取消'
    case 'expired':
      return '已過期'
    default:
      return status
  }
}

export function jobStatusBadgeClass(status: string): string {
  switch (status) {
    case 'running':
      return 'ac-status-badge--running'
    case 'queued':
    case 'pending':
    case 'waiting_worker':
      return 'ac-status-badge--queued'
    case 'cancel_requested':
      return 'ac-status-badge--waiting'
    case 'succeeded':
      return 'ac-status-badge--success'
    case 'failed':
    case 'expired':
      return 'ac-status-badge--danger'
    case 'cancelled':
      return 'ac-status-badge--muted'
    default:
      return 'ac-status-badge--muted'
  }
}