import { Notyf } from 'notyf';
import { Manager } from "./utils.mjs";
import { CourtManager } from "./court.mjs";
import { PlayerManager } from "./player.mjs";
class Team {
constructor(playerOne, playerTwo) {
this.playerOne = playerOne;
this.playerTwo = playerTwo;
}
print() {
console.log(this.playerOne + " and " + this.playerTwo);
}
render() {
let p1 = `
${this.playerOne} | `;
let p2 = `${this.playerTwo} | `;
return p1 + p2;
}
}
class Game {
constructor(id, teamOne, teamTwo, status) {
this.id = id;
this.teamOne = teamOne;
this.teamTwo = teamTwo;
this.status = typeof status !== "undefined" ? status : false;
}
print() {
let teamOne = this.teamOne.playerOne + " and " + this.teamOne.playerTwo;
let teamTwo = this.teamTwo.playerOne + " and " + this.teamTwo.playerTwo;
console.log(teamOne + " is playing against " + teamTwo);
}
render() {
let blockedState = this.teamOne.playerOne === "RESERVED";
let type = blockedState ? `class="is-danger is-dark"` : ``;
return `| ${
this.id + 1
} | ${this.teamOne.render()}${this.teamTwo.render()}
`;
}
}
function generateDummyGames(courts, description) {
let team = new Team(description, description);
let games = [];
for (const court of courts) {
let game = new Game(court.id, team, team);
games.push(game);
}
return games;
}
export class GameManager extends Manager {
courts = new CourtManager();
players = new PlayerManager();
constructor() {
super("game", []);
this.round = Number(localStorage.getItem("round")) || 0;
console.log("Loading game data.");
let data = JSON.parse(localStorage.getItem(this.description));
if (data === null || data.length === 0) {
console.log("Game data unavailable: " + data);
this.generate();
return;
}
for (let i = 0; i < data.length; i++) {
let id = Number(data[i].id);
let teamOne = new Team(
data[i].teamOne.playerOne,
data[i].teamOne.playerTwo
);
let teamTwo = new Team(
data[i].teamTwo.playerOne,
data[i].teamTwo.playerTwo
);
let status = Boolean(data[i].status);
this.listData.push(new Game(id, teamOne, teamTwo, status));
}
console.log("Loaded " + this.listData.length + " games.");
this.render();
}
isConfirmed() {
return this.listData[0].status;
}
generate() {
console.log("Generating the dummy round.");
this.listData = generateDummyGames(this.courts.listData, "---");
console.log("Loaded " + this.listData.length + " dummy round.");
for (let i = 0; i < this.listData.length; i++) {
this.listData[i].status = true;
}
console.log(this.listData);
this.store();
this.render();
}
addBehaviour() {
let description = this.isConfirmed() ? "Round " + this.round : "Proposal";
document.getElementById("game_description").innerHTML = description;
}
getBlockedGames() {
const inactiveCourts = this.courts.inactive();
console.log("Total reserved courts are " + inactiveCourts.length + ".");
return generateDummyGames(inactiveCourts, "RESERVED");
}
inactive(courts) {
return generateDummyGames(courts, "---");
}
active(courts, players) {
let games = [];
for (let index = 0; index < courts.length; index++) {
const startIndex = 4 * index;
const endIndex = startIndex + 4;
const courtPlayers = players.slice(startIndex, endIndex);
const team_1 = new Team(courtPlayers[0].name, courtPlayers[3].name);
const team_2 = new Team(courtPlayers[1].name, courtPlayers[2].name);
const game = new Game(courts[index].id, team_1, team_2);
game.print();
games.push(game);
}
return games;
}
propose() {
console.log("Proposing new games!");
let possibleMatches = getMatchCount(
this.players.listData,
this.courts.listData
);
console.log("Total possible matches are " + possibleMatches + ".");
this.listData = this.getBlockedGames();
const activeCourts = this.courts.active();
const unusedCourts = activeCourts.slice(possibleMatches + 1);
this.listData = this.listData.concat(this.inactive(unusedCourts));
const usedCourts = activeCourts.slice(0, possibleMatches);
let requiredPlayerCount = possibleMatches * 4;
const selectedPlayers = this.players.propose(requiredPlayerCount);
console.log("The matches are:");
this.listData = this.listData.concat(
this.active(usedCourts, selectedPlayers)
);
this.listData.sort((a, b) => a.id - b.id);
this.render();
}
confirm() {
if (this.isConfirmed()) {
const notification = new Notyf();
notification.error("Create a proposal first!");
return;
}
console.log("Confirm the proposal for round " + this.round + ".");
this.round += 1;
localStorage.setItem("round", this.round);
for (let i = 0; i < this.listData.length; i++) {
this.listData[i].status = true;
}
// Need to update the number of games played here
this.store();
this.render();
document.getElementById("timer-start").click();
const notification = new Notyf();
notification.success("Round confirmed!");
}
reset() {
localStorage.removeItem("round");
localStorage.removeItem(this.description);
localStorage.removeItem(this.courts.description);
document.getElementById("timer-stop").click();
window.location.reload();
const notification = new Notyf();
notification.error("Session has been reset!");
}
}
function getMatchCount(players, courts) {
courts = courts.filter(function (c) {
return c.status;
});
console.log("There are a total of " + courts.length + " courts available.");
console.log(players);
players = players.filter(function (p) {
return p.status;
});
console.log("There are a total of " + players.length + " players available.");
var possibleMatches = Math.floor(players.length / 4);
possibleMatches = Math.min(possibleMatches, courts.length);
return possibleMatches;
}