/* eslint-disable */
/**
 * This file was automatically generated by scripts/manifest/validate-ts.mustache.
 * DO NOT MODIFY IT BY HAND. Instead, modify scripts/manifest/validate-ts.mustache,
 * and run node ./scripts/manifest/generateFormatTypes.js to regenerate this file.
 */
import {
  Any{{#latest}}{{type}}{{/latest}},
  {{#latest}}{{type}}{{/latest}}Formats
} from ".";
{{#validators.length}}import * as Validators from "../../validators";{{/validators.length}}
{{#formats}}
import {{type}}Schema_{{tsVersion}} from "@polywrap/polywrap-manifest-schemas/formats/{{dir}}/{{version}}.json";
{{/formats}}

import {
  Schema,
  Validator,
  ValidationError,
  ValidatorResult
} from "jsonschema";

type {{#latest}}{{type}}{{/latest}}Schemas = {
  [key in {{#latest}}{{type}}{{/latest}}Formats]: Schema | undefined
};

const schemas: {{#latest}}{{type}}{{/latest}}Schemas = {
  // NOTE: Patch fix for backwards compatability
  "0.1": {{#first}}{{type}}{{/first}}Schema_0_1_0,
  {{#formats}}
  "{{version}}": {{type}}Schema_{{tsVersion}},
  {{/formats}}
};

const validator = new Validator();

{{#validators}}
Validator.prototype.customFormats.{{.}} = Validators.{{.}};
{{/validators}}

export function validate{{#latest}}{{type}}{{/latest}}(
  manifest: Any{{#latest}}{{type}}{{/latest}},
  extSchema: Schema | undefined = undefined
): void {
  const schema = schemas[manifest.format as {{#latest}}{{type}}{{/latest}}Formats];

  if (!schema) {
    throw Error(`Unrecognized {{#latest}}{{type}}{{/latest}} schema format "${manifest.format}"\nmanifest: ${JSON.stringify(manifest, null, 2)}`);
  }

  const throwIfErrors = (result: ValidatorResult) => {
    if (result.errors.length) {
      throw new Error([
        `Validation errors encountered while sanitizing {{#latest}}{{type}}{{/latest}} format ${manifest.format}`,
        ...result.errors.map((error: ValidationError) => error.toString())
      ].join("\n"));
    }
  };

  throwIfErrors(validator.validate(manifest, schema));

  if (extSchema) {
    throwIfErrors(validator.validate(manifest, extSchema));
  }
}
