import Joi from 'joi';

export default class ParametersValidate {
  // data to validate, parameters from template, param: 'new', 'change', 'null'(null values are allowed)
  static input (data, parameters, param) {
    let joiObject = {};
    parameters.forEach(parameter => {
      if (parameter.range.hasOwnProperty('values')) {  // append right validation method according to parameter
        joiObject[parameter.name] = Joi.alternatives()
          .try(Joi.string().max(128), Joi.number(), Joi.boolean())
          .valid(...parameter.range.values);
      }
      else if (parameter.range.hasOwnProperty('min') && parameter.range.hasOwnProperty('max')) {

        joiObject[parameter.name] = Joi.number()
          .min(parameter.range.min)
          .max(parameter.range.max);
      }
      else if (parameter.range.hasOwnProperty('min')) {
        joiObject[parameter.name] = Joi.number()
          .min(parameter.range.min);
      }
      else if (parameter.range.hasOwnProperty('max')) {
        joiObject[parameter.name] = Joi.number()
          .max(parameter.range.max);
      }
      else if (parameter.range.hasOwnProperty('type')) {
        switch (parameter.range.type) {
          case 'array':
            joiObject[parameter.name] = Joi.array();
            break;
          default:
            joiObject[parameter.name] = Joi.string().max(128);
            break;
        }
      }
      else {
        joiObject[parameter.name] = Joi.alternatives()
          .try(Joi.string().max(128), Joi.number(), Joi.boolean());
      }
      if (param === 'new') {
        joiObject[parameter.name] = joiObject[parameter.name].required()
      }
      else if (param === 'null') {
        joiObject[parameter.name] = joiObject[parameter.name].allow(null)
      }
    });
    return Joi.object(joiObject).validate(data);
  }
}