import {
  ValidatorConstraint,
  ValidatorConstraintInterface,
  ValidationArguments,
  Validator,
} from 'class-validator';

// check if input is null or valid uuid
@ValidatorConstraint({ name: 'uuid', async: true })
export class Uuid implements ValidatorConstraintInterface {
  validate(uuid: string, args: ValidationArguments) {
    const validator = new Validator();
    return validator.isUUID(uuid, '4') || uuid == null; // for async validations you must return a Promise<boolean> here
  }

  defaultMessage(args: ValidationArguments) {
    return 'Not valid uuid';
  }
}

// checks if role is valid
@ValidatorConstraint({ name: 'roleValidation', async: true })
export class RoleValidation implements ValidatorConstraintInterface {
  validate(role: string, args: ValidationArguments) {
    const validRoles = ['admin', 'soldier', 'factionleader'];
    return validRoles.includes(role);
  }

  defaultMessage(args: ValidationArguments) {
    return 'Not valid uuid';
  }
}

// checks for valid JSON for center
@ValidatorConstraint({ name: 'centerJSON', async: true })
export class CenterJSON implements ValidatorConstraintInterface {
  validate(center: JSON, args: ValidationArguments) {
    const validator = new Validator();
    return (
      validator.isNumber(center['lat']) &&
      validator.isNumber(center['lng']) &&
      validator.min(center['lat'], -90) &&
      validator.max(center['lat'], 90) &&
      validator.min(center['lng'], -180) &&
      validator.max(center['lng'], 180)
    );
  }

  defaultMessage(args: ValidationArguments) {
    return 'Error with center JSON';
  }
}