{"version":3,"sources":["../src/components/Quiz/useQuizStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\nimport { QuizVariant } from './Quiz.types';\n\nexport enum QUESTION_DIFFICULTY {\n  FACIL = 'FACIL',\n  MEDIO = 'MEDIO',\n  DIFICIL = 'DIFICIL',\n}\n\n// Enum para tipos de quiz\nexport enum QUIZ_TYPE {\n  SIMULADO = 'SIMULADO',\n  QUESTIONARIO = 'QUESTIONARIO',\n  ATIVIDADE = 'ATIVIDADE',\n  AULA_RECOMENDADA = 'AULA_RECOMENDADA',\n}\n\nexport enum QUESTION_TYPE {\n  ALTERNATIVA = 'ALTERNATIVA',\n  DISSERTATIVA = 'DISSERTATIVA',\n  MULTIPLA_ESCOLHA = 'MULTIPLA_ESCOLHA',\n  VERDADEIRO_FALSO = 'VERDADEIRO_FALSO',\n  RELACIONAR = 'RELACIONAR',\n  PREENCHER_LACUNAS = 'PREENCHER_LACUNAS',\n  IMAGEM = 'IMAGEM',\n}\n\n/**\n * Determines if a user answer has meaningful content.\n * For option-based questions: checks if optionId is not null\n * For multiple choice questions: checks if selectedOptionIds has items\n * For free-text questions (DISSERTATIVA): checks if answer is non-empty string\n * For structured questions (RELACIONAR, PREENCHER_LACUNAS): checks if answer is valid JSON with values\n *\n * @param answer - The user answer item to check (can be null/undefined)\n * @returns true if the answer has meaningful content, false otherwise\n */\nexport const hasMeaningfulAnswer = (\n  answer:\n    | {\n        optionId: string | null;\n        answer: string | null;\n        questionType: QUESTION_TYPE;\n        selectedOptionIds?: string[] | null;\n      }\n    | null\n    | undefined\n): boolean => {\n  if (!answer) return false;\n\n  // For MULTIPLA_ESCOLHA, check selectedOptionIds array or legacy optionId\n  if (answer.questionType === QUESTION_TYPE.MULTIPLA_ESCOLHA) {\n    return (\n      (Array.isArray(answer.selectedOptionIds) &&\n        answer.selectedOptionIds.length > 0) ||\n      Boolean(answer.optionId)\n    );\n  }\n\n  // For free-text question types, check the answer field\n  const freeTextTypes = [\n    QUESTION_TYPE.DISSERTATIVA,\n    QUESTION_TYPE.RELACIONAR,\n    QUESTION_TYPE.PREENCHER_LACUNAS,\n    QUESTION_TYPE.IMAGEM,\n    QUESTION_TYPE.VERDADEIRO_FALSO,\n  ];\n\n  if (freeTextTypes.includes(answer.questionType)) {\n    // Check if answer has content (non-empty string)\n    if (!answer.answer || answer.answer.trim() === '') return false;\n\n    // For RELACIONAR/PREENCHER_LACUNAS/VERDADEIRO_FALSO, also check if JSON has actual values\n    if (\n      answer.questionType === QUESTION_TYPE.RELACIONAR ||\n      answer.questionType === QUESTION_TYPE.PREENCHER_LACUNAS ||\n      answer.questionType === QUESTION_TYPE.VERDADEIRO_FALSO\n    ) {\n      try {\n        const parsed = JSON.parse(answer.answer);\n        return typeof parsed === 'object' && Object.keys(parsed).length > 0;\n      } catch {\n        return false;\n      }\n    }\n\n    // For DISSERTATIVA, non-empty string is meaningful\n    return true;\n  }\n\n  // For option-based question types, check optionId (not null and not empty string)\n  return answer.optionId !== null && answer.optionId !== '';\n};\n\nexport enum QUESTION_STATUS {\n  PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n  RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n  RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n  NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\nexport enum ANSWER_STATUS {\n  RESPOSTA_CORRETA = 'RESPOSTA_CORRETA',\n  RESPOSTA_INCORRETA = 'RESPOSTA_INCORRETA',\n  PENDENTE_AVALIACAO = 'PENDENTE_AVALIACAO',\n  NAO_RESPONDIDO = 'NAO_RESPONDIDO',\n}\n\nexport enum SUBTYPE_ENUM {\n  PROVA = 'PROVA',\n  ENEM_PROVA_1 = 'ENEM_PROVA_1',\n  ENEM_PROVA_2 = 'ENEM_PROVA_2',\n  VESTIBULAR = 'VESTIBULAR',\n  SIMULADO = 'SIMULADO',\n  SIMULADAO = 'SIMULADAO',\n}\n\nexport interface QuestionResult {\n  answers: {\n    id: string;\n    questionId: string;\n    answer: string | null;\n    selectedOptions: {\n      optionId: string;\n      option?: string;\n      isCorrect?: boolean;\n      correctValue?: string | null;\n    }[];\n    answerStatus: ANSWER_STATUS;\n    statement: string;\n    additionalContent: string | null;\n    questionType: QUESTION_TYPE;\n    difficultyLevel: QUESTION_DIFFICULTY;\n    solutionExplanation: string | null;\n    correctOption: string;\n    createdAt: string;\n    updatedAt: string;\n    options?: {\n      id: string;\n      option: string;\n      isCorrect: boolean;\n      correctValue?: string | null;\n    }[];\n    matchingAnswers?: {\n      optionId: string;\n      selectedValue: string;\n    }[];\n    fillAnswers?: Record<string, string>;\n    knowledgeMatrix: {\n      areaKnowledge: {\n        id: string;\n        name: string;\n      } | null;\n      subject: {\n        id: string;\n        name: string;\n        color: string;\n        icon: string;\n      } | null;\n      topic: {\n        id: string;\n        name: string;\n      } | null;\n      subtopic: {\n        id: string;\n        name: string;\n      } | null;\n      content: {\n        id: string;\n        name: string;\n      } | null;\n    }[];\n    teacherFeedback: string | null;\n    attachment: string | null;\n    score: number | null;\n    gradedAt: string | null;\n    gradedBy: string | null;\n  }[];\n  statistics: {\n    totalAnswered: number;\n    correctAnswers: number;\n    incorrectAnswers: number;\n    pendingAnswers: number;\n    score: number;\n    timeSpent: number;\n  };\n}\n\nexport interface Question {\n  id: string;\n  statement: string;\n  questionType: QUESTION_TYPE;\n  difficultyLevel: QUESTION_DIFFICULTY;\n  description: string;\n  examBoard: string | null;\n  examYear: string | null;\n  solutionExplanation: string | null;\n  additionalContent: string | null;\n  answer: null;\n  answerStatus: ANSWER_STATUS;\n  options: {\n    id: string;\n    option: string;\n    correctValue?: string | null;\n  }[];\n  knowledgeMatrix: {\n    areaKnowledge: {\n      id: string;\n      name: string;\n    };\n    subject: {\n      id: string;\n      name: string;\n      color: string;\n      icon: string;\n    };\n    topic: {\n      id: string;\n      name: string;\n    };\n    subtopic: {\n      id: string;\n      name: string;\n    };\n    content: {\n      id: string;\n      name: string;\n    };\n  }[];\n  correctOptionIds?: string[];\n}\n\nexport interface QuizInterface {\n  id: string;\n  title: string;\n  type: QUIZ_TYPE;\n  subtype: SUBTYPE_ENUM | string;\n  difficulty: string | null;\n  notification: string | null;\n  status: string;\n  startDate: string | null;\n  finalDate: string | null;\n  canRetry: boolean;\n  createdAt: string | null;\n  updatedAt: string | null;\n  questions: Question[];\n}\n\nexport interface UserAnswerItem {\n  questionId: string;\n  activityId: string;\n  userId: string;\n  answer: string | null;\n  optionId: string | null;\n  selectedOptionIds?: string[] | null;\n  questionType: QUESTION_TYPE;\n  answerStatus: ANSWER_STATUS;\n}\n\n/**\n * Draft answer item from the backend API\n * Used when loading saved drafts\n */\nexport interface DraftAnswerItem {\n  questionId: string;\n  answer: string | null;\n  optionId: string | null;\n  selectedOptionIds?: string[] | null;\n  fillAnswers?: Record<string, string> | null;\n  matchingAnswers?: Array<{ optionId: string; selectedValue: string }> | null;\n  imageAnswer?: { coordinateX: number; coordinateY: number } | null;\n  sequence?: number;\n  timeSpent?: number;\n}\n\n/**\n * Payload for saving drafts to the backend\n */\nexport interface SaveDraftPayload {\n  answers: Array<{\n    questionId: string;\n    answer?: string | null;\n    optionId?: string | null;\n    selectedOptionIds?: string[] | null;\n    fillAnswers?: Record<string, string> | null;\n    matchingAnswers?: Array<{ optionId: string; selectedValue: string }> | null;\n    imageAnswer?: { coordinateX: number; coordinateY: number } | null;\n  }>;\n}\n\n/**\n * API client interface for draft operations\n * Pass this to the store to enable auto-save functionality\n */\nexport interface DraftApiClient {\n  saveDraft: (\n    activityId: string,\n    payload: SaveDraftPayload\n  ) => Promise<{ success: boolean }>;\n  loadDraft: (activityId: string) => Promise<{\n    hasDraft: boolean;\n    answers: DraftAnswerItem[];\n  } | null>;\n}\n\nexport interface QuizState {\n  // Data\n  quiz: QuizInterface | null;\n\n  // UI State\n  currentQuestionIndex: number;\n  selectedAnswers: Record<string, string>;\n  userAnswers: UserAnswerItem[];\n  timeElapsed: number;\n  isStarted: boolean;\n  isFinished: boolean;\n  userId: string;\n  variant: QuizVariant;\n  minuteCallback: (() => void) | null;\n  dissertativeCharLimit?: number;\n  timeLimit: number | null;\n  onTimeUp: (() => void) | null;\n  // Actions\n  setQuiz: (quiz: QuizInterface) => void;\n  setQuestionResult: (questionResult: QuestionResult) => void;\n  setUserId: (userId: string) => void;\n  setUserAnswers: (userAnswers: UserAnswerItem[]) => void;\n  setVariant: (variant: QuizVariant) => void;\n  setDissertativeCharLimit: (limit?: number) => void;\n  getDissertativeCharLimit: () => number | undefined;\n  // Quiz Navigation\n  goToNextQuestion: () => void;\n  goToPreviousQuestion: () => void;\n  goToQuestion: (index: number) => void;\n\n  // Quiz Actions\n  selectAnswer: (questionId: string, answerId: string) => void;\n  selectMultipleAnswer: (questionId: string, answerIds: string[]) => void;\n  selectDissertativeAnswer: (questionId: string, answer: string) => void;\n  skipQuestion: () => void;\n  skipCurrentQuestionIfUnanswered: () => void;\n  addUserAnswer: (questionId: string, answerId?: string) => void;\n  startQuiz: () => void;\n  finishQuiz: () => void;\n  resetQuiz: () => void;\n\n  // Timer\n  updateTime: (time: number) => void;\n  startTimer: () => void;\n  stopTimer: () => void;\n  setTimeLimit: (seconds: number | null) => void;\n  setOnTimeUp: (callback: (() => void) | null) => void;\n  getRemainingTime: () => number | null;\n\n  // Minute Callback\n  setMinuteCallback: (callback: (() => void) | null) => void;\n  startMinuteCallback: () => void;\n  stopMinuteCallback: () => void;\n\n  // Getters\n  getCurrentQuestion: () => Question | null;\n  getTotalQuestions: () => number;\n  getAnsweredQuestions: () => number;\n  getUnansweredQuestions: () => number[];\n  getSkippedQuestions: () => number;\n  getProgress: () => number;\n  isQuestionAnswered: (questionId: string) => boolean;\n  isQuestionSkipped: (questionId: string) => boolean;\n  getCurrentAnswer: () => UserAnswerItem | undefined;\n  getAllCurrentAnswer: () => UserAnswerItem[] | undefined;\n  getQuizTitle: () => string;\n  formatTime: (seconds: number) => string;\n  getUserAnswers: () => UserAnswerItem[];\n  getUnansweredQuestionsFromUserAnswers: () => number[];\n  getQuestionsGroupedBySubject: () => {\n    [key: string]: (Question | QuestionResult['answers'][number])[];\n  };\n  getUserId: () => string;\n  setCurrentQuestion: (question: Question) => void;\n\n  // New methods for userAnswers\n  getQuestionIndex: (questionId: string) => number;\n  getUserAnswerByQuestionId: (questionId: string) => UserAnswerItem | null;\n  isQuestionAnsweredByUserAnswers: (questionId: string) => boolean;\n  getQuestionStatusFromUserAnswers: (\n    questionId: string\n  ) => 'answered' | 'unanswered' | 'skipped';\n  getUserAnswersForActivity: () => UserAnswerItem[];\n  // Answer status management\n  setAnswerStatus: (questionId: string, status: ANSWER_STATUS) => void;\n  getAnswerStatus: (questionId: string) => ANSWER_STATUS | null;\n\n  // Question Result\n  questionsResult: QuestionResult | null;\n  currentQuestionResult: QuestionResult['answers'] | null;\n  setQuestionsResult: (questionsResult: QuestionResult) => void;\n  setCurrentQuestionResult: (\n    currentQuestionResult: QuestionResult['answers']\n  ) => void;\n  getQuestionResultByQuestionId: (\n    questionId: string\n  ) => QuestionResult['answers'][number] | null;\n  getQuestionResultStatistics: () => QuestionResult['statistics'] | null;\n  getQuestionResult: () => QuestionResult | null;\n  getCurrentQuestionResult: () => QuestionResult['answers'] | null;\n\n  // Draft management\n  applyDraftAnswers: (draftAnswers: DraftAnswerItem[]) => void;\n  prepareDraftPayload: () => SaveDraftPayload;\n  hasDraftChanges: () => boolean;\n\n  // Draft API client (for auto-save functionality)\n  draftApiClient: DraftApiClient | null;\n  setDraftApiClient: (client: DraftApiClient | null) => void;\n  saveDraft: () => Promise<void>;\n  loadAndApplyDraft: () => Promise<void>;\n\n  // Internal refs for draft management (not exposed, but tracked in state for reactivity)\n  lastSavedDraftPayload: string;\n  isSavingDraft: boolean;\n\n  // Activity-level teacher feedback (general observation)\n  activityFeedback: {\n    teacherFeedback: string | null;\n    attachment: string | null;\n  } | null;\n  setActivityFeedback: (\n    feedback: {\n      teacherFeedback: string | null;\n      attachment: string | null;\n    } | null\n  ) => void;\n  getActivityFeedback: () => {\n    teacherFeedback: string | null;\n    attachment: string | null;\n  } | null;\n}\n\n// Constants\nexport const MINUTE_INTERVAL_MS = 60000; // 60 seconds = 1 minute\n\nexport const useQuizStore = create<QuizState>()(\n  devtools(\n    (set, get) => {\n      let timerInterval: ReturnType<typeof setInterval> | null = null;\n      let minuteCallbackInterval: ReturnType<typeof setInterval> | null = null;\n      let timerStartedAt: number | null = null;\n      let timerBaseElapsed = 0;\n\n      const clampElapsed = (elapsed: number) => {\n        const { timeLimit } = get();\n        return timeLimit === null ? elapsed : Math.min(elapsed, timeLimit);\n      };\n\n      const handleVisibilityChange = () => {\n        if (document.visibilityState === 'visible' && timerStartedAt !== null) {\n          const now = Date.now();\n          const elapsed = clampElapsed(\n            timerBaseElapsed + Math.floor((now - timerStartedAt) / 1000)\n          );\n          set({ timeElapsed: elapsed });\n          checkTimeLimit(elapsed);\n        }\n      };\n\n      const checkTimeLimit = (elapsed: number) => {\n        const { timeLimit, isFinished, onTimeUp } = get();\n        if (timeLimit !== null && elapsed >= timeLimit && !isFinished) {\n          get().finishQuiz();\n          onTimeUp?.();\n        }\n      };\n\n      const startTimer = () => {\n        if (get().isFinished) {\n          return;\n        }\n\n        if (timerInterval) {\n          clearInterval(timerInterval);\n        }\n\n        timerStartedAt = Date.now();\n        timerBaseElapsed = get().timeElapsed;\n\n        document.addEventListener('visibilitychange', handleVisibilityChange);\n\n        timerInterval = setInterval(() => {\n          if (timerStartedAt === null) return;\n          const now = Date.now();\n          const elapsed = clampElapsed(\n            timerBaseElapsed + Math.floor((now - timerStartedAt) / 1000)\n          );\n          set({ timeElapsed: elapsed });\n          checkTimeLimit(elapsed);\n        }, 1000);\n      };\n\n      const stopTimer = () => {\n        if (timerInterval) {\n          clearInterval(timerInterval);\n          timerInterval = null;\n        }\n        timerStartedAt = null;\n        timerBaseElapsed = 0;\n        document.removeEventListener(\n          'visibilitychange',\n          handleVisibilityChange\n        );\n      };\n\n      const setMinuteCallback = (callback: (() => void) | null) => {\n        set({ minuteCallback: callback });\n      };\n\n      const startMinuteCallback = () => {\n        const { minuteCallback, isFinished } = get();\n\n        if (isFinished || !minuteCallback) {\n          return;\n        }\n\n        if (minuteCallbackInterval) {\n          clearInterval(minuteCallbackInterval);\n        }\n\n        minuteCallbackInterval = setInterval(() => {\n          const {\n            minuteCallback: currentCallback,\n            isFinished: currentIsFinished,\n          } = get();\n\n          if (currentIsFinished || !currentCallback) {\n            stopMinuteCallback();\n            return;\n          }\n\n          currentCallback();\n        }, MINUTE_INTERVAL_MS);\n      };\n\n      const stopMinuteCallback = () => {\n        if (minuteCallbackInterval) {\n          clearInterval(minuteCallbackInterval);\n          minuteCallbackInterval = null;\n        }\n      };\n\n      return {\n        // Initial State\n        quiz: null,\n        currentQuestionIndex: 0,\n        selectedAnswers: {},\n        userAnswers: [],\n        timeElapsed: 0,\n        isStarted: false,\n        isFinished: false,\n        userId: '',\n        variant: QuizVariant.DEFAULT,\n        minuteCallback: null,\n        dissertativeCharLimit: undefined,\n        timeLimit: null,\n        onTimeUp: null,\n        questionsResult: null,\n        currentQuestionResult: null,\n        draftApiClient: null,\n        lastSavedDraftPayload: '',\n        isSavingDraft: false,\n        activityFeedback: null,\n        // Setters\n        setQuiz: (quiz) => set({ quiz }),\n        setUserId: (userId) => set({ userId }),\n        setUserAnswers: (userAnswers) => set({ userAnswers }),\n        getUserId: () => get().userId,\n        setVariant: (variant) => set({ variant }),\n        setQuestionResult: (questionsResult) => set({ questionsResult }),\n        setDissertativeCharLimit: (limit?: number) =>\n          set({ dissertativeCharLimit: limit }),\n        getDissertativeCharLimit: () => get().dissertativeCharLimit,\n        setDraftApiClient: (client) => set({ draftApiClient: client }),\n\n        // Draft save - called automatically on navigation\n        saveDraft: async () => {\n          const {\n            draftApiClient,\n            quiz,\n            hasDraftChanges,\n            prepareDraftPayload,\n            lastSavedDraftPayload,\n            isSavingDraft,\n          } = get();\n\n          // Skip if no API client configured or no quiz\n          if (!draftApiClient || !quiz) return;\n\n          // Skip if already saving\n          if (isSavingDraft) return;\n\n          // Skip if no changes\n          if (!hasDraftChanges()) return;\n\n          const payload = prepareDraftPayload();\n          const payloadString = JSON.stringify(payload);\n\n          // Skip if payload hasn't changed\n          if (payloadString === lastSavedDraftPayload) return;\n\n          try {\n            set({ isSavingDraft: true });\n            await draftApiClient.saveDraft(quiz.id, payload);\n            set({ lastSavedDraftPayload: payloadString });\n          } catch (error) {\n            // Silent fail - don't interrupt user experience\n            console.warn('Erro ao salvar rascunho:', error);\n          } finally {\n            set({ isSavingDraft: false });\n          }\n        },\n\n        // Load draft and apply to quiz, navigate to first unanswered question\n        loadAndApplyDraft: async () => {\n          const {\n            draftApiClient,\n            quiz,\n            applyDraftAnswers,\n            prepareDraftPayload,\n          } = get();\n\n          // Skip if no API client configured or no quiz\n          if (!draftApiClient || !quiz) return;\n\n          try {\n            const draftData = await draftApiClient.loadDraft(quiz.id);\n\n            if (draftData?.hasDraft && draftData.answers?.length > 0) {\n              applyDraftAnswers(draftData.answers);\n\n              // Update last saved payload to prevent immediate re-save\n              const payload = prepareDraftPayload();\n              set({ lastSavedDraftPayload: JSON.stringify(payload) });\n\n              // Navigate to first unanswered question\n              const questions = get().quiz?.questions || [];\n              const updatedAnswers = get().userAnswers;\n\n              const firstUnansweredIndex = questions.findIndex((question) => {\n                const answer = updatedAnswers.find(\n                  (a) => a.questionId === question.id\n                );\n                if (!answer) return true;\n                if (answer.optionId) return false;\n                if (\n                  answer.selectedOptionIds &&\n                  answer.selectedOptionIds.length > 0\n                )\n                  return false;\n                if (answer.answer && answer.answer.trim() !== '') return false;\n                return true;\n              });\n\n              if (firstUnansweredIndex > 0) {\n                // Navigate without triggering save (internal navigation)\n                set({ currentQuestionIndex: firstUnansweredIndex });\n              }\n            }\n          } catch (error) {\n            // Silent fail - user can continue fresh\n            console.warn('Erro ao carregar rascunho:', error);\n          }\n        },\n\n        // Navigation\n        goToNextQuestion: () => {\n          const { currentQuestionIndex, getTotalQuestions, saveDraft } = get();\n          const totalQuestions = getTotalQuestions();\n\n          if (currentQuestionIndex < totalQuestions - 1) {\n            // Save draft before navigating\n            saveDraft();\n            set({ currentQuestionIndex: currentQuestionIndex + 1 });\n          }\n        },\n\n        goToPreviousQuestion: () => {\n          const { currentQuestionIndex, saveDraft } = get();\n\n          if (currentQuestionIndex > 0) {\n            // Save draft before navigating\n            saveDraft();\n            set({ currentQuestionIndex: currentQuestionIndex - 1 });\n          }\n        },\n\n        goToQuestion: (index) => {\n          const { getTotalQuestions, currentQuestionIndex, saveDraft } = get();\n          const totalQuestions = getTotalQuestions();\n\n          if (\n            index >= 0 &&\n            index < totalQuestions &&\n            index !== currentQuestionIndex\n          ) {\n            // Save draft before navigating\n            saveDraft();\n            set({ currentQuestionIndex: index });\n          }\n        },\n\n        selectAnswer: (questionId, answerId) => {\n          const { quiz, userAnswers } = get();\n\n          if (!quiz) return;\n\n          const activityId = quiz.id;\n          const userId = get().getUserId();\n\n          if (!userId || userId === '') {\n            // Silent validation - userId not set\n            return;\n          }\n\n          const question = quiz.questions.find((q) => q.id === questionId);\n          if (!question) return;\n\n          const existingAnswerIndex = userAnswers.findIndex(\n            (answer) => answer.questionId === questionId\n          );\n\n          const newUserAnswer: UserAnswerItem = {\n            questionId,\n            activityId,\n            userId,\n            answer:\n              question.questionType === QUESTION_TYPE.DISSERTATIVA\n                ? answerId\n                : null,\n            optionId:\n              question.questionType === QUESTION_TYPE.DISSERTATIVA\n                ? null\n                : answerId,\n            questionType: question.questionType,\n            answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n          };\n\n          let updatedUserAnswers;\n          if (existingAnswerIndex !== -1) {\n            updatedUserAnswers = [...userAnswers];\n            updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n          } else {\n            updatedUserAnswers = [...userAnswers, newUserAnswer];\n          }\n\n          set({\n            userAnswers: updatedUserAnswers,\n          });\n        },\n\n        selectMultipleAnswer: (questionId, answerIds) => {\n          const { quiz, userAnswers } = get();\n\n          if (!quiz) return;\n\n          const activityId = quiz.id;\n          const userId = get().getUserId();\n\n          if (!userId || userId === '') {\n            // Silent validation - userId not set\n            return;\n          }\n\n          const question = quiz.questions.find((q) => q.id === questionId);\n          if (!question) return;\n\n          // Remove all existing answers for this questionId\n          const filteredUserAnswers = userAnswers.filter(\n            (answer) => answer.questionId !== questionId\n          );\n\n          // Don't persist empty MULTIPLA_ESCOLHA answers\n          if (answerIds.length === 0) {\n            set({\n              userAnswers: filteredUserAnswers,\n            });\n            return;\n          }\n\n          // Create a single UserAnswerItem with selectedOptionIds array\n          // This matches the backend API expected format for MULTIPLA_ESCOLHA\n          // Also set optionId to first selection for backward compatibility\n          const newUserAnswer: UserAnswerItem = {\n            questionId,\n            activityId,\n            userId,\n            answer: null,\n            optionId: answerIds.length > 0 ? answerIds[0] : null,\n            selectedOptionIds: answerIds,\n            questionType: question.questionType,\n            answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n          };\n\n          const updatedUserAnswers = [...filteredUserAnswers, newUserAnswer];\n\n          set({\n            userAnswers: updatedUserAnswers,\n          });\n        },\n\n        selectDissertativeAnswer: (questionId, answer) => {\n          const { quiz, userAnswers, dissertativeCharLimit } = get();\n\n          if (!quiz) return;\n\n          const activityId = quiz.id;\n          const userId = get().getUserId();\n\n          if (!userId || userId === '') {\n            // Silent validation - userId not set\n            return;\n          }\n\n          const question = quiz.questions.find((q) => q.id === questionId);\n          // Allow free-text question types: DISSERTATIVA, RELACIONAR, PREENCHER_LACUNAS, IMAGEM, VERDADEIRO_FALSO\n          const allowedTypes = [\n            QUESTION_TYPE.DISSERTATIVA,\n            QUESTION_TYPE.RELACIONAR,\n            QUESTION_TYPE.PREENCHER_LACUNAS,\n            QUESTION_TYPE.IMAGEM,\n            QUESTION_TYPE.VERDADEIRO_FALSO,\n          ];\n          if (!question || !allowedTypes.includes(question.questionType)) {\n            // Silent validation - wrong question type\n            return;\n          }\n\n          // Validate character limit if set (only for DISSERTATIVA)\n          let validatedAnswer = answer;\n          if (\n            question.questionType === QUESTION_TYPE.DISSERTATIVA &&\n            dissertativeCharLimit !== undefined &&\n            answer.length > dissertativeCharLimit\n          ) {\n            validatedAnswer = answer.substring(0, dissertativeCharLimit);\n          }\n\n          const existingAnswerIndex = userAnswers.findIndex(\n            (answerItem) => answerItem.questionId === questionId\n          );\n\n          const newUserAnswer: UserAnswerItem = {\n            questionId,\n            activityId,\n            userId,\n            answer: validatedAnswer,\n            optionId: null,\n            questionType: question.questionType,\n            answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n          };\n\n          let updatedUserAnswers;\n          if (existingAnswerIndex !== -1) {\n            updatedUserAnswers = [...userAnswers];\n            updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n          } else {\n            updatedUserAnswers = [...userAnswers, newUserAnswer];\n          }\n\n          set({\n            userAnswers: updatedUserAnswers,\n          });\n        },\n\n        skipQuestion: () => {\n          const { getCurrentQuestion, userAnswers, quiz } = get();\n          const currentQuestion = getCurrentQuestion();\n\n          if (!quiz) return;\n\n          if (currentQuestion) {\n            const activityId = quiz.id;\n            const userId = get().getUserId();\n\n            if (!userId || userId === '') {\n              // Silent validation - userId not set\n              return;\n            }\n\n            const existingAnswerIndex = userAnswers.findIndex(\n              (answer) => answer.questionId === currentQuestion.id\n            );\n            const existingAnswer =\n              existingAnswerIndex === -1\n                ? null\n                : userAnswers[existingAnswerIndex];\n\n            // If the user already has an answer with meaningful content, preserve it\n            if (hasMeaningfulAnswer(existingAnswer)) {\n              // Keep existing answers - don't overwrite with empty skip\n              return;\n            }\n\n            // Create empty \"skipped\" entry\n            const newUserAnswer: UserAnswerItem = {\n              questionId: currentQuestion.id,\n              activityId,\n              userId,\n              answer: null,\n              optionId: null,\n              questionType: currentQuestion.questionType,\n              answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n            };\n\n            let updatedUserAnswers;\n            if (existingAnswerIndex !== -1) {\n              // Update existing empty entry to proper \"skipped\" format\n              updatedUserAnswers = [...userAnswers];\n              updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n            } else {\n              // Add new skipped entry\n              updatedUserAnswers = [...userAnswers, newUserAnswer];\n            }\n\n            set({\n              userAnswers: updatedUserAnswers,\n            });\n          }\n        },\n\n        skipCurrentQuestionIfUnanswered: () => {\n          const { getCurrentQuestion, getCurrentAnswer, skipQuestion } = get();\n          const currentQuestion = getCurrentQuestion();\n          const currentAnswer = getCurrentAnswer();\n\n          // Se não há questão atual, não faz nada\n          if (!currentQuestion) return;\n\n          // Se não há resposta ou a resposta está vazia (null), marca como pulada\n          // Considera selectedOptionIds para MULTIPLA_ESCOLHA\n          if (\n            !currentAnswer ||\n            (currentAnswer.optionId === null &&\n              currentAnswer.answer === null &&\n              (!currentAnswer.selectedOptionIds ||\n                currentAnswer.selectedOptionIds.length === 0))\n          ) {\n            skipQuestion();\n          }\n        },\n\n        addUserAnswer: (questionId, answerId) => {\n          const { quiz, userAnswers } = get();\n\n          if (!quiz) return;\n\n          // Add to userAnswers array with new structure\n          const activityId = quiz.id;\n          const userId = get().getUserId();\n\n          if (!userId || userId === '') {\n            // Silent validation - userId not set\n            return;\n          }\n\n          const question = quiz.questions.find((q) => q.id === questionId);\n          if (!question) return;\n\n          const existingAnswerIndex = userAnswers.findIndex(\n            (answer) => answer.questionId === questionId\n          );\n\n          const newUserAnswer: UserAnswerItem = {\n            questionId,\n            activityId,\n            userId,\n            answer:\n              question.questionType === QUESTION_TYPE.DISSERTATIVA\n                ? answerId || null\n                : null,\n            optionId:\n              question.questionType !== QUESTION_TYPE.DISSERTATIVA\n                ? answerId || null\n                : null,\n            questionType: question.questionType,\n            answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n          };\n\n          if (existingAnswerIndex !== -1) {\n            // Update existing answer\n            const updatedUserAnswers = [...userAnswers];\n            updatedUserAnswers[existingAnswerIndex] = newUserAnswer;\n            set({ userAnswers: updatedUserAnswers });\n          } else {\n            // Add new answer\n            set({ userAnswers: [...userAnswers, newUserAnswer] });\n          }\n        },\n\n        startQuiz: () => {\n          set({ isStarted: true, timeElapsed: 0 });\n          startTimer();\n          startMinuteCallback();\n        },\n\n        finishQuiz: () => {\n          set({ isFinished: true });\n          stopTimer();\n          stopMinuteCallback();\n        },\n\n        resetQuiz: () => {\n          stopTimer();\n          stopMinuteCallback();\n          set({\n            quiz: null,\n            currentQuestionIndex: 0,\n            selectedAnswers: {},\n            userAnswers: [],\n            timeElapsed: 0,\n            isStarted: false,\n            isFinished: false,\n            userId: '',\n            variant: QuizVariant.DEFAULT,\n            minuteCallback: null,\n            dissertativeCharLimit: undefined,\n            timeLimit: null,\n            onTimeUp: null,\n            questionsResult: null,\n            currentQuestionResult: null,\n            // Note: draftApiClient is NOT reset here - it's managed by useDraftAutoSave hook\n            lastSavedDraftPayload: '',\n            isSavingDraft: false,\n            activityFeedback: null,\n          });\n        },\n\n        // Timer\n        updateTime: (time) => {\n          timerBaseElapsed = time;\n          if (timerStartedAt !== null) {\n            timerStartedAt = Date.now();\n          }\n          set({ timeElapsed: time });\n          checkTimeLimit(time);\n        },\n        startTimer,\n        stopTimer,\n        setTimeLimit: (seconds) => set({ timeLimit: seconds }),\n        setOnTimeUp: (callback) => set({ onTimeUp: callback }),\n        getRemainingTime: () => {\n          const { timeLimit, timeElapsed } = get();\n          if (timeLimit === null) return null;\n          return Math.max(0, timeLimit - timeElapsed);\n        },\n\n        // Minute Callback\n        setMinuteCallback,\n        startMinuteCallback,\n        stopMinuteCallback,\n\n        // Getters\n        getCurrentQuestion: () => {\n          const { currentQuestionIndex, quiz } = get();\n\n          if (!quiz) {\n            return null;\n          }\n\n          return quiz.questions[currentQuestionIndex];\n        },\n\n        getTotalQuestions: () => {\n          const { quiz } = get();\n\n          return quiz?.questions?.length || 0;\n        },\n\n        getAnsweredQuestions: () => {\n          const { userAnswers } = get();\n          const answeredQuestionIds = new Set(\n            userAnswers\n              .filter((answer) => hasMeaningfulAnswer(answer))\n              .map((answer) => answer.questionId)\n          );\n          return answeredQuestionIds.size;\n        },\n\n        getUnansweredQuestions: () => {\n          const { quiz, userAnswers } = get();\n          if (!quiz) return [];\n\n          const unansweredQuestions: number[] = [];\n\n          quiz.questions.forEach((question, index) => {\n            const userAnswer = userAnswers.find(\n              (answer) => answer.questionId === question.id\n            );\n            const isAnswered = hasMeaningfulAnswer(userAnswer);\n            // Question is skipped if it has a userAnswer entry but no meaningful content\n            const isSkipped = userAnswer && !hasMeaningfulAnswer(userAnswer);\n\n            if (!isAnswered && !isSkipped) {\n              unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n            }\n          });\n          return unansweredQuestions;\n        },\n\n        getSkippedQuestions: () => {\n          const { userAnswers } = get();\n          const skippedQuestionIds = new Set(\n            userAnswers\n              .filter((answer) => !hasMeaningfulAnswer(answer))\n              .map((answer) => answer.questionId)\n          );\n          return skippedQuestionIds.size;\n        },\n\n        getProgress: () => {\n          const { getTotalQuestions, getAnsweredQuestions } = get();\n          const total = getTotalQuestions();\n          const answered = getAnsweredQuestions();\n\n          return total > 0 ? (answered / total) * 100 : 0;\n        },\n\n        isQuestionAnswered: (questionId) => {\n          const { userAnswers } = get();\n          const userAnswer = userAnswers.find(\n            (answer) => answer.questionId === questionId\n          );\n          return hasMeaningfulAnswer(userAnswer);\n        },\n\n        isQuestionSkipped: (questionId) => {\n          const { userAnswers } = get();\n          const userAnswer = userAnswers.find(\n            (answer) => answer.questionId === questionId\n          );\n          // Question is skipped if it has a userAnswer entry but no meaningful content\n          return userAnswer ? !hasMeaningfulAnswer(userAnswer) : false;\n        },\n\n        getCurrentAnswer: () => {\n          const { getCurrentQuestion, userAnswers } = get();\n          const currentQuestion = getCurrentQuestion();\n\n          if (!currentQuestion) return undefined;\n\n          const userAnswer = userAnswers.find(\n            (answer) => answer.questionId === currentQuestion.id\n          );\n\n          // Retorna undefined se a resposta está vazia (não respondida)\n          if (!hasMeaningfulAnswer(userAnswer)) {\n            return undefined;\n          }\n\n          return userAnswer;\n        },\n\n        getAllCurrentAnswer: () => {\n          const { getCurrentQuestion, userAnswers } = get();\n          const currentQuestion = getCurrentQuestion();\n\n          if (!currentQuestion) return undefined;\n\n          const userAnswer = userAnswers.filter(\n            (answer) => answer.questionId === currentQuestion.id\n          );\n\n          return userAnswer;\n        },\n\n        getQuizTitle: () => {\n          const { quiz } = get();\n\n          return quiz?.title || 'Quiz';\n        },\n\n        formatTime: (seconds: number) => {\n          const minutes = Math.floor(seconds / 60);\n          const remainingSeconds = seconds % 60;\n          return `${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;\n        },\n\n        getUserAnswers: () => {\n          const { userAnswers } = get();\n          return userAnswers;\n        },\n\n        getUnansweredQuestionsFromUserAnswers: () => {\n          const { quiz, userAnswers } = get();\n          if (!quiz) return [];\n\n          const unansweredQuestions: number[] = [];\n\n          quiz.questions.forEach((question, index) => {\n            const userAnswer = userAnswers.find(\n              (answer) => answer.questionId === question.id\n            );\n            const hasAnswer = hasMeaningfulAnswer(userAnswer);\n            // Question is skipped if it has a userAnswer entry but no meaningful content\n            const isSkipped = userAnswer && !hasMeaningfulAnswer(userAnswer);\n\n            // Se não há resposta do usuário OU se a questão foi pulada\n            if (!hasAnswer || isSkipped) {\n              unansweredQuestions.push(index + 1); // index + 1 para mostrar número da questão\n            }\n          });\n\n          return unansweredQuestions;\n        },\n\n        getQuestionsGroupedBySubject: () => {\n          const { getQuestionResult, quiz, variant } = get();\n          const questions =\n            variant == 'result'\n              ? getQuestionResult()?.answers\n              : quiz?.questions;\n          if (!questions) return {};\n          const groupedQuestions: {\n            [key: string]: (Question | QuestionResult['answers'][number])[];\n          } = {};\n          questions.forEach((question) => {\n            const subjectId =\n              question.knowledgeMatrix?.[0]?.subject?.id || 'Sem matéria';\n\n            if (!groupedQuestions[subjectId]) {\n              groupedQuestions[subjectId] = [];\n            }\n\n            groupedQuestions[subjectId].push(question);\n          });\n\n          return groupedQuestions;\n        },\n\n        // New methods for userAnswers\n        getUserAnswerByQuestionId: (questionId) => {\n          const { userAnswers } = get();\n          return (\n            userAnswers.find((answer) => answer.questionId === questionId) ||\n            null\n          );\n        },\n        isQuestionAnsweredByUserAnswers: (questionId) => {\n          const { userAnswers } = get();\n          const answer = userAnswers.find(\n            (answer) => answer.questionId === questionId\n          );\n          return hasMeaningfulAnswer(answer);\n        },\n        getQuestionStatusFromUserAnswers: (questionId) => {\n          const { userAnswers } = get();\n          const answer = userAnswers.find(\n            (answer) => answer.questionId === questionId\n          );\n          if (!answer) return 'unanswered';\n          if (hasMeaningfulAnswer(answer)) return 'answered';\n          return 'skipped';\n        },\n        getUserAnswersForActivity: () => {\n          const { userAnswers } = get();\n          return userAnswers;\n        },\n        setCurrentQuestion: (question) => {\n          const { quiz, variant, questionsResult } = get();\n          if (!quiz) return;\n          let questionIndex: number;\n          if (variant == 'result') {\n            if (!questionsResult) return;\n            const questionResult =\n              questionsResult.answers.find((q) => q.id === question.id) ??\n              questionsResult.answers.find((q) => q.questionId === question.id);\n            if (!questionResult) return;\n            questionIndex = quiz.questions.findIndex(\n              (q) => q.id === questionResult.questionId\n            );\n          } else {\n            questionIndex = quiz.questions.findIndex(\n              (q) => q.id === question.id\n            );\n          }\n\n          // Validate that the question was found before updating currentQuestionIndex\n          if (questionIndex === -1) {\n            // Silent validation - question not found\n            return;\n          }\n\n          set({ currentQuestionIndex: questionIndex });\n        },\n\n        setAnswerStatus: (questionId, status) => {\n          const { userAnswers } = get();\n          const existingAnswerIndex = userAnswers.findIndex(\n            (answer) => answer.questionId === questionId\n          );\n\n          if (existingAnswerIndex !== -1) {\n            const updatedUserAnswers = [...userAnswers];\n            updatedUserAnswers[existingAnswerIndex] = {\n              ...updatedUserAnswers[existingAnswerIndex],\n              answerStatus: status,\n            };\n            set({ userAnswers: updatedUserAnswers });\n          }\n        },\n\n        getAnswerStatus: (questionId) => {\n          const { userAnswers } = get();\n          const userAnswer = userAnswers.find(\n            (answer) => answer.questionId === questionId\n          );\n          return userAnswer ? userAnswer.answerStatus : null;\n        },\n        getQuestionIndex: (questionId) => {\n          const { questionsResult, variant, quiz } = get();\n          if (variant == 'result') {\n            if (!questionsResult) return 0;\n\n            let idx = questionsResult.answers.findIndex(\n              (q) => q.questionId === questionId\n            );\n            if (idx === -1) {\n              idx = questionsResult.answers.findIndex(\n                (q) => q.id === questionId\n              );\n            }\n            return idx !== -1 ? idx + 1 : 0;\n          } else {\n            if (!quiz) return 0;\n            const idx = quiz.questions.findIndex((q) => q.id === questionId);\n            return idx !== -1 ? idx + 1 : 0;\n          }\n        },\n\n        // Question Result\n        getQuestionResultByQuestionId: (questionId) => {\n          const { questionsResult } = get();\n          const question = questionsResult?.answers.find(\n            (answer) => answer.questionId === questionId\n          );\n\n          return question || null;\n        },\n        getQuestionResultStatistics: () => {\n          const { questionsResult } = get();\n          return questionsResult?.statistics || null;\n        },\n        getQuestionResult: () => {\n          const { questionsResult } = get();\n          return questionsResult;\n        },\n        setQuestionsResult: (questionsResult) => {\n          set({ questionsResult });\n        },\n        setCurrentQuestionResult: (currentQuestionResult) => {\n          set({ currentQuestionResult });\n        },\n        getCurrentQuestionResult: () => {\n          const { currentQuestionResult } = get();\n          return currentQuestionResult;\n        },\n\n        // Draft management\n        applyDraftAnswers: (draftAnswers) => {\n          const { quiz, userId } = get();\n          if (!quiz || !draftAnswers || draftAnswers.length === 0) return;\n\n          const activityId = quiz.id;\n          const newUserAnswers: UserAnswerItem[] = [];\n\n          for (const draft of draftAnswers) {\n            const question = quiz.questions.find(\n              (q) => q.id === draft.questionId\n            );\n            if (!question) continue;\n\n            // Parse answer if it's a JSON string (for complex answer types)\n            let parsedAnswer = draft.answer;\n            let selectedOptionIds = draft.selectedOptionIds;\n\n            // Try to parse JSON answer for complex types\n            if (draft.answer && !draft.optionId) {\n              try {\n                const parsed = JSON.parse(draft.answer);\n                if (parsed.selectedOptionIds) {\n                  selectedOptionIds = parsed.selectedOptionIds;\n                  parsedAnswer = null;\n                }\n              } catch {\n                // Not JSON, keep as plain text\n              }\n            }\n\n            const userAnswer: UserAnswerItem = {\n              questionId: draft.questionId,\n              activityId,\n              userId,\n              answer: parsedAnswer,\n              optionId: draft.optionId || null,\n              selectedOptionIds: selectedOptionIds || null,\n              questionType: question.questionType,\n              answerStatus: ANSWER_STATUS.PENDENTE_AVALIACAO,\n            };\n\n            newUserAnswers.push(userAnswer);\n          }\n\n          set({ userAnswers: newUserAnswers });\n        },\n\n        prepareDraftPayload: () => {\n          const { userAnswers } = get();\n\n          const answers = userAnswers\n            .filter((answer) => hasMeaningfulAnswer(answer))\n            .map((answer) => {\n              const draftAnswer: SaveDraftPayload['answers'][number] = {\n                questionId: answer.questionId,\n              };\n\n              if (answer.optionId) {\n                draftAnswer.optionId = answer.optionId;\n              }\n\n              if (answer.answer) {\n                draftAnswer.answer = answer.answer;\n              }\n\n              if (\n                answer.selectedOptionIds &&\n                answer.selectedOptionIds.length > 0\n              ) {\n                draftAnswer.selectedOptionIds = answer.selectedOptionIds;\n              }\n\n              return draftAnswer;\n            });\n\n          return { answers };\n        },\n\n        hasDraftChanges: () => {\n          const { userAnswers } = get();\n          return userAnswers.some((answer) => hasMeaningfulAnswer(answer));\n        },\n\n        // Activity Feedback\n        setActivityFeedback: (feedback) => set({ activityFeedback: feedback }),\n        getActivityFeedback: () => get().activityFeedback,\n      };\n    },\n    {\n      name: 'quiz-store',\n    }\n  )\n);\n"],"mappings":"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","names":["QUESTION_DIFFICULTY","QUIZ_TYPE","QUESTION_TYPE","QUESTION_STATUS","ANSWER_STATUS","SUBTYPE_ENUM","answer"]}