import {CoreClient} from "../src/client/client";
import Registry from "../src/registry";
import fs from "fs";
import path from "path";

describe("RegisterCommands", () => {
    test("EXPECT every command in the commands folder to be registered", () => {
        const registeredCommands: string[] = [];

        CoreClient.RegisterCommand = jest.fn().mockImplementation((name: string) => {
            registeredCommands.push(name);
        });

        Registry.RegisterCommands();

        const commandFiles = getFilesInDirectory(path.join(process.cwd(), "src", "commands"))
            .filter(x => x.endsWith(".ts"));

        for (const file of commandFiles) {
            expect(registeredCommands).toContain(file.split("/").pop()!.split(".")[0]);
        }

        expect(commandFiles.length).toBe(registeredCommands.length);
    });
});

describe("RegisterButtonEvents", () => {
    test("EXEPCT every button event in the button events folder to be registered", () => {
        const registeredButtonEvents: string[] = [];

        CoreClient.RegisterButtonEvent = jest.fn().mockImplementation((name: string) => {
            registeredButtonEvents.push(name);
        });

        Registry.RegisterButtonEvents();

        const eventFiles = getFilesInDirectory(path.join(process.cwd(), "src", "buttonEvents"))
            .filter(x => x.endsWith(".ts"));

        for (const file of eventFiles) {
            expect(registeredButtonEvents).toContain(file.split("/").pop()!.split(".")[0].toLowerCase());
        }

        expect(eventFiles.length).toBe(registeredButtonEvents.length);
    });
});

function getFilesInDirectory(dir: string): string[] {
    let results: string[] = [];
    const list = fs.readdirSync(dir);

    list.forEach(file => {
        file = path.join(dir, file);
        const stat = fs.statSync(file);

        if (stat && stat.isDirectory()) {
            /* recurse into a subdirectory */
            results = results.concat(getFilesInDirectory(file));
        } else {
            /* is a file */
            results.push(file);
        }
    });

    return results;
}