/* eslint-disable no-unused-vars */ import { filterPrivateRows } from "../filterPrivateRows.mjs"; const { randomID, mergeObject } = foundry.utils; export class MemoryDatabase { static #tables = { "Dice/d10": { name: `Dice/d10`, graphType: `bar`, buckets: { type: `range`, min: 1, max: 10, step: 1, }, config: { stacked: true, }, }, "Dice/d20": { name: `Dice/d20`, graphType: `bar`, buckets: { type: `range`, min: 1, max: 20, step: 1, }, config: { stacked: true, }, }, "Dice/d100": { name: `Dice/d100`, graphType: `bar`, buckets: { type: `range`, min: 1, max: 100, step: 1, }, config: { stacked: true, }, }, "Count of Successes": { name: `Count of Successes`, graphType: `bar`, buckets: { type: `number`, min: 0, step: 1, }, config: { stacked: true, }, }, "Type of Result": { name: `Type of Result`, graphType: `bar`, buckets: { type: `string`, trim: true, // forced true blank: false, // forced false textSearch: false, // forced false choices: [`Normal`, `Popped Off`, `Downed`], }, config: { stacked: true, }, }, }; static #rows = {}; static getTables() { /** @type {Array<{ name: string; }>} */ return Object.values(this.#tables); }; static getTable(tableID) { return this.#tables[tableID]; }; static createRow(table, userID, row) { if (!this.#tables[table]) { return }; this.#rows[userID] ??= {}; this.#rows[userID][table] ??= []; // data format assertions row._id ||= randomID(); this.#rows[userID][table].push(row); this.render(); }; static getRows(tableID, userIDs, privacy = `none`) { if (userIDs.length === 0) { return {}; }; const datasets = {}; for (const userID of userIDs) { if (this.#rows[userID]?.[tableID]) { datasets[userID] = filterPrivateRows( this.#rows[userID][tableID] ?? [], userID, privacy, ); }; } return datasets; }; static updateRow(table, userID, rowID, changes) { if (!this.#tables[table] || !this.#rows[userID]?.[table]) { return }; let row = this.#rows[userID][table].find(row => row._id === rowID); if (!row) { return }; mergeObject(row, changes); this.render(); }; static deleteRow(table, userID, rowID) { if (!this.#tables[table] || !this.#rows[userID]?.[table]) { return }; let rowIndex = this.#rows[userID][table].findIndex(row => row._id === rowID); if (rowIndex === -1) { return }; this.#rows[userID][table].splice(rowIndex, 1); this.render(); }; static apps = {}; static render() { for (const app of Object.values(this.apps)) { app.render(); }; }; /** * Used to listen for changes from other clients and refresh the local DB as * required, so that the StatsTracker stays up to date. */ static registerListeners() {}; static unregisterListeners() {}; }; /* eslint-enable no-unused-vars */