/**
 * 模块：OptionsHandler
 * 功能：处理TUS协议的OPTIONS请求，返回服务器支持的TUS协议版本、扩展功能等信息
 * 使用场景：在TUS文件上传协议中，客户端通过OPTIONS请求获取服务器支持的功能和配置
 */

import { ALLOWED_METHODS, HEADERS, MAX_AGE } from '../utils'
import { BaseHandler } from './BaseHandler'

import type http from 'node:http'

/**
 * OptionsHandler类
 * 核心功能：处理TUS协议的OPTIONS请求，返回服务器支持的配置信息
 * 设计模式：继承自BaseHandler，采用模板方法模式，复用基础处理逻辑
 * 使用示例：
 * const handler = new OptionsHandler(store, options)
 * handler.send(req, res)
 */
export class OptionsHandler extends BaseHandler {
  /**
   * 处理OPTIONS请求并发送响应
   * @param req - HTTP请求对象，包含客户端请求信息
   * @param res - HTTP响应对象，用于向客户端返回数据
   * @returns Promise<void> 无返回值
   * 功能详细描述：
   * 1. 获取服务器配置的最大文件大小
   * 2. 设置TUS协议版本、扩展功能和最大文件大小等响应头
   * 3. 配置CORS相关头信息
   * 4. 返回204 No Content状态码
   * 异常处理：继承自BaseHandler的异常处理机制
   */
  async send(req: http.IncomingMessage, res: http.ServerResponse) {
    // 获取服务器配置的最大文件大小
    const maxSize = await this.getConfiguredMaxSize(req, null)

    // 设置TUS协议版本头，固定为1.0.0
    res.setHeader('Tus-Version', '1.0.0')
    
    // 如果存储模块支持扩展功能，设置TUS扩展头
    if (this.store.extensions.length > 0) {
      res.setHeader('Tus-Extension', this.store.extensions.join(','))
    }
    
    // 如果配置了最大文件大小，设置TUS最大文件大小头
    if (maxSize) {
      res.setHeader('Tus-Max-Size', maxSize)
    }

    // 合并默认和自定义的允许头信息
    const allowedHeaders = [...HEADERS, ...(this.options.allowedHeaders ?? [])]
    
    // 设置CORS相关头信息
    res.setHeader('Access-Control-Allow-Methods', ALLOWED_METHODS)
    res.setHeader('Access-Control-Allow-Headers', allowedHeaders.join(', '))
    res.setHeader('Access-Control-Max-Age', MAX_AGE)

    // 返回204 No Content状态码，表示请求成功但无内容返回
    return this.write(res, 204)
  }
}
