import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { AlertSignalService } from '@api/modules/alert/alert-signal.service';

/**
 * A4 의 **분모**(전체 요청 수)를 Redis 분당 버킷에 쌓는다(M2 §D3).
 *
 * 이것 없이 예외 필터의 5xx 카운터만 있으면 A4 는 절대건수 판정이 되고,
 * 그것이 PRD 가 ProviQ 실패 원인으로 지목한 조건이다.
 *
 * 요청 처리에 **어떤 분기도 걸지 않는다**(UI14): `finalize` 에서 fire-and-forget INCR 1회뿐이고,
 * 카운터 실패는 삼킨다(UI17). Redis 미구성이면 `bumpRequest()` 자체가 no-op 이다.
 */
@Injectable()
export class RequestCountInterceptor implements NestInterceptor {
  constructor(private readonly signals: AlertSignalService) {}

  intercept(_context: ExecutionContext, next: CallHandler): Observable<unknown> {
    return next.handle().pipe(
      finalize(() => {
        void this.signals.bumpRequest().catch(() => {
          /* 신호 수집 실패가 본 요청에 영향을 주지 않는다 */
        });
      }),
    );
  }
}
