import { DERIVED_CURRENCIES } from '@ghostfolio/common/config';

import {
  registerDecorator,
  ValidationOptions,
  ValidatorConstraint,
  ValidatorConstraintInterface,
  ValidationArguments
} from 'class-validator';
import { isISO4217CurrencyCode } from 'class-validator';

export function IsCurrencyCode(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      propertyName,
      constraints: [],
      options: validationOptions,
      target: object.constructor,
      validator: IsExtendedCurrencyConstraint
    });
  };
}

@ValidatorConstraint({ async: false })
export class IsExtendedCurrencyConstraint
  implements ValidatorConstraintInterface
{
  public defaultMessage(args: ValidationArguments) {
    return '$value must be a valid ISO4217 currency code';
  }

  public validate(currency: any) {
    // Return true if currency is a standard ISO 4217 code or a derived currency
    return (
      isISO4217CurrencyCode(currency) ||
      [
        ...DERIVED_CURRENCIES.map((derivedCurrency) => {
          return derivedCurrency.currency;
        }),
        'USX'
      ].includes(currency)
    );
  }
}