{"version":3,"sources":["../src/hooks/useRecommendedLessons.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport { RecommendedClassDisplayStatus } from '../types/recommendedLessons';\nimport type {\n  RecommendedClassHistoryItem,\n  RecommendedClassTableItem,\n  RecommendedClassHistoryApiResponse,\n  RecommendedClassHistoryFilters,\n  RecommendedClassHistoryPagination,\n} from '../types/recommendedLessons';\n\n/**\n * Zod schema for recommendedClass history API response validation\n * Based on /recommended-class/history endpoint\n */\nconst recommendedClassSubjectSchema = z\n  .object({\n    id: z.string().uuid(),\n    name: z.string(),\n  })\n  .nullable();\n\nconst recommendedClassCreatorSchema = z\n  .object({\n    id: z.string().uuid(),\n    name: z.string(),\n  })\n  .nullable();\n\nconst recommendedClassStatsSchema = z.object({\n  totalStudents: z.number(),\n  completedCount: z.number(),\n  completionPercentage: z.number(),\n});\n\nconst recommendedClassBreakdownSchema = z.object({\n  classId: z.string().uuid(),\n  className: z.string(),\n  schoolId: z.string(),\n  schoolName: z.string(),\n  studentCount: z.number(),\n  completedCount: z.number(),\n});\n\nconst recommendedClassDataSchema = z.object({\n  id: z.string().uuid(),\n  title: z.string(),\n  startDate: z.string().nullable(),\n  finalDate: z.string().nullable(),\n  createdAt: z.string(),\n  progress: z.number(),\n  totalLessons: z.number(),\n});\n\nconst recommendedClassHistoryItemSchema = z.object({\n  recommendedClass: recommendedClassDataSchema,\n  subject: recommendedClassSubjectSchema,\n  creator: recommendedClassCreatorSchema,\n  stats: recommendedClassStatsSchema,\n  breakdown: z.array(recommendedClassBreakdownSchema),\n});\n\nexport const recommendedClassHistoryApiResponseSchema = z.object({\n  message: z.string(),\n  data: z.object({\n    recommendedClass: z.array(recommendedClassHistoryItemSchema),\n    total: z.number(),\n  }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseRecommendedLessonsHistoryState {\n  recommendedClass: RecommendedClassTableItem[];\n  loading: boolean;\n  error: string | null;\n  pagination: RecommendedClassHistoryPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseRecommendedLessonsHistoryReturn extends UseRecommendedLessonsHistoryState {\n  fetchRecommendedClass: (\n    filters?: RecommendedClassHistoryFilters\n  ) => Promise<void>;\n}\n\n/**\n * Determine status based on dates and completion\n * @param finalDate - RecommendedClass final date\n * @param completionPercentage - Completion percentage\n * @returns Display status for UI\n */\nexport const determineRecommendedClassStatus = (\n  finalDate: string | null,\n  completionPercentage: number\n): RecommendedClassDisplayStatus => {\n  if (completionPercentage === 100) {\n    return RecommendedClassDisplayStatus.CONCLUIDA;\n  }\n\n  if (finalDate) {\n    const now = dayjs();\n    const deadline = dayjs(finalDate);\n    if (deadline.isBefore(now)) {\n      return RecommendedClassDisplayStatus.VENCIDA;\n    }\n  }\n\n  return RecommendedClassDisplayStatus.ATIVA;\n};\n\n/**\n * Transform API response to table item format\n * @param item - RecommendedClass history item from API response\n * @returns Formatted recommendedClass for table display\n */\nexport const transformRecommendedClassToTableItem = (\n  item: RecommendedClassHistoryItem\n): RecommendedClassTableItem => {\n  // Get first breakdown for school/class info (or aggregate)\n  const firstBreakdown = item.breakdown[0];\n  const schoolName = firstBreakdown?.schoolName || '-';\n  const className = firstBreakdown?.className || '-';\n\n  // If multiple classes, show count\n  const classDisplay =\n    item.breakdown.length > 1 ? `${item.breakdown.length} turmas` : className;\n\n  return {\n    id: item.recommendedClass.id,\n    startDate: item.recommendedClass.startDate\n      ? dayjs(item.recommendedClass.startDate).format('DD/MM')\n      : '-',\n    deadline: item.recommendedClass.finalDate\n      ? dayjs(item.recommendedClass.finalDate).format('DD/MM')\n      : '-',\n    title: item.recommendedClass.title,\n    school: schoolName,\n    year: '-', // API doesn't provide year directly\n    creator: item.creator?.name || '-',\n    creatorId: item.creator?.id ?? null,\n    subject: item.subject?.name || '-',\n    class: classDisplay,\n    status: determineRecommendedClassStatus(\n      item.recommendedClass.finalDate,\n      item.stats.completionPercentage\n    ),\n    completionPercentage: item.stats.completionPercentage,\n  };\n};\n\n/**\n * Handle errors during recommendedClass fetch\n * @param error - Error object\n * @returns Error message for UI display\n */\nexport const handleRecommendedClassFetchError = (error: unknown): string => {\n  if (error instanceof z.ZodError) {\n    console.error('Erro ao validar dados de histórico de aulas:', error);\n    return 'Erro ao validar dados de histórico de aulas';\n  }\n\n  console.error('Erro ao carregar histórico de aulas:', error);\n  return 'Erro ao carregar histórico de aulas';\n};\n\n/**\n * Factory function to create useRecommendedLessonsHistory hook\n *\n * @param fetchRecommendedClassHistory - Function to fetch recommendedClass from API\n * @returns Hook for managing recommended lessons history\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchRecommendedClassHistory = async (filters) => {\n *   const response = await api.get('/recommended-class/history', { params: filters });\n *   return response.data;\n * };\n *\n * const useRecommendedClassHistory = createUseRecommendedLessonsHistory(fetchRecommendedClassHistory);\n *\n * // In your component\n * const { recommendedClass, loading, error, pagination, fetchRecommendedClass } = useRecommendedClassHistory();\n * ```\n */\nexport const createUseRecommendedLessonsHistory = (\n  fetchRecommendedClassHistory: (\n    filters?: RecommendedClassHistoryFilters\n  ) => Promise<RecommendedClassHistoryApiResponse>\n) => {\n  return (): UseRecommendedLessonsHistoryReturn => {\n    const [state, setState] = useState<UseRecommendedLessonsHistoryState>({\n      recommendedClass: [],\n      loading: false,\n      error: null,\n      pagination: {\n        total: 0,\n        page: 1,\n        limit: 10,\n        totalPages: 0,\n      },\n    });\n\n    /**\n     * Fetch recommendedClass history from API\n     * @param filters - Optional filters for pagination, search, sorting, etc.\n     */\n    const fetchRecommendedClass = useCallback(\n      async (filters?: RecommendedClassHistoryFilters) => {\n        setState((prev) => ({ ...prev, loading: true, error: null }));\n\n        try {\n          // Fetch data from API\n          const responseData = await fetchRecommendedClassHistory(filters);\n\n          // Validate response with Zod\n          const validatedData =\n            recommendedClassHistoryApiResponseSchema.parse(responseData);\n\n          // Transform recommendedClass to table format\n          const tableItems = validatedData.data.recommendedClass.map(\n            transformRecommendedClassToTableItem\n          );\n\n          // Calculate pagination from total\n          const page = filters?.page || 1;\n          const limit = filters?.limit || 10;\n          const total = validatedData.data.total;\n          const totalPages = Math.ceil(total / limit);\n\n          // Update state with validated and transformed data\n          setState({\n            recommendedClass: tableItems,\n            loading: false,\n            error: null,\n            pagination: {\n              total,\n              page,\n              limit,\n              totalPages,\n            },\n          });\n        } catch (error) {\n          const errorMessage = handleRecommendedClassFetchError(error);\n          setState((prev) => ({\n            ...prev,\n            loading: false,\n            error: errorMessage,\n          }));\n        }\n      },\n      [fetchRecommendedClassHistory]\n    );\n\n    return {\n      ...state,\n      fetchRecommendedClass,\n    };\n  };\n};\n\n/**\n * Alias for createUseRecommendedLessonsHistory\n */\nexport const createRecommendedLessonsHistoryHook =\n  createUseRecommendedLessonsHistory;\n"],"mappings":"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","names":[]}