text: const DetailedTournament = require("../mongoose-models/detailedtournament");
  const weapons = require("../utils/weapons");
  const gear = require("../utils/gear");
  const stages = require("../utils/maps");
  
  function isNum(maybeNumber) {
    return /^\d+$/.test(maybeNumber);
  }
  
  async function validateDetailedTournamentInput(input) {
    const problems = [];
    const existingTournament = await DetailedTournament.findOne({
      name: input.name,
    });
  
    if (existingTournament) {
      problems.push("Tournament with that name already exists");
    }
  
    //date not validated
  
    if (input.top_3_team_names.length !== 3) {
      problems.push("Length of top_3_team_names was not 3");
    }
  
    if (input.top_3_discord_ids.length !== 3) {
      problems.push("Length of top_3_discord_ids was not 3");
    }
  
    input.top_3_discord_ids.forEach((discord_id_arr) => {
      if (discord_id_arr.length !== 4) {
        problems.push(
          "Length of top_3_discord_ids contained an array that had invalid length"
        );
      }
  
      discord_id_arr.forEach((discord_id) => {
        if (!isNum(discord_id))
          problems.push(`Invalid Discord ID: ${discord_id}`);
      });
    });
  
    return problems;
  }
  
  function validateDetailedMapInput(input) {
    const problems = [];
    if (!stages.includes(input.stage)) {
      problems.push(`Invalid stage name: ${input.stage}`);
    }
  
    if (!["SZ", "TC", "RM", "CB", "TW"].includes(input.mode)) {
      problems.push(`Invalid mode name: ${input.mode}`);
    }
  
    if (input.duration < 0 || input.duration > 500) {
      problems.push(`Invalid duration: ${input.duration}`);
    }
  
    if (input.winners.score <= input.losers.score) {
      problems.push("Losing team has greater or equal score as the winner team");
    }
  
    input.winners.players.forEach((player) =>
      validateDetailedPlayerInput(player, problems)
    );
    input.losers.players.forEach((player) =>
      validateDetailedPlayerInput(player, problems)
    );
  
    return problems;
  }
  
  function validateDetailedPlayerInput(input, problems) {
    if (input.discord_id && !isNum(input.discord_id)) {
      problems.push(`Invalid Discord ID: ${input.discord_id}`);
    }
  
    if (!weapons.includes(input.weapon)) {
      problems.push(`Invalid weapon: ${input.weapon}`);
    }
  
    if (input.main_abilities.length !== 3) {
      problems.push(
        `Invalid main abilities length: ${input.main_abilities.length}`
      );
    }
  
    if (input.sub_abilities.flat().length !== 9) {
      problems.push(
        `Invalid sub abilities length: ${input.sub_abilities.flat().length}`
      );
    }
  
    if (input.kills < 0 || input.kills > 50) {
      problems.push(`Invalid kill count: ${input.kills}`);
    }
  
    if (input.assists < 0 || input.assists > 50) {
      problems.push(`Invalid assist count: ${input.assists}`);
    }
  
    if (input.deaths < 0 || input.deaths > 50) {
      problems.push(`Invalid death count: ${input.deaths}`);
    }
  
    if (input.specials < 0 || input.specials > 50) {
      problems.push(`Invalid special count: ${input.specials}`);
    }
  
    if (input.paint < 0 || input.paint > 5000) {
      problems.push(`Invalid paint count: ${input.paint}`);
    }
  
    if (input.gear) {
      if (input.gear.length !== 3)
        problems.push(`Invalid gear length: ${input.gear.length}`);
  
      input.gear.forEach((gearPiece) => {
        if (!gear.includes(gearPiece)) {
          problems.push(`Invalid gear: ${gearPiece}`);
        }
      });
    }
  
    return problems;
  }
  
  module.exports = {
    validateDetailedTournamentInput,
    validateDetailedMapInput,
  };
  