export type MailTransportKind = "imap" | "smtp";

export function getPublicMailTransportErrorMessage(
  message: string,
  transport: MailTransportKind,
) {
  const detail = message
    .replace(/^mailbox-smtp-failed:/i, "")
    .replace(/^mailbox-imap-failed:/i, "")
    .replace(/\s+/g, " ")
    .trim();
  const publicPrefixes = [
    "발신 도메인 인증이 통과하지 않았습니다.",
    "메일 계정 인증에 실패했습니다.",
    "받는 사람 주소가 없거나 수신 서버에서 해당 주소를 거절했습니다.",
    "메일 또는 첨부파일 용량이 수신 서버의 허용 한도를 초과했습니다.",
    "수신 메일 서버의 일시적인 발송 제한에 걸렸습니다.",
    "메일 서버와 보안 연결을 설정하지 못했습니다.",
    "메일 서버 응답이 지연되거나 연결되지 않았습니다.",
    "메일은 전송됐지만 보낸메일함에 저장하지 못했습니다.",
    "메일 서버에서 전송을 완료하지 못했습니다.",
  ];

  if (publicPrefixes.some((prefix) => detail.startsWith(prefix))) {
    return detail.slice(0, 300);
  }

  const normalized = detail.toLowerCase();

  if (/5\.7\.26|unauthenticated|\bspf\b|\bdkim\b|\bdmarc\b/.test(normalized)) {
    return "발신 도메인 인증이 통과하지 않았습니다. 도메인 연결 화면에서 SPF와 DKIM 상태를 확인해주세요.";
  }

  if (/auth|authentication|invalid login|invalid credential|\b535\b|password/.test(normalized)) {
    return "메일 계정 인증에 실패했습니다. 계정 비밀번호와 메일 서버 연결 상태를 확인해주세요.";
  }

  if (/5\.1\.1|user unknown|no such user|mailbox unavailable|invalid recipient|recipient rejected/.test(normalized)) {
    return "받는 사람 주소가 없거나 수신 서버에서 해당 주소를 거절했습니다. 이메일 주소를 확인해주세요.";
  }

  if (/message size|too large|size limit|\b552\b/.test(normalized)) {
    return "메일 또는 첨부파일 용량이 수신 서버의 허용 한도를 초과했습니다. 용량을 줄여 다시 보내주세요.";
  }

  if (/rate limit|too many|throttl|\b421\b|\b450\b|\b451\b|\b452\b/.test(normalized)) {
    return "수신 메일 서버의 일시적인 발송 제한에 걸렸습니다. 잠시 후 다시 보내주세요.";
  }

  if (/certificate|\btls\b|\bssl\b/.test(normalized)) {
    return "메일 서버와 보안 연결을 설정하지 못했습니다. 잠시 후 다시 시도해주세요.";
  }

  if (/timeout|timed out|etimedout|econnreset|econnrefused|socket|connection closed/.test(normalized)) {
    return "메일 서버 응답이 지연되거나 연결되지 않았습니다. 잠시 후 다시 시도해주세요.";
  }

  return transport === "imap"
    ? "메일은 전송됐지만 보낸메일함에 저장하지 못했습니다. 잠시 후 메일함을 새로고침해주세요."
    : "메일 서버에서 전송을 완료하지 못했습니다. 받는 사람 주소와 도메인 연결 상태를 확인한 뒤 다시 시도해주세요.";
}
