/**
 * CloudWatch-compatible structured logger for Lambda functions.
 * Outputs JSON logs that CloudWatch Logs Insights can parse and query.
 */

const LOG_LEVELS = {
  debug: 0,
  info: 1,
  warn: 2,
  error: 3,
};

// Default to 'info' in production, 'debug' in development
const currentLevel = LOG_LEVELS[process.env.LOG_LEVEL?.toLowerCase()] ?? LOG_LEVELS.info;

/**
 * Create a log entry in CloudWatch-compatible JSON format.
 * @param {string} level - Log level (debug, info, warn, error)
 * @param {string} message - Log message
 * @param {Object} meta - Additional metadata to include
 */
function log(level, message, meta = {}) {
  if (LOG_LEVELS[level] < currentLevel) {
    return;
  }

  const entry = {
    timestamp: new Date().toISOString(),
    level: level.toUpperCase(),
    message,
    ...meta,
  };

  // Add Lambda context if available
  if (process.env.AWS_LAMBDA_FUNCTION_NAME) {
    entry.function = process.env.AWS_LAMBDA_FUNCTION_NAME;
  }
  if (process.env.AWS_LAMBDA_LOG_STREAM_NAME) {
    entry.logStream = process.env.AWS_LAMBDA_LOG_STREAM_NAME;
  }

  const output = JSON.stringify(entry);

  switch (level) {
    case "error":
      console.error(output);
      break;
    case "warn":
      console.warn(output);
      break;
    default:
      console.log(output);
  }
}

module.exports = {
  debug: (message, meta) => log("debug", message, meta),
  info: (message, meta) => log("info", message, meta),
  warn: (message, meta) => log("warn", message, meta),
  error: (message, meta) => log("error", message, meta),
};
