"use strict";

/**
 * multipart `filename` 복원.
 *
 * 브라우저는 UTF-8 파일명을 `Content-Disposition`에 넣을 때, 바이트를 ISO-8859-1(Latin-1) 코드 포인트
 * (U+00xx) 한 글자씩으로 보내는 경우가 많습니다. 이 경우 `decodeURIComponent(escape(s))` 또는
 * `Buffer.from(s, "latin1").toString("utf8")`로 UTF-8 문자열로 되돌릴 수 있습니다.
 *
 * 일부 환경에서는 이미 잘못 합쳐진 유니코드(예: U+00E1 등)만 남아 복구가 불가능할 수 있습니다.
 *
 * @param {string} name multer `originalname`
 * @returns {string}
 */
function decodeUploadFilename(name) {
  if (name == null || typeof name !== "string") return "";
  const raw = name.trim();
  if (!raw) return "";
  const nfc = raw.normalize("NFC");
  if (/[\uAC00-\uD7A3]/.test(nfc)) return nfc;

  try {
    const viaEscape = decodeURIComponent(escape(nfc));
    if (!viaEscape.includes("\uFFFD") && viaEscape !== nfc) {
      return viaEscape.normalize("NFC");
    }
  } catch (_) {
    /* escape가 만들어 낸 % 시퀀스가 URI로 부적합한 경우 */
  }

  try {
    const buf = Buffer.from(nfc, "latin1");
    const asUtf8 = buf.toString("utf8");
    if (!asUtf8.includes("\uFFFD")) {
      return asUtf8.normalize("NFC");
    }
  } catch (_) {}

  return nfc;
}

module.exports = { decodeUploadFilename };
