import { create } from "zustand"; import { generateSession, gradeAnswer, } from "@/lib/engine/parenthesis-sign"; import type { GradeResult, ParenthesisSignProblem, UserAnswer, } from "@/lib/engine/types"; export interface GameSession { problems: ParenthesisSignProblem[]; currentIndex: number; results: (GradeResult | null)[]; } export type ProblemCount = 5 | 10; interface GameState { session: GameSession | null; selectedProblemCount: ProblemCount; setProblemCount: (count: ProblemCount) => void; initSession: (count?: ProblemCount) => void; submitAnswer: (answer: UserAnswer) => void; nextProblem: () => void; resetSession: () => void; } const DEFAULT_SESSION_COUNT: ProblemCount = 10; function createSession(count: ProblemCount = DEFAULT_SESSION_COUNT): GameSession { const problems = generateSession(count); return { problems, currentIndex: 0, results: problems.map(() => null), }; } export const useGameStore = 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 = gradeAnswer(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) }); }, }));