import 'reflect-metadata';
import typeMetadataStorage from '../../storage/type-metadata.storage';
import { determineRequiredValue, PropOptions } from './prop.options';

const DEFAULT_MIN = Number.MIN_SAFE_INTEGER;
const DEFAULT_MAX = Number.MAX_SAFE_INTEGER;

export type IntegerPropOptions = PropOptions<number> & {
  isInt?: boolean;
  min?: number;
  max?: number;
};

export function IntegerProp(options: IntegerPropOptions = {}): PropertyDecorator {
  return (target, propertyKey) => {
    const propKey = propertyKey.toString();

    typeMetadataStorage.addPropertyMetadata(
      target.constructor,
      propKey,
      {
        ...options,
        required: determineRequiredValue(options),
        type: Number,
        isInt: true,
        min: options.min ?? DEFAULT_MIN,
        max: options.max ?? DEFAULT_MAX,
      }
    );
  };
}
