/**
 * @license
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/* global process */

import fs from 'fs';
import { URL } from 'url';

import Ajv from 'ajv';
import META_SCHEMA from 'ajv/lib/refs/json-schema-draft-04.json';
import { assert } from 'chai';
import fetch from 'node-fetch';
import resolve from 'resolve';

// file or URL location
let url = '';
// find the URL parameter (which might be a relative path to a file)
let found_url = false;
process.argv.forEach((val, index) => {
  if (val.startsWith('--url')) {
    found_url = true;
    if (val[5] === '=') {
      url = val.split('=')[1];
    } else {
      // assume the next parameter is a URL
      url = process.argv[index + 1];
    }
  }
});

function readSchema(schemaPath: string, base: string = 'web-annotation-tests/'): any {
  const resolverOptions = { extensions: ['.json', '.test'] };
  const resolvedPath = resolve.sync(`${base}${schemaPath}`, resolverOptions);
  const schemaUnparsed = fs.readFileSync(resolvedPath);
  return JSON.parse(schemaUnparsed.toString());
}

const DEFINITIONS = [
  'annotations',
  'bodyTarget',
  'choiceSet',
  'collections',
  'id',
  'otherProperties',
  'specificResource',
].map(name => readSchema(`definitions/${name}`));

const MUSTS = readSchema('annotations/annotationMusts');

const ajv = new Ajv({ schemaId: 'auto' });
ajv.addMetaSchema(META_SCHEMA);
DEFINITIONS.forEach(schema => ajv.addSchema(schema));

describe('Test JSON against Schemas', () => {
  let data = '';

  before(async function() {
    if (!found_url) {
      this.skip();
    } else {
      // load the data from the file or URL
      let url_parsed = new URL(url);
      if (url_parsed.pathname !== url_parsed.href) {
        const data_response = await fetch(url_parsed.href);
        data = await data_response.json();
      } else {
        // assume we have a local file and use that
        data = JSON.parse(fs.readFileSync(url_parsed.pathname, 'utf8'));
      }
      if (data === '') {
        this.skip();
      }
    }
  });

  MUSTS.assertions.forEach((schemaPath: string) => {
    const schema = readSchema(schemaPath);
    it(schema.title, () => {
      let valid = ajv.validate(schema, data);
      assert.isOk(valid, ajv.errorsText());
    });
  });
});
