var unique = "★  ";
/**
 * The purpose of this class is to determine a color per playername and to apply that color,
 * escape reserved characters and add a moderator prefix when displaying playernames.
 */
class PlayerColor
{
}

/**
 * Generate a (mostly) unique color for this player based on their name.
 * @see https://stackoverflow.com/questions/3426404/create-a-hexadecimal-colour-based-on-a-string-with-jquery-javascript
 */
PlayerColor.GetPlayerColor = function(playername)
{
	// Generate a probably-unique hash for the player name and use that to create a color.
	let hash = 0;
	for (let i in playername)
		hash = playername.charCodeAt(i) + ((hash << 10) - hash);

	// First create the color in RGB then HSL, clamp the lightness so it's not too dark to read, and then convert back to RGB to display.
	// The reason for this roundabout method is this algorithm can generate values from 0 to 255 for RGB but only 0 to 100 for HSL; this gives
	// us much more variety if we generate in RGB. Unfortunately, enforcing that RGB values are a certain lightness is very difficult, so
	// we convert to HSL to do the computation. Since our GUI code only displays RGB colors, we have to convert back.
	let [h, s, l] = rgbToHsl(hash >> 24 & 0xFF, hash >> 16 & 0xFF, hash >> 8 & 0xFF);
	return hslToRgb(h, s, Math.max(0.7, l)).join(" ");
};

/**
 * Colorizes the given nickname with a color unique and deterministic for that player.
 */
PlayerColor.ColorPlayerName = function(playername, rating, role)
{
	let name = rating ?
		sprintf(translate("%(nick)s (%(rating)s)"), {
			"nick": playername,
			"rating": rating,
			"role": role,
		}) :
		playername;

	if (role == "moderator")
		name = PlayerColor.ModeratorPrefix + name + " (Moderator)";

		if (playername == Engine.LobbyGetNick())
		name = unique + name +  PlayerColor.NickPrefix;

		if (playername == name)
		name = PlayerColor.GeneralNamePrefix + name;


		
		if (playername == "WFGBot")
		name =  name + PlayerColor.Bot ;

			
		if (playername == "Ratings")
		name = name + PlayerColor.Bot ;

	return coloredText(escapeText(name), PlayerColor.GetPlayerColor(playername));
};

/**
 * A symbol which is prepended to the nickname of moderators.
 */
PlayerColor.ModeratorPrefix = "@  ";
PlayerColor.NickPrefix = " (me)";
PlayerColor.GeneralNamePrefix = "★  ";
PlayerColor.Bot = " (Bot)";

// TODO: Remove global required by formatPlayerInfo
var getPlayerColor = PlayerColor.GetPlayerColor;
