// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

const fs = require("fs");
import * as all_benchmarks from "./cross_platform_suite.mjs";
import * as perspective_bench from "./src/js/benchmark.mjs";

/**
 * We use the `dependencies` of this package for the benchmark candidate
 * module list, so that we only need specify the dependencies and benchmark
 * candidates in one place.
 */
const VERSIONS = Object.keys(
    JSON.parse(fs.readFileSync(require.resolve(`./package.json`))).dependencies,
);

perspective_bench.suite(
    // ["@perspective-dev/client", ...VERSIONS],
    [...VERSIONS],
    async function (path, version_idx) {
        let perspective = await import(path);
        perspective = perspective.default || perspective;
        const pkg_json = JSON.parse(
            fs.readFileSync(require.resolve(`${path}/package.json`)),
        );

        let version = pkg_json.version;
        console.log(`${path} (${pkg_json.name}@${version})`);
        if (version_idx === 0) {
            version = `${version} (master)`;
        }

        const metadata = { version, version_idx };
        await all_benchmarks.table_suite(perspective, metadata);
        // await all_benchmarks.view_suite(perspective, metadata);
        // await all_benchmarks.to_data_suite(perspective, metadata);
    },
    async function (path) {
        let psp = await import(path);
        psp = psp.default || psp;
        // const port = Math.floor(Math.random() * 1000) + 1000;
        const server = new psp.WebSocketServer({
            port: 8080,
        });

        function buffer_to_arraybuffer(buffer) {
            return new Int8Array(
                buffer.buffer.slice(
                    buffer.byteOffset,
                    buffer.byteOffset + buffer.length,
                ),
            );
        }

        const table = await psp.table(
            buffer_to_arraybuffer(
                fs.readFileSync(
                    "../../node_modules/superstore-arrow/superstore.arrow",
                ),
            ).buffer,
            { name: "superstore" },
        );

        // // Legacy compat
        if (server.host_table) {
            server.host_table("superstore", table);
        }

        return server;
    },
);
