import { SetMetadata } from '@nestjs/common';
import type { ModuleAccessLevel, ModuleName } from './modules';

export const MODULE_REQUIREMENT_KEY = 'ck:requires-module';

export interface ModuleRequirement {
  module: ModuleName;
  level: Exclude<ModuleAccessLevel, 'NONE'>;
}

/**
 * Restrict a route (or a whole controller) to accounts holding the given module.
 * `level` defaults to READ; use WRITE for routes that create or change data.
 */
export const RequiresModule = (
  module: ModuleName,
  level: Exclude<ModuleAccessLevel, 'NONE'> = 'READ',
) => SetMetadata(MODULE_REQUIREMENT_KEY, { module, level } satisfies ModuleRequirement);
