// @flow
import validator from 'validator';
import { type Context } from 'koa';
import { ParamRequiredError, ValidationError } from '../errors';
import { validateColorHex } from '../../shared/utils/color';

export default function validation() {
  return function validationMiddleware(ctx: Context, next: () => Promise<*>) {
    ctx.assertPresent = (value, message) => {
      if (value === undefined || value === null || value === '') {
        throw new ParamRequiredError(message);
      }
    };

    ctx.assertNotEmpty = (value, message) => {
      if (value === '') {
        throw new ValidationError(message);
      }
    };

    ctx.assertEmail = (value, message) => {
      if (!validator.isEmail(value)) {
        throw new ValidationError(message);
      }
    };

    ctx.assertUuid = (value, message) => {
      if (!validator.isUUID(value)) {
        throw new ValidationError(message);
      }
    };

    ctx.assertPositiveInteger = (value, message) => {
      if (!validator.isInt(value, { min: 0 })) {
        throw new ValidationError(message);
      }
    };

    ctx.assertHexColor = (value, message) => {
      if (!validateColorHex(value)) {
        throw new ValidationError(message);
      }
    };

    return next();
  };
}
