{"version":3,"sources":["../src/hooks/useQuestionsData.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\n\n/**\n * Period filter options for questions data\n */\nexport type QuestionsDataPeriod =\n  | '7_DAYS'\n  | '1_MONTH'\n  | '3_MONTHS'\n  | '6_MONTHS'\n  | '1_YEAR';\n\n/**\n * Trend direction for questions data\n */\nexport type QuestionsDataTrendDirection = 'up' | 'down' | 'stable';\n\n/**\n * Filters for questions data API request\n */\nexport interface QuestionsDataFilters {\n  period?: QuestionsDataPeriod;\n  subjectId?: string;\n  schoolYearId?: string;\n  classId?: string;\n  schoolId?: string;\n}\n\n/**\n * Trend information from API response\n */\nexport interface QuestionsDataTrend {\n  totalQuestions: number;\n  correctPercentage: number;\n  direction: QuestionsDataTrendDirection;\n}\n\n/**\n * API response data structure\n */\nexport interface QuestionsDataApiData {\n  totalQuestions: number;\n  correctQuestions: number;\n  incorrectQuestions: number;\n  blankQuestions: number;\n  correctPercentage: number;\n  incorrectPercentage: number;\n  blankPercentage: number;\n  trend: QuestionsDataTrend | null;\n}\n\n/**\n * API response structure for questions data endpoint\n */\nexport interface QuestionsDataApiResponse {\n  message: string;\n  data: QuestionsDataApiData;\n}\n\n/**\n * Transformed data for UI display.\n * Extends the basic QuestionsDataItem from component with additional API fields.\n * Can be passed directly to QuestionsData component (extra fields are ignored).\n */\nexport interface QuestionsDataHookResult {\n  /** Total number of questions answered */\n  total: number;\n  /** Number of correct answers */\n  corretas: number;\n  /** Number of incorrect answers */\n  incorretas: number;\n  /** Number of blank (unanswered) questions */\n  emBranco: number;\n  /** Percentage of correct answers */\n  correctPercentage: number;\n  /** Percentage of incorrect answers */\n  incorrectPercentage: number;\n  /** Percentage of blank answers */\n  blankPercentage: number;\n  /** Trend information */\n  trend: QuestionsDataTrend | null;\n}\n\n/**\n * Zod schema for trend direction\n */\nconst trendDirectionSchema = z.enum(['up', 'down', 'stable']);\n\n/**\n * Zod schema for trend object\n */\nconst trendSchema = z\n  .object({\n    totalQuestions: z.number(),\n    correctPercentage: z.number(),\n    direction: trendDirectionSchema,\n  })\n  .nullable();\n\n/**\n * Zod schema for questions data API response validation\n */\nexport const questionsDataApiResponseSchema = z.object({\n  message: z.string(),\n  data: z.object({\n    totalQuestions: z.number().min(0),\n    correctQuestions: z.number().min(0),\n    incorrectQuestions: z.number().min(0),\n    blankQuestions: z.number().min(0),\n    correctPercentage: z.number().min(0).max(100),\n    incorrectPercentage: z.number().min(0).max(100),\n    blankPercentage: z.number().min(0).max(100),\n    trend: trendSchema,\n  }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseQuestionsDataState {\n  data: QuestionsDataHookResult | null;\n  loading: boolean;\n  error: string | null;\n}\n\n/**\n * Hook return type\n */\nexport interface UseQuestionsDataReturn extends UseQuestionsDataState {\n  fetchQuestionsData: (filters?: QuestionsDataFilters) => Promise<void>;\n  reset: () => void;\n}\n\n/**\n * Transform API response data to component format\n * @param apiData - Data from API response\n * @returns Transformed data for QuestionsData component\n */\nexport const transformQuestionsData = (\n  apiData: QuestionsDataApiData\n): QuestionsDataHookResult => ({\n  total: apiData.totalQuestions,\n  corretas: apiData.correctQuestions,\n  incorretas: apiData.incorrectQuestions,\n  emBranco: apiData.blankQuestions,\n  correctPercentage: apiData.correctPercentage,\n  incorrectPercentage: apiData.incorrectPercentage,\n  blankPercentage: apiData.blankPercentage,\n  trend: apiData.trend,\n});\n\n/**\n * Handle errors during questions data fetch\n * @param error - Error object\n * @returns Error message for UI display\n */\nexport const handleQuestionsDataFetchError = (error: unknown): string => {\n  if (error instanceof z.ZodError) {\n    console.error('Erro ao validar dados de questões:', error);\n    return 'Erro ao validar dados de questões';\n  }\n\n  console.error('Erro ao carregar dados de questões:', error);\n  return 'Erro ao carregar dados de questões';\n};\n\n/**\n * Initial state for the hook\n */\nconst initialState: UseQuestionsDataState = {\n  data: null,\n  loading: false,\n  error: null,\n};\n\n/**\n * Factory function to create useQuestionsData hook\n *\n * @param fetchQuestionsDataApi - Function to fetch questions data from API\n * @returns Hook for managing questions data\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchQuestionsDataApi = async (filters) => {\n *   const response = await api.get('/performance/questions-data', { params: filters });\n *   return response.data;\n * };\n *\n * const useQuestionsData = createUseQuestionsData(fetchQuestionsDataApi);\n *\n * // In your component\n * const { data, loading, error, fetchQuestionsData } = useQuestionsData();\n *\n * useEffect(() => {\n *   fetchQuestionsData({ period: '1_MONTH' });\n * }, []);\n *\n * if (loading) return <Skeleton />;\n * if (!data) return null;\n *\n * return <QuestionsData data={data} />;\n * ```\n */\nexport const createUseQuestionsData = (\n  fetchQuestionsDataApi: (\n    filters?: QuestionsDataFilters\n  ) => Promise<QuestionsDataApiResponse>\n) => {\n  return (): UseQuestionsDataReturn => {\n    const [state, setState] = useState<UseQuestionsDataState>(initialState);\n\n    /**\n     * Fetch questions data from API\n     * @param filters - Optional filters for period, subject, class, etc.\n     */\n    const fetchQuestionsData = useCallback(\n      async (filters?: QuestionsDataFilters) => {\n        setState((prev) => ({ ...prev, loading: true, error: null }));\n\n        try {\n          // Fetch data from API\n          const responseData = await fetchQuestionsDataApi(filters);\n\n          // Validate response with Zod\n          const validatedData =\n            questionsDataApiResponseSchema.parse(responseData);\n\n          // Transform data to component format\n          const transformedData = transformQuestionsData(validatedData.data);\n\n          // Update state with validated and transformed data\n          setState({\n            data: transformedData,\n            loading: false,\n            error: null,\n          });\n        } catch (error) {\n          const errorMessage = handleQuestionsDataFetchError(error);\n          setState((prev) => ({\n            ...prev,\n            loading: false,\n            error: errorMessage,\n          }));\n        }\n      },\n      [fetchQuestionsDataApi]\n    );\n\n    /**\n     * Reset state to initial values\n     */\n    const reset = useCallback(() => {\n      setState(initialState);\n    }, []);\n\n    return {\n      ...state,\n      fetchQuestionsData,\n      reset,\n    };\n  };\n};\n\n/**\n * Alias for createUseQuestionsData\n */\nexport const createQuestionsDataHook = createUseQuestionsData;\n"],"mappings":";AAAA,SAAS,UAAU,mBAAmB;AACtC,SAAS,SAAS;AAsFlB,IAAM,uBAAuB,EAAE,KAAK,CAAC,MAAM,QAAQ,QAAQ,CAAC;AAK5D,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,gBAAgB,EAAE,OAAO;AAAA,EACzB,mBAAmB,EAAE,OAAO;AAAA,EAC5B,WAAW;AACb,CAAC,EACA,SAAS;AAKL,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,OAAO;AAAA,IACb,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAChC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAClC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACpC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAChC,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC5C,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC9C,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC1C,OAAO;AAAA,EACT,CAAC;AACH,CAAC;AAwBM,IAAM,yBAAyB,CACpC,aAC6B;AAAA,EAC7B,OAAO,QAAQ;AAAA,EACf,UAAU,QAAQ;AAAA,EAClB,YAAY,QAAQ;AAAA,EACpB,UAAU,QAAQ;AAAA,EAClB,mBAAmB,QAAQ;AAAA,EAC3B,qBAAqB,QAAQ;AAAA,EAC7B,iBAAiB,QAAQ;AAAA,EACzB,OAAO,QAAQ;AACjB;AAOO,IAAM,gCAAgC,CAAC,UAA2B;AACvE,MAAI,iBAAiB,EAAE,UAAU;AAC/B,YAAQ,MAAM,yCAAsC,KAAK;AACzD,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,0CAAuC,KAAK;AAC1D,SAAO;AACT;AAKA,IAAM,eAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AA+BO,IAAM,yBAAyB,CACpC,0BAGG;AACH,SAAO,MAA8B;AACnC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,YAAY;AAMtE,UAAM,qBAAqB;AAAA,MACzB,OAAO,YAAmC;AACxC,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE5D,YAAI;AAEF,gBAAM,eAAe,MAAM,sBAAsB,OAAO;AAGxD,gBAAM,gBACJ,+BAA+B,MAAM,YAAY;AAGnD,gBAAM,kBAAkB,uBAAuB,cAAc,IAAI;AAGjE,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eAAe,8BAA8B,KAAK;AACxD,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,SAAS;AAAA,YACT,OAAO;AAAA,UACT,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,CAAC,qBAAqB;AAAA,IACxB;AAKA,UAAM,QAAQ,YAAY,MAAM;AAC9B,eAAS,YAAY;AAAA,IACvB,GAAG,CAAC,CAAC;AAEL,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,0BAA0B;","names":[]}