const { REST, Routes, SlashCommandBuilder, PermissionFlagsBits } = require("discord.js");
require("dotenv").config();

const commands = [
  new SlashCommandBuilder()
    .setName("ping")
    .setDescription("Replies with Pong!"),
  new SlashCommandBuilder()
    .setName("finduser")
    .setDescription("Find a user by username")
    .addStringOption((option) =>
      option
        .setName("game")
        .setDescription("Select the game")
        .setRequired(true)
        .addChoices(
          { name: "Big Ballers VR", value: "Big Ballers VR" },
          { name: "Blacktop Hoops", value: "Blacktop Hoops" },
          { name: "Breachers", value: "Breachers" },
          { name: "Echo Arena", value: "Echo Arena" },
          { name: "Echo Combat", value: "Echo Combat" },
          { name: "Gun Raiders", value: "Gun Raiders" },
          { name: "Nock", value: "Nock" },
          { name: "VAIL", value: "VAIL" }
        )
    )
    .addStringOption((option) =>
      option
        .setName("username")
        .setDescription("The username to search for")
        .setRequired(true)
    ),
  new SlashCommandBuilder()
    .setName("matchhistory")
    .setDescription("View match history")
    .addStringOption((option) =>
      option
        .setName("username")
        .setDescription("The username to search for")
        .setRequired(true)
    )
    .addStringOption((option) =>
      option.setName("game").setDescription("Filter by game").setRequired(false)
    ),
  new SlashCommandBuilder()
    .setName("subscribe")
    .setDescription("Subscribe to game notifications")
    .setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
    .addStringOption((option) =>
      option
        .setName("game")
        .setDescription("Game to subscribe to")
        .setRequired(true)
        .addChoices(
          { name: "Big Ballers VR", value: "Big Ballers VR" },
          { name: "Blacktop Hoops", value: "Blacktop Hoops" },
          { name: "Breachers", value: "Breachers" },
          { name: "Echo Arena", value: "Echo Arena" },
          { name: "Echo Combat", value: "Echo Combat" },
          { name: "Gun Raiders", value: "Gun Raiders" },
          { name: "Nock", value: "Nock" },
          { name: "VAIL", value: "VAIL" }
        )
    )
    .addChannelOption((option) =>
      option
        .setName("channel")
        .setDescription("Channel for notifications")
        .setRequired(true)
    ),
  new SlashCommandBuilder()
    .setName("unsubscribe")
    .setDescription("Unsubscribe from game notifications")
    .setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
    .addStringOption((option) =>
      option
        .setName("game")
        .setDescription("Game to unsubscribe from")
        .setRequired(true)
        .addChoices(
          { name: "Big Ballers VR", value: "Big Ballers VR" },
          { name: "Blacktop Hoops", value: "Blacktop Hoops" },
          { name: "Breachers", value: "Breachers" },
          { name: "Echo Arena", value: "Echo Arena" },
          { name: "Echo Combat", value: "Echo Combat" },
          { name: "Gun Raiders", value: "Gun Raiders" },
          { name: "Nock", value: "Nock" },
          { name: "VAIL", value: "VAIL" }
        )
    ),
  new SlashCommandBuilder()
    .setName("register_server")
    .setDescription("Register this Discord server with BattleBot")
    .setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
  new SlashCommandBuilder()
    .setName("list_subscriptions")
    .setDescription("List all game subscriptions for this server")
    .setDefaultMemberPermissions(PermissionFlagsBits.Administrator),
  new SlashCommandBuilder()
    .setName("findteam")
    .setDescription("Find a team by name")
    .addStringOption((option) =>
      option
        .setName("game")
        .setDescription("Select the game")
        .setRequired(true)
        .addChoices(
          { name: "Big Ballers VR", value: "Big Ballers VR" },
          { name: "Blacktop Hoops", value: "Blacktop Hoops" },
          { name: "Breachers", value: "Breachers" },
          { name: "Echo Arena", value: "Echo Arena" },
          { name: "Echo Combat", value: "Echo Combat" },
          { name: "Gun Raiders", value: "Gun Raiders" },
          { name: "Nock", value: "Nock" },
          { name: "VAIL", value: "VAIL" }
        )
    )
    .addStringOption((option) =>
      option
        .setName("teamname")
        .setDescription("The team name to search for")
        .setRequired(true)
    ),
];

const rest = new REST({ version: "10" }).setToken(process.env.DISCORD_TOKEN);

(async () => {
  try {
    console.log("Started refreshing application (/) commands.");
    console.log(
      "Commands to be deployed:",
      commands.map((cmd) => cmd.name)
    );

    await rest.put(Routes.applicationCommands(process.env.CLIENT_ID), {
      body: commands.map((command) => command.toJSON()),
    });

    console.log("Successfully reloaded application (/) commands.");
  } catch (error) {
    console.error(error);
  }
})();