var fs = require("fs")
var { Collection } = require("discord.js")

class CommandsBuilder {
  client: any;
  eventsFolder: any;
  commandsFolder: any;
  constructor({ client, eventsFolder, commandsFolder }) {
    this.client = client;
    this.eventsFolder = eventsFolder;
    this.commandsFolder = commandsFolder;
  }
  async loadCommands() {
    if (this.eventsFolder && this.commandsFolder) {
      const commandsFolder = await fs.readdirSync(this.commandsFolder);
      const eventsFolder = await fs.readdirSync(this.eventsFolder);
      if (!commandsFolder || !eventsFolder) throw new Error("Invalid Folder");
      for (let folder of fs.readdirSync(this.commandsFolder)) {
      for (let file of fs.readdirSync(`${this.commandsFolder}/${folder}`).filter((file: string) => file.endsWith(".js"))) {
      const command = require(`${this.commandsFolder}/${folder}/${file}`);
      if (command.name) {
            this.client.commands.set(command.name, command);
          }
        }
      }
    }
  }
  async loadEvents() {
    if (this.eventsFolder && this.commandsFolder) {
      const commandsFolder = await fs.readdirSync(this.commandsFolder);
      const eventsFolder = await fs.readdirSync(this.eventsFolder);
      if (!eventsFolder) throw new Error("Invalid Folder");
      for (let folder of fs.readdirSync(`${this.eventsFolder}`)) {
       for (let file of folder)  {
        const event = require(`${this.eventsFolder}/${folder}/${file}`);
        if (event.once)
        this.client.once(event.name, (...args: any) => event.execute(...args, this.client));
        if (!event.once)
        this.client.on(event.name, (...args: any) => event.execute(...args, this.client));
       }
   
      }
    }
  }
}

module.exports = { CommandsBuilder };