import {JSONSchema4, JSONSchema6, JSONSchema7} from 'json-schema';
import {ErrorObject} from 'ajv';

type Schema = JSONSchema4 | JSONSchema6 | JSONSchema7;
type PostFormatter = (formattedError: string, error: ErrorObject) => string;

declare namespace SchemaUtils {
  class ValidateError extends Error {
    constructor(errors: Array<ErrorObject>, schema: Schema, configuration?: Partial<ValidateErrorConfiguration>);

    name: string;
    errors: Array<ErrorObject>;
    schema: Schema;
    headerName: string;
    baseDataPath: string;
    postFormatter: PostFormatter | null;
    message: string;
  }

  interface ValidateErrorConfiguration {
    name: string,
    baseDataPath: string,
    postFormatter: PostFormatter
  }
}

declare var validate: {
  (schema: Schema, options: Array<object> | object, configuration?: Partial<SchemaUtils.ValidateErrorConfiguration>): void;
  ValidateError: typeof SchemaUtils.ValidateError
}

export = validate;