import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { ApiResponseDto } from '../dto/api-response.dto';

@Injectable()
export class ResponseInterceptor<T> implements NestInterceptor<T, ApiResponseDto<T>> {
  intercept(context: ExecutionContext, next: CallHandler): Observable<ApiResponseDto<T>> {
    const ctx = context.switchToHttp();
    const response = ctx.getResponse();

    return next.handle().pipe(
      map((data) => {
        // 如果数据已经是 ApiResponseDto 实例，直接返回
        if (data instanceof ApiResponseDto) {
          return data;
        }

        // 否则包装数据
        return new ApiResponseDto({
          statusCode: response.statusCode,
          message: '操作成功',
          data: data,
        });
      }),
    );
  }
}