{"version":3,"sources":["../src/hooks/useActivityModels.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\nimport type { BaseApiClient } from '../types/api';\nimport { ActivityDraftType } from '../types/activitiesHistory';\nimport { ActivityType } from '../components/ActivityCreate/ActivityCreate.types';\nimport type {\n  ActivityModelResponse,\n  ActivityModelTableItem,\n  ActivityModelsApiResponse,\n  ActivityModelFilters,\n  ActivityPagination,\n} from '../types/activitiesHistory';\n\n/**\n * Options for configuring the useActivityModels hook\n */\nexport interface UseActivityModelsOptions {\n  /** Filter by activity category (PROVA, ATIVIDADE, etc.) */\n  activityCategory?: 'PROVA' | 'ATIVIDADE';\n}\n\n/**\n * Hook state interface\n */\nexport interface UseActivityModelsState {\n  models: ActivityModelTableItem[];\n  loading: boolean;\n  error: string | null;\n  pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivityModelsReturn extends UseActivityModelsState {\n  fetchModels: (\n    filters?: ActivityModelFilters,\n    subjectsMap?: Map<string, string>\n  ) => Promise<void>;\n  deleteModel: (id: string) => Promise<boolean>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_MODELS_PAGINATION: ActivityPagination = {\n  total: 0,\n  page: 1,\n  limit: 10,\n  totalPages: 0,\n};\n\n/**\n * Transform API response to table item format\n * @param model - Activity model from API response\n * @param subjectsMap - Map of subject IDs to subject names (fallback if subject is not in response)\n * @returns Formatted model for table display\n */\nexport const transformModelToTableItem = (\n  model: ActivityModelResponse,\n  subjectsMap?: Map<string, string>\n): ActivityModelTableItem => {\n  // Use subject from API response if available\n  // If not available and subjectsMap is provided, create a basic subject object\n  let subject = model.subject;\n  if (!subject && model.subjectId && subjectsMap) {\n    const subjectName = subjectsMap.get(model.subjectId);\n    if (subjectName) {\n      subject = {\n        id: model.subjectId,\n        name: subjectName,\n        icon: 'BookOpen',\n        color: '#6B7280',\n      };\n    }\n  }\n\n  // Map ActivityDraftType to ActivityType\n  const activityType =\n    model.type === ActivityDraftType.MODELO\n      ? ActivityType.MODELO\n      : ActivityType.RASCUNHO;\n\n  return {\n    id: model.id,\n    type: activityType,\n    title: model.title || 'Sem título',\n    savedAt: dayjs(model.createdAt).format('DD/MM/YYYY'),\n    subject: subject || null,\n    subjectId: model.subjectId,\n  };\n};\n\n/**\n * Build query params from filters\n * @param filters - User filters\n * @param activityCategory - Optional activity category filter\n * @returns Query params object\n */\nconst buildQueryParams = (\n  filters?: ActivityModelFilters,\n  activityCategory?: string\n): Record<string, unknown> => {\n  const params: Record<string, unknown> = {\n    type: ActivityDraftType.MODELO, // models = MODELO\n  };\n\n  // Add activityCategory filter if provided\n  if (activityCategory) {\n    params.activityType = activityCategory;\n  }\n\n  if (filters) {\n    for (const key in filters) {\n      const value = filters[key as keyof ActivityModelFilters];\n      if (value !== undefined && value !== null) {\n        params[key] = value;\n      }\n    }\n  }\n\n  return params;\n};\n\n/**\n * Hook implementation\n */\nconst useActivityModelsImpl = (\n  apiClient: BaseApiClient,\n  options?: UseActivityModelsOptions\n): UseActivityModelsReturn => {\n  const [state, setState] = useState<UseActivityModelsState>({\n    models: [],\n    loading: false,\n    error: null,\n    pagination: DEFAULT_MODELS_PAGINATION,\n  });\n\n  const fetchModels = useCallback(\n    async (\n      filters?: ActivityModelFilters,\n      subjectsMap?: Map<string, string>\n    ) => {\n      setState((prev) => ({ ...prev, loading: true, error: null }));\n\n      try {\n        const params = buildQueryParams(filters, options?.activityCategory);\n        const response = await apiClient.get<ActivityModelsApiResponse>(\n          '/activity-drafts',\n          { params }\n        );\n\n        const tableItems = response.data.data.activityDrafts.map((model) =>\n          transformModelToTableItem(model, subjectsMap)\n        );\n\n        const limit = filters?.limit || 10;\n        const page = filters?.page || 1;\n        const total = response.data.data.total;\n        const totalPages = Math.ceil(total / limit);\n\n        setState({\n          models: tableItems,\n          loading: false,\n          error: null,\n          pagination: { total, page, limit, totalPages },\n        });\n      } catch (error) {\n        console.error('Erro ao carregar modelos:', error);\n        setState((prev) => ({\n          ...prev,\n          loading: false,\n          error: 'Erro ao carregar modelos de atividades',\n        }));\n      }\n    },\n    [apiClient, options?.activityCategory]\n  );\n\n  const deleteModel = useCallback(\n    async (id: string): Promise<boolean> => {\n      try {\n        await apiClient.delete(`/activity-drafts/${id}`);\n        setState((prev) => ({\n          ...prev,\n          models: prev.models.filter((m) => m.id !== id),\n          pagination: {\n            ...prev.pagination,\n            total: Math.max(0, prev.pagination.total - 1),\n          },\n        }));\n        return true;\n      } catch (error) {\n        console.error('Erro ao deletar modelo:', error);\n        return false;\n      }\n    },\n    [apiClient]\n  );\n\n  return { ...state, fetchModels, deleteModel };\n};\n\n/**\n * Factory function to create useActivityModels hook\n *\n * @param apiClient - API client instance (axios, fetch wrapper, etc.)\n * @param options - Hook configuration options\n * @returns Hook for managing activity models\n *\n * @example\n * ```tsx\n * import { createUseActivityModels } from 'analytica-frontend-lib';\n * import api from '@/services/apiService';\n *\n * const useActivityModels = createUseActivityModels(api, { activityCategory: 'ATIVIDADE' });\n *\n * // In your component\n * const { models, loading, fetchModels, deleteModel } = useActivityModels();\n * ```\n */\nexport const createUseActivityModels = (\n  apiClient: BaseApiClient,\n  options?: UseActivityModelsOptions\n) => {\n  return (): UseActivityModelsReturn =>\n    useActivityModelsImpl(apiClient, options);\n};\n\n/**\n * Alias for createUseActivityModels\n */\nexport const createActivityModelsHook = createUseActivityModels;\n"],"mappings":"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","names":[]}