// Constants
export const AWS_ALGORITHM = 'AWS4-HMAC-SHA256';
export const AWS_REQUEST_TYPE = 'aws4_request';
export const S3_SERVICE = 's3';
export const LIST_TYPE = '2';
export const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD';
export const DEFAULT_STREAM_CONTENT_TYPE = 'application/octet-stream';
export const XML_CONTENT_TYPE = 'application/xml';
export const JSON_CONTENT_TYPE = 'application/json';
// List of keys that might contain sensitive information
export const SENSITIVE_KEYS_REDACTED = new Set(['accesskeyid', 'secretaccesskey', 'sessiontoken', 'password', 'token']);
export const IFHEADERS = new Set(['if-match', 'if-none-match', 'if-modified-since', 'if-unmodified-since']);
export const DEFAULT_REQUEST_SIZE_IN_BYTES = 8 * 1024 * 1024;
export const MIN_PART_SIZE = 8 * 1024 * 1024;

/** Error codes the S3 API pins to one HTTP status, used to restore the status Bun's S3Error drops. */
export const S3_CODE_STATUS: Record<string, number> = {
  NoSuchKey: 404,
  NoSuchBucket: 404,
  NoSuchUpload: 404,
  NotFound: 404,
  AccessDenied: 403,
  InvalidAccessKeyId: 403,
  SignatureDoesNotMatch: 403,
  InvalidArgument: 400,
  InvalidRequest: 400,
  PreconditionFailed: 412,
  SlowDown: 503,
};

// Headers
export const HEADER_AMZ_CONTENT_SHA256 = 'x-amz-content-sha256';
export const HEADER_AMZ_CHECKSUM_SHA256 = 'x-amz-checksum-sha256';
export const HEADER_AMZ_DATE = 'x-amz-date';
export const HEADER_AMZ_VERSION_ID = 'x-amz-version-id';
export const HEADER_AMZ_DELETE_MARKER = 'x-amz-delete-marker';
export const HEADER_HOST = 'host';
export const HEADER_AUTHORIZATION = 'authorization';
export const HEADER_CONTENT_TYPE = 'content-type';
export const HEADER_CONTENT_LENGTH = 'content-length';
export const HEADER_ETAG = 'etag';
export const HEADER_LAST_MODIFIED = 'last-modified';

// Error messages
export const ERROR_PREFIX = '[s3mini] ';
export const ERROR_ACCESS_KEY_REQUIRED = `${ERROR_PREFIX}accessKeyId must be a non-empty string`;
export const ERROR_SECRET_KEY_REQUIRED = `${ERROR_PREFIX}secretAccessKey must be a non-empty string`;
export const ERROR_ENDPOINT_REQUIRED = `${ERROR_PREFIX}endpoint must be a non-empty string`;
export const ERROR_ENDPOINT_FORMAT = `${ERROR_PREFIX}endpoint must be a valid URL. Expected format: https://<host>[:port][/base-path]`;
export const ERROR_KEY_REQUIRED = `${ERROR_PREFIX}key must be a non-empty string`;
export const ERROR_UPLOAD_ID_REQUIRED = `${ERROR_PREFIX}uploadId must be a non-empty string`;
export const ERROR_PARTS_REQUIRED = `${ERROR_PREFIX}parts must be a non-empty array`;
export const ERROR_INVALID_PART = `${ERROR_PREFIX}Each part must have a partNumber (number) and ETag (string)`;
export const ERROR_DATA_BUFFER_REQUIRED = `${ERROR_PREFIX}data must be a Buffer or string`;
export const ERROR_PREFIX_TYPE = `${ERROR_PREFIX}prefix must be a string`;
export const ERROR_MAX_KEYS_TYPE = `${ERROR_PREFIX}maxKeys must be a positive integer`;
export const ERROR_DELIMITER_REQUIRED = `${ERROR_PREFIX}delimiter must be a string`;
export const ERROR_BUN_PAGINATION_STALLED = `${ERROR_PREFIX}Bun S3 list pagination stalled: truncated page did not advance the continuation token`;
