/** Pola pesan mentah dari validator / stack — jangan tampilkan ke pengguna. */
const TECHNICAL_PATTERNS = [
  /Field validation for/i,
  /Key:\s*'/i,
  /failed on the '\w+' tag/i,
  /\bbinding:/i,
  /\bsql:/i,
  /UNIQUE constraint/i,
  /pq:/i,
  /strconv\./i,
  /invalid syntax/i
];

const CODE_MESSAGES: Record<string, string> = {
  validation: "Periksa data yang Anda masukkan.",
  invalid_credentials: "Email atau password salah.",
  account_disabled: "Akun dinonaktifkan. Hubungi administrator.",
  duplicate: "Email sudah terdaftar.",
  timeout: "Permintaan melebihi batas waktu. Coba lagi.",
  canceled: "Permintaan dibatalkan. Coba lagi.",
  db: "Terjadi gangguan server. Coba lagi nanti.",
  crypto: "Terjadi gangguan server. Coba lagi nanti.",
  token: "Terjadi gangguan server. Coba lagi nanti.",
  forbidden: "Anda tidak memiliki izin untuk aksi ini.",
  not_found: "Data tidak ditemukan."
};

function looksTechnical(message: string): boolean {
  const s = message.trim();
  if (!s) return false;
  return TECHNICAL_PATTERNS.some((re) => re.test(s));
}

function messageFromTechnicalRaw(raw: string): string {
  const lower = raw.toLowerCase();
  if (lower.includes("email")) {
    return "Masukkan alamat email yang valid (contoh: nama@perusahaan.com).";
  }
  if (lower.includes("password")) {
    return "Password wajib diisi.";
  }
  return "Periksa data yang Anda masukkan.";
}

/**
 * Pesan aman untuk UI — tidak mengekspos detail validator, SQL, atau internal API.
 */
export function userFacingApiError(opts: {
  code?: string | null;
  message?: string | null;
  fallback?: string;
}): string {
  const code = (opts.code ?? "").trim().toLowerCase();
  const raw = (opts.message ?? "").trim();

  if (raw && !looksTechnical(raw)) {
    return raw;
  }

  if (raw && looksTechnical(raw)) {
    return messageFromTechnicalRaw(raw);
  }

  if (code && CODE_MESSAGES[code]) {
    return CODE_MESSAGES[code];
  }

  return opts.fallback ?? "Permintaan gagal. Coba lagi.";
}

export function isValidEmailFormat(email: string): boolean {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.trim());
}
