function normalizeExecutorCommandValue(command: string) {
  return command
    .replace(/^["'`]+|["'`]+$/g, '')
    .replace(/\s+/g, ' ')
    .trim();
}

export type ExecutorActivityDescriptor = {
  kindLabel: string;
  focusLabel: string;
  detailLabel: string;
  message: string;
};

export function normalizeExecutorFocusLabel(focus: string) {
  const normalizedFocus = focus.trim();

  if (!normalizedFocus) {
    return '현재 요청';
  }

  return normalizedFocus.replace(/\s*(중|중입니다|하기|하기 위해)$/u, '').trim() || normalizedFocus;
}

function buildExecutorActivityMessage(kindLabel: string, focusLabel: string, detail: string) {
  return `${kindLabel} · ${focusLabel}${detail}`;
}

function buildExecutorActivityDescriptor(
  kindLabel: string,
  focusLabel: string,
  detailLabel: string,
): ExecutorActivityDescriptor {
  return {
    kindLabel,
    focusLabel,
    detailLabel,
    message: buildExecutorActivityMessage(kindLabel, focusLabel, ` ${detailLabel}`),
  };
}

function summarizeByFocusOnly(focusLabel: string) {
  const normalizedFocus = focusLabel.toLowerCase();

  if (/검증|확인|캡처|스크린샷/u.test(focusLabel)) {
    return buildExecutorActivityDescriptor('검증', focusLabel, '확인 내용을 정리하는 중');
  }

  if (/테스트/u.test(focusLabel) || /\btest\b/u.test(normalizedFocus)) {
    return buildExecutorActivityDescriptor('테스트', focusLabel, '테스트 범위를 정리하는 중');
  }

  if (/문서|정리|메모/u.test(focusLabel)) {
    return buildExecutorActivityDescriptor('정리', focusLabel, '결과 문구와 작업 메모를 정리하는 중');
  }

  if (/조회|데이터|db|api/u.test(focusLabel) || /\b(db|api|query)\b/u.test(normalizedFocus)) {
    return buildExecutorActivityDescriptor('조회', focusLabel, '확인에 필요한 데이터를 정리하는 중');
  }

  return buildExecutorActivityDescriptor('개발', focusLabel, '구현 내용을 정리하는 중');
}

export function describeExecutorCommand(command: string | null, focus: string) {
  const focusLabel = normalizeExecutorFocusLabel(focus);

  if (!command) {
    return summarizeByFocusOnly(focusLabel);
  }

  const normalizedCommand = normalizeExecutorCommandValue(command);

  if (!normalizedCommand) {
    return summarizeByFocusOnly(focusLabel);
  }

  const normalizedLowerCommand = normalizedCommand.toLowerCase();

  if (/\bapply_patch\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('개발', focusLabel, '기능을 코드에 반영하는 중');
  }

  if (/\brg\b|\bgrep\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('분석', focusLabel, '작업에 필요한 코드 위치를 찾는 중');
  }

  if (/\bsed\b|\bcat\b|\bless\b|\bhead\b|\btail\b|\bnl\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('분석', focusLabel, '작업 범위의 파일 내용을 확인하는 중');
  }

  if (/\bfind\b|\bls\b|\bstat\b|\bwc\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('분석', focusLabel, '작업과 연결된 파일 구성을 확인하는 중');
  }

  if (/\b(playwright|cypress)\b.*\bcapture\b|\bcapture:[a-z0-9:-]+\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('검증', focusLabel, '화면을 캡처해 반영 상태를 확인하는 중');
  }

  if (/\bnpm\b.*\b(tsc|type-?check)\b|\btsc\b.*--noemit/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('검증', focusLabel, '변경 뒤 타입 오류를 점검하는 중');
  }

  if (/\bvitest\b|\bjest\b|\bmocha\b|\bplaywright\b|\bcypress\b|\btest\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('테스트', focusLabel, '변경 뒤 동작을 테스트하는 중');
  }

  if (/\bbuild\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('검증', focusLabel, '변경 결과가 빌드되는지 확인하는 중');
  }

  if (/\bgit\s+diff\b|\bgit\s+status\b|\bgit\s+show\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('정리', focusLabel, '변경 범위를 정리하는 중');
  }

  if (/\bcurl\b|\bwget\b|\bfetch\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('검증', focusLabel, '작업과 연결된 API 응답을 확인하는 중');
  }

  if (/\bsqlite3\b|\bpsql\b|\bmysql\b|\bselect\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('조회', focusLabel, '작업에 필요한 데이터를 조회하는 중');
  }

  if (/\bnpm\b.*\bcapture\b|\bnode\b.*\bcapture\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('검증', focusLabel, '캡처 산출물을 생성하는 중');
  }

  if (/\bnode\b|\bnpm\b|\byarn\b|\bpnpm\b|\bbash\b|\bsh\b/u.test(normalizedLowerCommand)) {
    return buildExecutorActivityDescriptor('실행', focusLabel, '작업을 실행 환경에서 확인하는 중');
  }

  return buildExecutorActivityDescriptor('진행', focusLabel, '작업을 진행하는 중');
}

export function summarizeExecutorCommand(command: string | null, focus: string) {
  return describeExecutorCommand(command, focus).message;
}
