import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  CallHandler,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Observable } from 'rxjs';
import {
  DATA_SCOPE_KEY,
  DataScopeMetadata,
} from '../decorators/data-scope.decorator';
import { DataScopeService } from '../services/data-scope.service';

@Injectable()
export class DataScopeInterceptor implements NestInterceptor {
  constructor(
    private reflector: Reflector,
    private dataScopeService: DataScopeService,
  ) {}

  async intercept(
    context: ExecutionContext,
    next: CallHandler,
  ): Promise<Observable<any>> {
    const metadata = this.reflector.get<DataScopeMetadata>(
      DATA_SCOPE_KEY,
      context.getHandler(),
    );

    if (!metadata) return next.handle();

    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) return next.handle();

    request.dataScopeFilter = await this.dataScopeService.resolve(
      user,
      metadata.resource,
      metadata.fields,
    );

    return next.handle();
  }
}
