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(); addGameBehaviour(this); } 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.concat(this.players.g.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; } 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; } function addGameBehaviour(g) { document.getElementById("propose").addEventListener("click", () => { g.propose(); }); document.getElementById("confirm").addEventListener("click", () => { g.confirm(); }); document.getElementById("reset").addEventListener("click", () => { g.reset(); }); }