/**
 * Production-safe logging — redacts Aadhaar-like numbers, OTPs, and Bearer tokens.
 */

const IS_PROD = process.env.NODE_ENV === "production";

/** 12-digit sequences (Aadhaar-like) → ****XXXX (last 4) */
const AADHAAR_RE = /\b(\d{8})(\d{4})\b/g;

/** Standalone 6-digit OTP-like sequences */
const OTP_RE = /\b(\d{6})\b/g;

const BEARER_RE = /Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi;

function redactString(s: string): string {
  let out = s.replace(AADHAAR_RE, (_m, _prefix: string, last4: string) => `****${last4}`);
  out = out.replace(BEARER_RE, "Bearer [REDACTED]");
  if (IS_PROD) {
    out = out.replace(OTP_RE, "******");
  }
  return out;
}

function redactValue(value: unknown): unknown {
  if (typeof value === "string") return redactString(value);
  if (typeof value === "number" || typeof value === "boolean" || value == null) {
    return value;
  }
  if (value instanceof Error) {
    return redactString(`${value.name}: ${value.message}`);
  }
  try {
    return redactString(
      typeof value === "object" ? JSON.stringify(value) : String(value),
    );
  } catch {
    return "[unserializable]";
  }
}

function prepareArgs(args: unknown[]): unknown[] {
  return args.map(redactValue);
}

export function safeLog(...args: unknown[]) {
  console.log(...prepareArgs(args));
}

export function safeError(...args: unknown[]) {
  console.error(...prepareArgs(args));
}

export function safeInfo(...args: unknown[]) {
  console.info(...prepareArgs(args));
}

export function redactForLog(value: unknown): unknown {
  return redactValue(value);
}
