const schema = require('./data/eds-c-button.schema.json');
const exampleJson = require('./data/eds-c-button.example.json');
const fs = require('fs');
const path = require('path');
const partialsDir = __dirname;
const filenames = fs.readdirSync(partialsDir);
const component = fs.readFileSync(path.resolve(__dirname, 'eds-c-button.hbs'), 'utf8');
const Ajv = require("ajv");
const ajv = new Ajv();

const handlebars = require('handlebars');

const validate = ajv.compile(schema);

filenames.forEach(function (filename) {
    var matches = /^([^.]+).hbs$/.exec(filename);
    if (!matches) {
        return;
    }
    var name = matches[1];
    var template = fs.readFileSync(partialsDir + '/' + filename, 'utf8');
    handlebars.registerPartial(name, template);
});

const { configureAxe, toHaveNoViolations } = require('jest-axe');
expect.extend(toHaveNoViolations);
const template = handlebars.compile(component);
const rendered = template(exampleJson);

const axe = configureAxe({
    rules: {
        region: { enabled: false }
    }
});

test('Example data matches schema', () => {
    const validate = ajv.compile(schema);
    const valid = validate(exampleJson);

    if (!valid) {
        // Extract and format the Ajv validation errors
        const errors = validate.errors.map((error) => ajv.errorsText([error])).join('\n');
        throw new Error(errors);
    }

    expect(valid).toBeTruthy();
});

test('Template can be compiled and rendered', () => {
    document.body.innerHTML = rendered;
    const container = document.querySelector('*');
    expect(container).toBeDefined();
});

test('Template passes basic HTML accessibility', async () => {
    expect(await axe(rendered)).toHaveNoViolations();
});

test('README file exists', () => {
    const exists = fs.existsSync(path.resolve(__dirname, 'README.md'));
    expect(exists).toBe(true);
});