import { Transform, type TransformCallback } from 'node:stream'
import { ERRORS } from '../constants'

// TODO: create HttpError and use it everywhere instead of throwing objects
/**
 * MaxFileExceededError 类用于表示文件大小超出限制的错误。
 * 继承自 Error 类，包含状态码和错误信息体。
 */
export class MaxFileExceededError extends Error {
  status_code: number
  body: string

  constructor() {
    super(ERRORS.ERR_MAX_SIZE_EXCEEDED.body)
    this.status_code = ERRORS.ERR_MAX_SIZE_EXCEEDED.status_code
    this.body = ERRORS.ERR_MAX_SIZE_EXCEEDED.body
    Object.setPrototypeOf(this, MaxFileExceededError.prototype)
  }
}

/**
 * StreamLimiter 类用于限制流的大小，确保流的大小不超过指定的最大值。
 * 继承自 Transform 类，用于对流进行转换操作。
 */
export class StreamLimiter extends Transform {
  private maxSize: number // 允许的最大流大小
  private currentSize = 0 // 当前流的大小

  /**
   * 构造函数，初始化 StreamLimiter 实例。
   * @param maxSize 允许的最大流大小。
   */
  constructor(maxSize: number) {
    super()
    this.maxSize = maxSize
  }

  /**
   * _transform 方法是 Transform 类的核心方法，用于处理流中的数据块。
   * 每次接收到数据块时，更新当前流的大小，并检查是否超出最大限制。
   * 如果超出限制，则抛出 MaxFileExceededError 错误。
   * @param chunk 当前处理的数据块。
   * @param encoding 数据块的编码格式。
   * @param callback 回调函数，用于处理完成后的操作。
   */
  _transform(chunk: Buffer, encoding: BufferEncoding, callback: TransformCallback): void {
    this.currentSize += chunk.length // 更新当前流的大小
    if (this.currentSize > this.maxSize) {
      callback(new MaxFileExceededError()) // 如果超出最大限制，抛出错误
    } else {
      callback(null, chunk) // 否则，继续处理数据块
    }
  }
}