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

const DEFAULT_SIZE = 265;

export type StringPropOptions = PropOptions<string> & {
  isArray?: boolean;
  size?: number;
  encrypt?: boolean;
};

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

    typeMetadataStorage.addPropertyMetadata(
      target.constructor,
      propKey,
      {
        ...options,
        required: determineRequiredValue(options),
        type: String,
        size: options.size ?? DEFAULT_SIZE,
      }
    );
  };
}
