import { GRADUATION_DB_ID, GRADUATION_ACTIVITY_ID, GRADUATION_DB_PARAMS_MAP } from "./config.js"; import { loadFromDatabase, addEntryToDatabaseActivity } from "./database.js" const LEVEL_NAMES = ["Beginner", "Entdecker"]; class GraduationChange { constructor(date, id, name, change, reason, coach, json) { this.date = date; this.id = id; this.name = name; this.change = change; this.reason = reason; this.coach = coach; this.json = json; } static newGreenPointChange(student, reason, coach) { return new GraduationChange( new Date(), student.id, student.name, "Grün", reason, coach, "" ); } static newOrangePointChange(student, reason, coach) { return new GraduationChange( new Date(), student.id, student.name, "Orange", reason, coach, "" ); } static newRedPointChange(student, reason, coach) { return new GraduationChange( new Date(), student.id, student.name, "Rot", reason, coach, "" ); } } class Graduation { constructor(student, green, orange, red, level, stickers, observed, changes) { this.student = student; this.green = green; this.orange = orange; this.red = red; this.level = level; this.stickers = stickers; this.observed = observed; this.changes = changes; student.graduation = this; } static from(student, changes) { let green = 0; let orange = 0; let red = 0; let level = 1; let observed = false; let stickers = []; for (const change of changes) { switch (change.change) { case "Grün": green++; break; case "Orange": orange++; break; case "Rot": red++; break; case "Gespräch": orange = 0; break; case "Änderung": let ctx = JSON.parse(change.json) switch (ctx.type) { case "ObservationStart": observed = true; break; default: alert(`Unexpected ctx type: ${ctx.type}`); } break; default: alert(`Unexpected change: ${change}`); } } return new Graduation(student, green, orange, red, level, stickers, observed, changes); } addChange(change) { // TODO(muhq): Implement incremental addition let changes = this.changes; changes.push(change); // This updates the student.graduation reference as well Graduation.from(this.student, changes); } /** * Request observation */ async requestObservation() { // TODO(muhq): Implement observation mark this.observed = true; } /** * Return if the student is in observation. */ isObserved() { return this.observed; } /** * Return the URI of the icon representing the graduation level. */ getIcon() { return ""; } /** * Return the name of the current graduation level. * @return {String} The name of the current level. */ getLevelName() { return LEVEL_NAMES[this.level - 1]; } } async function fetchGraduationChanges(student) { let params = {}; // The id is enough params[GRADUATION_DB_PARAMS_MAP["id"]] = student.id; const data = await loadFromDatabase(GRADUATION_DB_ID, params); let changes = []; for (const e of data) { const gradChange = new GraduationChange(e.date, e.id, e.change, e.reason, e.coach, e.json); changes.push(gradChange); } return changes; } async function fetchGraduation(student) { const changes = await fetchGraduationChanges(student); return Graduation.from(student, changes); } async function submitGraduationChange(student, change) { let params = {}; student.graduation.addChange(change); for (const key in GRADUATION_DB_PARAMS_MAP) { params[GRADUATION_DB_PARAMS_MAP[key]] = change[key]; } addEntryToDatabaseActivity(GRADUATION_ACTIVITY_ID, params); } export { LEVEL_NAMES, GraduationChange, Graduation, fetchGraduation, fetchGraduationChanges, submitGraduationChange };