import { StatusAnalysis } from "./types";

const STATUS_DISPLAY: Record<string, string> = {
  WAIT_START: "等待目标代码仓流水线启动",
  RUNNING: "代码仓同步执行中",
  SUCCESS: "代码仓同步成功",
  FAILURE: "执行失败",
  TIMEOUT: "轮询超时,请手动检查目标代码仓同步状态",
  start: "开始",
  running: "代码仓同步执行中",
  success: "代码仓同步成功",
  failure: "执行失败",
};

const FINAL_STATUSES = new Set([
  "SUCCESS", "FAILURE", "TIMEOUT",
  "success", "failure",
]);

export function isStatusFinal(status: string): boolean {
  return FINAL_STATUSES.has(status);
}

const FINAL_STATUS_DISPLAY: Record<string, string> = {
  SUCCESS: "成功",
  FAILURE: "失败",
  TIMEOUT: "超时",
  SKIPPED: "跳过",
  NO_RECORD: "无记录",
};

/**
 * 终态的中文展示名,未映射的状态原样返回。
 *
 * @param status 终态码(如 NO_RECORD / SUCCESS)
 * @return 展示文本
 */
export function displayFinalStatus(status: string): string {
  return FINAL_STATUS_DISPLAY[status] || status;
}

export function analyzeStatus(
  status: string,
  pipelineStatus?: string,
  failReason?: string | null,
): StatusAnalysis {
  const baseText = STATUS_DISPLAY[status] || `未知状态: ${status}`;
  let displayText = baseText;

  if ((status === "FAILURE" || status === "failure") && failReason) {
    displayText = `执行失败: ${failReason}`;
  }

  let severity: "info" | "warning" | "error" | "success";
  if (status === "SUCCESS" || status === "success") {
    severity = "success";
  } else if (status === "FAILURE" || status === "failure" || status === "TIMEOUT") {
    severity = "error";
  } else if (status === "RUNNING" || status === "running") {
    severity = "warning";
  } else {
    severity = "info";
  }

  return { isFinal: isStatusFinal(status), displayText, severity };
}

const PIPELINE_STATUS_DISPLAY: Record<string, string> = {
  MQS_SEND_SUCCESS: "MQS消息已发送,等待启动",
  WAIT_START: "流水线存在,等待启动",
  RUNNING: "流水线正在运行",
  ALREADY_RUNNING: "已有流水线在运行中,当前实例启动失败",
  MQS_SEND_FAILURE: "MQS发送失败,任务结束",
  SUCCESS: "任务结束,运行成功",
  FAILURE: "任务结束,运行失败",
  UNAUTHORIZED: "该用户无权限执行",
  START_FAILURE: "任务结束,启动失败",
  TIMEOUT: "任务执行超时",
  ABORT: "任务被手动中止",
};

/**
 * 获取目标代码仓 pipelineStatus 的中文显示文本
 *
 * @param pipelineStatus 原始状态码(如 WAIT_START, SUCCESS)
 * @return 中文描述,无映射时返回原始值
 */
export function getPipelineStatusDisplay(pipelineStatus: string): string {
  return PIPELINE_STATUS_DISPLAY[pipelineStatus] || pipelineStatus;
}