import { create } from "zustand"; import { generateVariableParenthesisSession, gradeVariableParenthesisAnswer, } from "@/lib/engine/variable-parenthesis"; import type { VariableParenthesisTermCount } from "@/lib/engine/variable-parenthesis"; import type { VariableGradeResult, VariableParenthesisProblem, VariableUserAnswer, } from "@/lib/engine/variable-types"; export interface VariableGameSession { problems: VariableParenthesisProblem[]; currentIndex: number; results: (VariableGradeResult | null)[]; termCount: VariableParenthesisTermCount; } export type VariableProblemCount = 5 | 10; export type VariableMaxTermCount = VariableParenthesisTermCount; interface VariableGameState { session: VariableGameSession | null; selectedProblemCount: VariableProblemCount; selectedMaxTermCount: VariableMaxTermCount; setProblemCount: (count: VariableProblemCount) => void; setMaxTermCount: (count: VariableMaxTermCount) => void; initSession: ( count?: VariableProblemCount, maxTermCount?: VariableMaxTermCount, ) => void; submitAnswer: (answer: VariableUserAnswer) => void; nextProblem: () => void; resetSession: () => void; } const DEFAULT_SESSION_COUNT: VariableProblemCount = 10; const DEFAULT_MAX_TERM_COUNT: VariableMaxTermCount = 2; function createSession( count: VariableProblemCount = DEFAULT_SESSION_COUNT, maxTermCount: VariableMaxTermCount = DEFAULT_MAX_TERM_COUNT, ): VariableGameSession { const problems = generateVariableParenthesisSession(count, maxTermCount); return { problems, currentIndex: 0, results: problems.map(() => null), termCount: maxTermCount, }; } export const useVariableGameStore = create((set, get) => ({ session: null, selectedProblemCount: DEFAULT_SESSION_COUNT, selectedMaxTermCount: DEFAULT_MAX_TERM_COUNT, setProblemCount: (count) => { set({ selectedProblemCount: count }); }, setMaxTermCount: (count) => { set({ selectedMaxTermCount: count }); }, initSession: (count, maxTermCount) => { const selectedProblemCount = count ?? get().selectedProblemCount; const selectedMaxTermCount = maxTermCount ?? get().selectedMaxTermCount; set({ session: createSession(selectedProblemCount, selectedMaxTermCount) }); }, submitAnswer: (answer) => { const { session } = get(); if (!session || session.currentIndex >= session.problems.length) return; if (session.results[session.currentIndex] !== null) return; const problem = session.problems[session.currentIndex]; const result = gradeVariableParenthesisAnswer(problem, answer); const results = [...session.results]; results[session.currentIndex] = result; set({ session: { ...session, results, }, }); }, nextProblem: () => { const { session } = get(); if (!session || session.currentIndex >= session.problems.length) return; if (session.results[session.currentIndex] === null) return; set({ session: { ...session, currentIndex: session.currentIndex + 1, }, }); }, resetSession: () => { set({ session: createSession( get().selectedProblemCount, get().selectedMaxTermCount, ), }); }, }));