import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { FeatureFlagsService } from './feature-flags.service';
import { RequireFeature } from './require-feature.decorator';

@Injectable()
export class FeatureFlagGuard implements CanActivate {
  constructor(
    private readonly reflector: Reflector,
    private readonly featureFlagsService: FeatureFlagsService,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    // Route-level decorator overrides the controller-level one.
    const flag =
      this.reflector.get(RequireFeature, context.getHandler()) ??
      this.reflector.get(RequireFeature, context.getClass());

    if (!flag) return true;

    const enabled = await this.featureFlagsService.isEnabled(flag);
    if (enabled) return true;

    throw new ForbiddenException({
      message: 'This feature is currently disabled',
      code: 'feature_disabled',
      data: { feature: flag },
    });
  }
}
