import { create } from "zustand"; import { generateVariableParenthesisSession, gradeVariableParenthesisAnswer, } 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)[]; } export type VariableProblemCount = 5 | 10; interface VariableGameState { session: VariableGameSession | null; selectedProblemCount: VariableProblemCount; setProblemCount: (count: VariableProblemCount) => void; initSession: (count?: VariableProblemCount) => void; submitAnswer: (answer: VariableUserAnswer) => void; nextProblem: () => void; resetSession: () => void; } const DEFAULT_SESSION_COUNT: VariableProblemCount = 10; function createSession( count: VariableProblemCount = DEFAULT_SESSION_COUNT, ): VariableGameSession { const problems = generateVariableParenthesisSession(count); return { problems, currentIndex: 0, results: problems.map(() => null), }; } export const useVariableGameStore = create((set, get) => ({ session: null, selectedProblemCount: DEFAULT_SESSION_COUNT, setProblemCount: (count) => { set({ selectedProblemCount: count }); }, initSession: (count) => { const selectedProblemCount = count ?? get().selectedProblemCount; set({ session: createSession(selectedProblemCount) }); }, 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) }); }, }));