// FOR JSDOC PURPOSES ONLY
const Discord = require('discord.js')
/** @typedef {import('../../typings').Rank} Rank */
/** @typedef {import('../../typings').Achievement} Achievement */
/** @typedef {import('../../typings').LevelManagerOptions} LevelManagerOptions */
/** @typedef {import('../../typings').UserEntry} UserEntry */
/** @typedef {import('../../typings').DatabaseData} DatabaseData */
/** @typedef {import('../../typings').LeaderboardOptions} LeaderboardOptions */
/** @typedef {import('../../typings').RankBuilder} RankBuilder */
/** @typedef {import('../../typings').AchievementBuilder} AchievementBuilder */
/**
* @typedef {Object} LeaderboardOptions
* @property {Discord.Snowflake} [guildId='global'] - The id of the guild.
* @property {Number} [limit=10] - The limit of the leaderboard.
*/
/** @typedef {DatabaseData} GuildData */
/**
* @typedef {Object} DatabaseData
* @property {Discord.Snowflake} guildId - The id of the guild.
* @property {Rank[]} ranks - The ranks of the guild.
* @property {Achievement[]} achievements - The achievements of the guild.
* @property {UserEntry[]} users - The users of the guild.
*/
/** @typedef {Achievement} AchievementData */
/**
* @typedef {Object} Achievement
* @property {String} name - The name of the achievement.
* @property {String} description - The description of the achievement.
* @property {String|undefined} [thumbnail] - The thumbnail of the achievement.
* @property {Number} reward - The reward of the achievement.
* @property {AchievementType} type - The type of the achievement.
* @property {Number[]} progress - The progress of the achievement.
*/
/**
* @typedef {Object} UserEntry
* @property {Discord.Snowflake} id - The id of the user.
* @property {Number} xp - The xp of the user.
* @property {Number} level - The level of the user.
* @property {Number} maxXpToLevelUp - The max xp to level up.
* @property {Rank} rank - The rank of the user.
* @property {Achievement[]} achievements - The achievements of the user.
*/
/** @typedef {Rank} RankData */
/**
* @typedef {Object} Rank
* @property {String} nameplate - The nameplate of the rank.
* @property {Discord.ColorResolvable|String} color - The color accent of the rank.
* @property {Number} priority - The priority of the rank.
* @property {Number} min - The minimum level of the rank.
* @property {Number} max - The maximum level of the rank.
*/
/**
* @typedef {Object} LevelManagerOptions
* @property {String} mongoUri - The uri of the mongo database.
* @property {Rank[]|RankBuilder[]|undefined} [ranks] - The general ranks that will be used in every guild (default in Options class).
* @property {Achievement[]|AchievementBuilder[]|undefined} [achievements] - The general achievements that will be used in every guild (default in Options class).
* @property {Number|undefined} [maxXpToLevelUp=2500] - The max xp to level up (only works for the first level then it will be calculated with calculateXpToLevelUp function).
* @property {Number|undefined} [saveInterval=1000 * 60 * 60 * 3] - The interval to save the data in the database (in milliseconds).
* @property {Boolean|undefined} [autoSave=true] - If the data will be saved automatically.
* @property {String|undefined} [eventsPath] - The path to the events folder.
*/
/**
* @typedef {Object} AchievementType
* @property {Number} Progressive - The achievement is progressive (example: x messages sended).
* @property {Number} OneTime - The achievement is one time only (example: first message).
*/
/**
* @typedef {Object} AchievementStatus
* @property {Number} Locked - The achievement is locked.
* @property {Number} Unlocked - The achievement is unlocked.
*/
/**
* @typedef {Object} LevelManagerEvents
* @property {String} ManagerReady - The manager is ready.
* @property {String} XpAdded - The user has added xp.
* @property {String} LevelUp - The user has leveled up.
* @property {String} LevelDown - The user has leveled down.
* @property {String} DegradeLevel - The user has degraded level.
* @property {String} RankUp - The user has ranked up.
* @property {String} RankDown - The user has ranked down.
* @property {String} DegradeRank - The user has degraded rank.
*/
/**
* @type {AchievementType}
* @ignore
*/
const AchievementType = Object.freeze({
Progressive: 0,
OneTime: 1
})
/**
* @type {AchievementStatus}
* @ignore
*/
const AchievementStatus = Object.freeze({
Locked: 0,
Unlocked: 1
})
/**
* @type {LevelManagerEvents}
* @ignore
*/
const LevelManagerEvents = Object.freeze({
ManagerReady: 'managerReady',
XpAdded: 'xpAdded',
LevelUp: 'levelUp',
LevelDown: 'levelDown',
Bypass: 'bypass',
RankUp: 'rankUp',
RankDown: 'rankDown'
})
module.exports = {
AchievementType,
AchievementStatus,
LevelManagerEvents
}