import { Request, Response, NextFunction } from 'express';
import { BadRequestError } from '../httpErrors.js';

declare global {
  // eslint-disable-next-line @typescript-eslint/no-namespace
  namespace Express {
    interface Locals {
      secrets: Secrets;
    }
  }
}

/**
 * Represents the secrets parsed from the X-Unito-Secrets header.
 *
 * This is the decrypted payload of the secrets defined in the integration's configuration.
 */
export type Secrets = { [keys: string]: unknown };

const SECRETS_HEADER = 'X-Unito-Secrets';

function extractSecrets(req: Request, res: Response, next: NextFunction) {
  const secretsHeader = req.header(SECRETS_HEADER);

  if (secretsHeader) {
    let secrets: Secrets;

    try {
      secrets = JSON.parse(Buffer.from(secretsHeader, 'base64').toString('utf8'));
    } catch {
      throw new BadRequestError(`Malformed HTTP header ${SECRETS_HEADER}`);
    }

    res.locals.secrets = secrets;
  }

  next();
}

export default extractSecrets;
