{"version":3,"sources":["../src/components/SimulatedPerformance/useSimulatedPerformance.tsx","../src/components/GeneralOverviewSection/GeneralOverviewSection.tsx","../src/components/GeneralOverviewSection/useGeneralOverview.ts","../src/components/SimulatedStudentsOverview/useSimulatedOverview.ts","../src/components/SimulatedStudentDetailsModal/types.ts","../src/components/SimulatedStudentsOverview/utils.ts","../src/components/SimulatedStudentsOverview/useAggregatedOverview.ts","../src/components/SimulatedContentsPerformance/useSimulatedContents.ts","../src/components/AreaKnowledgeSelector/AreaKnowledgeSelector.tsx","../src/components/AreaKnowledgeSelector/types.ts","../src/components/SimulatedStudentDetailsModal/SimulatedStudentDetailsModal.tsx","../src/components/SimulatedStudentDetailsModal/useSimulatedStudentDetails.ts","../src/components/SimulatedStudentDetailsModal/utils.ts","../src/utils/profileAggregation.ts","../src/components/SimulatedPerformance/types.ts"],"sourcesContent":["import { useEffect, useCallback, useState, useMemo, useRef } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport Badge from '../Badge/Badge';\nimport { useGeneralOverview } from '../GeneralOverviewSection';\nimport {\n  useSimulatedOverview,\n  useAggregatedOverview,\n} from '../SimulatedStudentsOverview';\nimport { useSimulatedContents } from '../SimulatedContentsPerformance';\nimport { ESSAY_AREA_ID } from '../AreaKnowledgeSelector';\nimport { SIMULATED_PERFORMANCE_TAG_CONFIG } from '../SimulatedStudentDetailsModal';\nimport { formatScore } from '../../utils/utils';\nimport { getAggregationTypeByProfile } from '../../utils/profileAggregation';\nimport type { ColumnConfig } from '../TableProvider';\nimport type { StudentsHighlightPeriod } from '../../hooks/useStudentsHighlight';\nimport { ScoreType } from '../../types/common';\nimport type { SimulatedFilters } from '../SimulatedFilters/types';\nimport type { SimulatedStudentItem } from '../SimulatedStudentsOverview/types';\nimport type { SimulatedContentItem } from '../SimulatedContentsPerformance/types';\nimport {\n  SimulatedViewTab,\n  type UseSimulatedPerformanceOptions,\n  type UseSimulatedPerformanceReturn,\n} from './types';\n\n/**\n * Performance tag cell renderer for simulated exams\n */\nfunction SimulatedPerformanceTagCell({\n  row,\n}: {\n  readonly row: SimulatedStudentItem;\n}) {\n  const tagConfig = SIMULATED_PERFORMANCE_TAG_CONFIG[row.performance];\n\n  return (\n    <Badge variant=\"solid\" action={tagConfig.variant} size=\"small\">\n      {tagConfig.label}\n    </Badge>\n  );\n}\n\n/**\n * Performance cell renderer for contents/skills with progress bar\n */\nfunction ContentPerformanceCell({\n  percentage,\n}: {\n  readonly percentage: number;\n}) {\n  const getColorClass = (): string => {\n    if (percentage >= 70) {\n      return 'bg-success-500';\n    }\n\n    if (percentage >= 50) {\n      return 'bg-warning-500';\n    }\n\n    return 'bg-error-500';\n  };\n\n  const colorClass = getColorClass();\n\n  return (\n    <div className=\"flex items-center justify-center gap-2\">\n      <span className=\"text-sm text-text-950 min-w-[40px]\">\n        {Math.round(percentage)}%\n      </span>\n      <div className=\"w-16 h-2 bg-background-100 rounded-full overflow-hidden\">\n        <div\n          className={`h-full rounded-full ${colorClass}`}\n          style={{ width: `${percentage}%` }}\n        />\n      </div>\n    </div>\n  );\n}\n\n/**\n * Shared defaults for centered columns\n */\nconst centeredColumn: Partial<ColumnConfig<SimulatedStudentItem>> = {\n  sortable: true,\n  className: 'py-3 px-4 text-center',\n  align: 'center',\n};\n\n/**\n * Shared defaults for centered columns (contents table)\n */\nconst centeredContentsColumn: Partial<ColumnConfig<SimulatedContentItem>> = {\n  sortable: true,\n  className: 'py-3 px-4 text-center',\n  align: 'center',\n};\n\n/**\n * Base columns for simulated exams view (without render functions that depend on scoreType)\n */\nconst simulatedTableColumnsBase: Omit<\n  ColumnConfig<SimulatedStudentItem>,\n  'render'\n>[] = [\n  {\n    key: 'name',\n    label: 'Nome',\n    sortable: true,\n    className: 'py-3 px-4 text-start',\n  },\n  {\n    key: 'school',\n    label: 'Escola',\n    sortable: false,\n    className: 'py-3 px-4 text-start',\n  },\n  {\n    ...centeredColumn,\n    key: 'schoolYear',\n    label: 'Ano',\n    width: '80px',\n    sortable: false,\n  },\n  {\n    ...centeredColumn,\n    key: 'class',\n    label: 'Turma',\n    width: '80px',\n    sortable: false,\n  },\n  {\n    ...centeredColumn,\n    key: 'average',\n    label: 'Média',\n    width: '100px',\n  },\n  {\n    ...centeredColumn,\n    key: 'performance',\n    label: 'Desempenho',\n    width: '160px',\n  },\n];\n\n/**\n * Table columns for simulated contents/skills view\n */\nconst contentsTableColumns: ColumnConfig<SimulatedContentItem>[] = [\n  {\n    key: 'contentName',\n    label: 'Habilidade',\n    sortable: true,\n    className: 'py-3 px-4 text-start',\n  },\n  {\n    key: 'subject',\n    label: 'Componente',\n    sortable: false,\n    className: 'py-3 px-4 text-start',\n    render: (_value: unknown, row: SimulatedContentItem) => row.subject.name,\n  },\n  {\n    ...centeredContentsColumn,\n    key: 'simulatedExamsCount',\n    label: 'Simulados',\n    width: '100px',\n  },\n  {\n    ...centeredContentsColumn,\n    key: 'questionsCount',\n    label: 'Questões',\n    width: '100px',\n  },\n  {\n    ...centeredContentsColumn,\n    key: 'studentsCount',\n    label: 'Estudantes',\n    width: '100px',\n  },\n  {\n    ...centeredContentsColumn,\n    key: 'performance',\n    label: 'Desempenho',\n    width: '160px',\n    render: (_value: unknown, row: SimulatedContentItem) => (\n      <ContentPerformanceCell percentage={row.performance.correctPercentage} />\n    ),\n  },\n];\n\n/**\n * Hook de orquestração para a funcionalidade de Simulados.\n * Gerencia estados, query params, carregamento de dados e handlers.\n */\nexport function useSimulatedPerformance({\n  api,\n  profileName,\n  enabled = true,\n}: UseSimulatedPerformanceOptions): UseSimulatedPerformanceReturn {\n  const [searchParams, setSearchParams] = useSearchParams();\n\n  // === Aggregation Type based on Profile ===\n  const aggregationType = useMemo(\n    () => getAggregationTypeByProfile(profileName),\n    [profileName]\n  );\n\n  // === Query Params ===\n  const period = useMemo((): StudentsHighlightPeriod => {\n    const periodParam = searchParams.get('period');\n    if (periodParam === '7_DAYS') return '7_DAYS';\n    if (periodParam === '1_MONTH') return '1_MONTH';\n    if (periodParam === '3_MONTHS') return '3_MONTHS';\n    if (periodParam === '6_MONTHS') return '6_MONTHS';\n    if (periodParam === '1_YEAR') return '1_YEAR';\n    return '1_MONTH';\n  }, [searchParams]);\n\n  const scoreType = useMemo((): ScoreType => {\n    const scoreTypeParam = searchParams.get('scoreType');\n    if (scoreTypeParam === 'tri') return ScoreType.TRI;\n    return ScoreType.PERCENTAGE;\n  }, [searchParams]);\n\n  // === Estados de Seleção ===\n  const [selectedAreaKnowledgeId, setSelectedAreaKnowledgeId] = useState<\n    string | null\n  >(null);\n  const [selectedAreaRelatedIds, setSelectedAreaRelatedIds] = useState<\n    string[]\n  >([]);\n  const [selectedSubjectId, setSelectedSubjectId] = useState<string | null>(\n    null\n  );\n  const [simulatedViewTab, setSimulatedViewTab] = useState<SimulatedViewTab>(\n    SimulatedViewTab.STUDENTS\n  );\n\n  // === Estados de Modais ===\n  const [isStudentModalOpen, setIsStudentModalOpen] = useState(false);\n  const [selectedStudent, setSelectedStudent] = useState<{\n    userInstitutionId: string;\n    name: string;\n  } | null>(null);\n\n  const [isContentModalOpen, setIsContentModalOpen] = useState(false);\n  const [selectedContent, setSelectedContent] = useState<{\n    contentId: string;\n    contentName: string;\n  } | null>(null);\n\n  const [isFiltersModalOpen, setIsFiltersModalOpen] = useState(false);\n\n  // === Filtros ===\n  const [filters, setFilters] = useState<SimulatedFilters>({\n    schoolIds: [],\n    schoolYearIds: [],\n    classIds: [],\n    studentsIds: [],\n  });\n\n  // === Refs para evitar closure issues ===\n  const selectedAreaKnowledgeIdRef = useRef<string | null>(\n    selectedAreaKnowledgeId\n  );\n  const selectedSubjectIdRef = useRef<string | null>(selectedSubjectId);\n  const filtersRef = useRef<SimulatedFilters>(filters);\n  const simulatedViewTabRef = useRef<SimulatedViewTab>(simulatedViewTab);\n  const scoreTypeRef = useRef<ScoreType>(scoreType);\n  const periodRef = useRef<StudentsHighlightPeriod>(period);\n  const aggregationTypeRef = useRef(aggregationType);\n\n  // Keep refs in sync\n  useEffect(() => {\n    selectedAreaKnowledgeIdRef.current = selectedAreaKnowledgeId;\n  }, [selectedAreaKnowledgeId]);\n\n  useEffect(() => {\n    selectedSubjectIdRef.current = selectedSubjectId;\n  }, [selectedSubjectId]);\n\n  useEffect(() => {\n    filtersRef.current = filters;\n  }, [filters]);\n\n  useEffect(() => {\n    simulatedViewTabRef.current = simulatedViewTab;\n  }, [simulatedViewTab]);\n\n  useEffect(() => {\n    scoreTypeRef.current = scoreType;\n  }, [scoreType]);\n\n  useEffect(() => {\n    periodRef.current = period;\n  }, [period]);\n\n  useEffect(() => {\n    aggregationTypeRef.current = aggregationType;\n  }, [aggregationType]);\n\n  // === Hooks de API ===\n  const {\n    data: generalOverviewData,\n    loading: generalOverviewLoading,\n    error: generalOverviewError,\n    fetchOverview: fetchGeneralOverview,\n  } = useGeneralOverview(api);\n\n  // Aggregated overview based on profile (classes/municipalities/students)\n  const {\n    data: aggregatedData,\n    loading: aggregatedLoading,\n    isRefreshing: aggregatedRefreshing,\n    error: aggregatedError,\n    fetchOverview: fetchAggregatedOverview,\n  } = useAggregatedOverview(api);\n\n  // Paginated students overview for table\n  const {\n    data: simulatedData,\n    loading: simulatedLoading,\n    isRefreshing: simulatedRefreshing,\n    error: simulatedError,\n    fetchOverview: fetchSimulatedOverview,\n  } = useSimulatedOverview(api);\n\n  const {\n    data: contentsData,\n    loading: contentsLoading,\n    isRefreshing: contentsRefreshing,\n    error: contentsError,\n    fetchContents,\n  } = useSimulatedContents(api);\n\n  // === Valores derivados ===\n  const isEssaySelected = selectedAreaKnowledgeId === ESSAY_AREA_ID;\n\n  const activeFiltersCount = useMemo(() => {\n    let count = 0;\n    if (filters.schoolIds.length > 0) count++;\n    if (filters.schoolYearIds.length > 0) count++;\n    if (filters.classIds.length > 0) count++;\n    if (filters.studentsIds.length > 0) count++;\n    return count;\n  }, [filters]);\n\n  // Sync selectedAreaRelatedIds when generalOverviewData is refreshed\n  useEffect(() => {\n    if (!selectedAreaKnowledgeId || !generalOverviewData?.areas) {\n      return;\n    }\n    const area = generalOverviewData.areas.find(\n      (a) => a.id === selectedAreaKnowledgeId\n    );\n    const relatedIds = area?.relatedIds ?? [selectedAreaKnowledgeId];\n    setSelectedAreaRelatedIds(relatedIds);\n  }, [generalOverviewData, selectedAreaKnowledgeId]);\n\n  // === Colunas das Tabelas (memoizadas) ===\n  const studentsTableColumns = useMemo(\n    (): ColumnConfig<SimulatedStudentItem>[] =>\n      simulatedTableColumnsBase.map((col) => {\n        if (col.key === 'average') {\n          return {\n            ...col,\n            render: (_value: unknown, row: SimulatedStudentItem) =>\n              formatScore(row.average, scoreType),\n          };\n        }\n        if (col.key === 'performance') {\n          return {\n            ...col,\n            render: (_value: unknown, row: SimulatedStudentItem) => (\n              <SimulatedPerformanceTagCell row={row} />\n            ),\n          };\n        }\n        return col as ColumnConfig<SimulatedStudentItem>;\n      }),\n    [scoreType]\n  );\n\n  // === Funções de Carregamento ===\n  const loadStudentsData = useCallback(\n    async (\n      areaKnowledgeId: string | null,\n      subjectId: string | null,\n      page = 1,\n      refresh = false,\n      periodOverride?: StudentsHighlightPeriod,\n      scoreTypeOverride?: ScoreType\n    ) => {\n      const currentFilters = filtersRef.current;\n      const currentPeriod = periodOverride ?? periodRef.current;\n      const currentScoreType = scoreTypeOverride ?? scoreTypeRef.current;\n      const isEssay = areaKnowledgeId === ESSAY_AREA_ID;\n\n      const effectiveSubjectId =\n        !isEssay && subjectId && subjectId !== 'all' ? subjectId : undefined;\n      const effectiveAreaKnowledgeId =\n        !isEssay && areaKnowledgeId && areaKnowledgeId !== 'all'\n          ? areaKnowledgeId\n          : undefined;\n\n      await fetchSimulatedOverview(\n        {\n          simulationType: isEssay ? 'essays' : 'enem-1',\n          period: currentPeriod,\n          subjectId: effectiveSubjectId,\n          areaKnowledgeId: effectiveAreaKnowledgeId,\n          schoolIds: currentFilters.schoolIds,\n          schoolYearIds: currentFilters.schoolYearIds,\n          classIds: currentFilters.classIds,\n          studentsIds: currentFilters.studentsIds,\n          page,\n          limit: 10,\n          orderBy: 'name',\n          order: 'asc',\n          scoreType: currentScoreType,\n        },\n        refresh\n      );\n    },\n    [fetchSimulatedOverview]\n  );\n\n  const loadSkillsData = useCallback(\n    async (\n      areaKnowledgeId: string | null,\n      subjectId: string | null,\n      periodOverride?: StudentsHighlightPeriod,\n      scoreTypeOverride?: ScoreType\n    ) => {\n      // Essays não têm conteúdos/habilidades\n      if (areaKnowledgeId === ESSAY_AREA_ID) {\n        return;\n      }\n\n      const currentFilters = filtersRef.current;\n      const currentPeriod = periodOverride ?? periodRef.current;\n      const currentScoreType = scoreTypeOverride ?? scoreTypeRef.current;\n\n      const effectiveSubjectId =\n        subjectId && subjectId !== 'all' ? subjectId : undefined;\n      const effectiveAreaKnowledgeId =\n        areaKnowledgeId && areaKnowledgeId !== 'all'\n          ? areaKnowledgeId\n          : undefined;\n\n      await fetchContents({\n        simulationType: 'enem-1',\n        period: currentPeriod,\n        subjectId: effectiveSubjectId,\n        areaKnowledgeId: effectiveAreaKnowledgeId,\n        schoolIds: currentFilters.schoolIds,\n        schoolYearIds: currentFilters.schoolYearIds,\n        classIds: currentFilters.classIds,\n        studentsIds: currentFilters.studentsIds,\n        page: 1,\n        limit: 10,\n        orderBy: 'correctPercentage',\n        order: 'asc',\n        scoreType: currentScoreType,\n      });\n    },\n    [fetchContents]\n  );\n\n  const loadGeneralOverviewData = useCallback(\n    async (\n      periodOverride?: StudentsHighlightPeriod,\n      scoreTypeOverride?: ScoreType\n    ) => {\n      const currentFilters = filtersRef.current;\n      const currentScoreType = scoreTypeOverride ?? scoreTypeRef.current;\n\n      await fetchGeneralOverview({\n        period: periodOverride ?? periodRef.current,\n        schoolIds: currentFilters.schoolIds,\n        schoolYearIds: currentFilters.schoolYearIds,\n        classIds: currentFilters.classIds,\n        studentsIds: currentFilters.studentsIds,\n        scoreType: currentScoreType,\n      });\n    },\n    [fetchGeneralOverview]\n  );\n\n  /**\n   * Load aggregated overview data based on profile (classes/municipalities/students)\n   */\n  const loadAggregatedOverviewData = useCallback(\n    async (\n      areaKnowledgeId: string | null,\n      subjectId: string | null,\n      refresh = false,\n      periodOverride?: StudentsHighlightPeriod,\n      scoreTypeOverride?: ScoreType\n    ) => {\n      const currentFilters = filtersRef.current;\n      const currentPeriod = periodOverride ?? periodRef.current;\n      const currentScoreType = scoreTypeOverride ?? scoreTypeRef.current;\n      const currentAggregationType = aggregationTypeRef.current;\n      const isEssay = areaKnowledgeId === ESSAY_AREA_ID;\n\n      const effectiveSubjectId =\n        !isEssay && subjectId && subjectId !== 'all' ? subjectId : undefined;\n      const effectiveAreaKnowledgeId =\n        !isEssay && areaKnowledgeId && areaKnowledgeId !== 'all'\n          ? areaKnowledgeId\n          : undefined;\n\n      await fetchAggregatedOverview(\n        {\n          aggregationType: currentAggregationType,\n          simulationType: isEssay ? 'essays' : 'enem-1',\n          period: currentPeriod,\n          subjectId: effectiveSubjectId,\n          areaKnowledgeId: effectiveAreaKnowledgeId,\n          schoolIds: currentFilters.schoolIds,\n          schoolYearIds: currentFilters.schoolYearIds,\n          classIds: currentFilters.classIds,\n          studentsIds: currentFilters.studentsIds,\n          scoreType: currentScoreType,\n        },\n        refresh\n      );\n    },\n    [fetchAggregatedOverview]\n  );\n\n  // === Handlers ===\n  const handlePeriodChange = useCallback(\n    (value: string) => {\n      const newPeriod = value as StudentsHighlightPeriod;\n      if (newPeriod === periodRef.current) {\n        return;\n      }\n      const effectiveScoreType = scoreTypeRef.current;\n\n      setSearchParams((prev) => {\n        const newParams = new URLSearchParams(prev);\n        if (newPeriod === '1_MONTH') {\n          newParams.delete('period');\n        } else {\n          newParams.set('period', newPeriod);\n        }\n        if (effectiveScoreType === 'percentage') {\n          newParams.delete('scoreType');\n        } else {\n          newParams.set('scoreType', effectiveScoreType);\n        }\n        return newParams;\n      });\n\n      // Reload aggregated overview\n      loadAggregatedOverviewData(\n        selectedAreaKnowledgeIdRef.current,\n        selectedSubjectIdRef.current,\n        false,\n        newPeriod,\n        effectiveScoreType\n      );\n\n      // Reload data with new period\n      if (simulatedViewTabRef.current === SimulatedViewTab.STUDENTS) {\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current,\n          1,\n          false,\n          newPeriod,\n          effectiveScoreType\n        );\n      } else {\n        loadSkillsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current,\n          newPeriod,\n          effectiveScoreType\n        );\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current,\n          1,\n          false,\n          newPeriod,\n          effectiveScoreType\n        );\n      }\n      loadGeneralOverviewData(newPeriod, effectiveScoreType);\n    },\n    [\n      setSearchParams,\n      loadStudentsData,\n      loadSkillsData,\n      loadGeneralOverviewData,\n      loadAggregatedOverviewData,\n    ]\n  );\n\n  const handleScoreTypeChange = useCallback(\n    (value: string) => {\n      const newScoreType = value as ScoreType;\n      if (newScoreType === scoreTypeRef.current) {\n        return;\n      }\n      const effectivePeriod = periodRef.current;\n      setSearchParams((prev) => {\n        const newParams = new URLSearchParams(prev);\n        if (effectivePeriod === '1_MONTH') {\n          newParams.delete('period');\n        } else {\n          newParams.set('period', effectivePeriod);\n        }\n        if (newScoreType === 'percentage') {\n          newParams.delete('scoreType');\n        } else {\n          newParams.set('scoreType', newScoreType);\n        }\n        return newParams;\n      });\n    },\n    [setSearchParams]\n  );\n\n  const handleAreaKnowledgeChange = useCallback(\n    (areaId: string | null) => {\n      if (areaId === selectedAreaKnowledgeIdRef.current) {\n        return;\n      }\n\n      // Find the area to get relatedIds (for merged areas with same name)\n      const area = generalOverviewData?.areas.find((a) => a.id === areaId);\n      const relatedIds = area?.relatedIds ?? (areaId ? [areaId] : []);\n\n      setSelectedAreaKnowledgeId(areaId);\n      setSelectedAreaRelatedIds(relatedIds);\n      setSelectedSubjectId(null);\n      setSimulatedViewTab(SimulatedViewTab.STUDENTS);\n\n      loadAggregatedOverviewData(areaId, null);\n      loadStudentsData(areaId, null);\n    },\n    [loadStudentsData, loadAggregatedOverviewData, generalOverviewData]\n  );\n\n  const handleSubjectChange = useCallback(\n    (subjectId: string | null) => {\n      const effectiveSubjectId =\n        subjectId === 'all' || subjectId === null ? null : subjectId;\n      if (effectiveSubjectId === selectedSubjectIdRef.current) {\n        return;\n      }\n\n      setSelectedSubjectId(effectiveSubjectId);\n\n      // Always reload aggregated overview\n      loadAggregatedOverviewData(\n        selectedAreaKnowledgeIdRef.current,\n        effectiveSubjectId\n      );\n\n      if (simulatedViewTabRef.current === SimulatedViewTab.STUDENTS) {\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          effectiveSubjectId\n        );\n      } else {\n        loadSkillsData(selectedAreaKnowledgeIdRef.current, effectiveSubjectId);\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          effectiveSubjectId\n        );\n      }\n    },\n    [loadStudentsData, loadSkillsData, loadAggregatedOverviewData]\n  );\n\n  const handleViewTabChange = useCallback(\n    (value: string) => {\n      const newTab = value as SimulatedViewTab;\n\n      if (newTab === simulatedViewTabRef.current) {\n        return;\n      }\n\n      setSimulatedViewTab(newTab);\n\n      if (newTab === SimulatedViewTab.STUDENTS) {\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current\n        );\n      } else {\n        loadSkillsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current\n        );\n      }\n    },\n    [loadStudentsData, loadSkillsData]\n  );\n\n  const handleFiltersApply = useCallback(\n    (newFilters: SimulatedFilters) => {\n      // Atualizar ref ANTES para que as funções de load usem os novos valores\n      filtersRef.current = newFilters;\n      setFilters(newFilters);\n\n      // Reload aggregated overview\n      loadAggregatedOverviewData(\n        selectedAreaKnowledgeIdRef.current,\n        selectedSubjectIdRef.current\n      );\n\n      if (simulatedViewTabRef.current === SimulatedViewTab.STUDENTS) {\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current\n        );\n      } else {\n        loadSkillsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current\n        );\n        loadStudentsData(\n          selectedAreaKnowledgeIdRef.current,\n          selectedSubjectIdRef.current\n        );\n      }\n      loadGeneralOverviewData();\n    },\n    [\n      loadStudentsData,\n      loadSkillsData,\n      loadGeneralOverviewData,\n      loadAggregatedOverviewData,\n    ]\n  );\n\n  const handleStudentsParamsChange = useCallback(\n    (params: Record<string, unknown>) => {\n      const newPage = params.page as number;\n      const sortBy = params.sortBy as string;\n      const sortOrder = params.sortOrder as string;\n\n      const sortByMap: Record<string, string> = {\n        name: 'name',\n        school: 'school',\n        schoolYear: 'schoolYear',\n        class: 'class',\n        average: 'average',\n        performance: 'performance',\n      };\n\n      const orderBy = sortBy ? (sortByMap[sortBy] ?? 'name') : 'name';\n      const order = sortOrder === 'desc' ? 'desc' : 'asc';\n      const currentAreaKnowledgeId = selectedAreaKnowledgeIdRef.current;\n      const currentSubjectId = selectedSubjectIdRef.current;\n      const isEssay = currentAreaKnowledgeId === ESSAY_AREA_ID;\n\n      const effectiveSubjectId =\n        !isEssay && currentSubjectId && currentSubjectId !== 'all'\n          ? currentSubjectId\n          : undefined;\n      const effectiveAreaKnowledgeId =\n        !isEssay && currentAreaKnowledgeId && currentAreaKnowledgeId !== 'all'\n          ? currentAreaKnowledgeId\n          : undefined;\n\n      fetchSimulatedOverview(\n        {\n          simulationType: isEssay ? 'essays' : 'enem-1',\n          period: periodRef.current,\n          subjectId: effectiveSubjectId,\n          areaKnowledgeId: effectiveAreaKnowledgeId,\n          schoolIds: filtersRef.current.schoolIds,\n          schoolYearIds: filtersRef.current.schoolYearIds,\n          classIds: filtersRef.current.classIds,\n          studentsIds: filtersRef.current.studentsIds,\n          page: newPage ?? 1,\n          limit: 10,\n          orderBy,\n          order,\n          scoreType: scoreTypeRef.current,\n        },\n        true\n      );\n    },\n    [fetchSimulatedOverview]\n  );\n\n  const handleContentsParamsChange = useCallback(\n    (params: Record<string, unknown>) => {\n      if (selectedAreaKnowledgeIdRef.current === ESSAY_AREA_ID) {\n        return;\n      }\n\n      const newPage = params.page as number;\n      const newLimit = params.limit as number;\n      const sortBy = params.sortBy as string;\n      const sortOrder = params.sortOrder as string;\n\n      const sortByMap: Record<string, string> = {\n        contentName: 'contentName',\n        simulatedExamsCount: 'simulatedExamsCount',\n        questionsCount: 'questionsCount',\n        studentsCount: 'studentsCount',\n        performance: 'correctPercentage',\n      };\n\n      const orderBy = sortBy\n        ? (sortByMap[sortBy] ?? 'correctPercentage')\n        : 'correctPercentage';\n      const order = sortOrder === 'desc' ? 'desc' : 'asc';\n\n      const currentSubjectId = selectedSubjectIdRef.current;\n      const currentAreaKnowledgeId = selectedAreaKnowledgeIdRef.current;\n      const effectiveSubjectId =\n        currentSubjectId && currentSubjectId !== 'all'\n          ? currentSubjectId\n          : undefined;\n      const effectiveAreaKnowledgeId =\n        currentAreaKnowledgeId && currentAreaKnowledgeId !== 'all'\n          ? currentAreaKnowledgeId\n          : undefined;\n\n      fetchContents({\n        simulationType: 'enem-1',\n        period: periodRef.current,\n        subjectId: effectiveSubjectId,\n        areaKnowledgeId: effectiveAreaKnowledgeId,\n        schoolIds: filtersRef.current.schoolIds,\n        schoolYearIds: filtersRef.current.schoolYearIds,\n        classIds: filtersRef.current.classIds,\n        studentsIds: filtersRef.current.studentsIds,\n        page: newPage ?? 1,\n        limit: newLimit ?? 10,\n        orderBy,\n        order,\n        scoreType: scoreTypeRef.current,\n      });\n    },\n    [fetchContents]\n  );\n\n  const handleStudentRowClick = useCallback((row: SimulatedStudentItem) => {\n    setSelectedStudent({\n      userInstitutionId: row.userInstitutionId,\n      name: row.name,\n    });\n    setIsStudentModalOpen(true);\n  }, []);\n\n  const handleContentRowClick = useCallback((row: SimulatedContentItem) => {\n    setSelectedContent({\n      contentId: row.contentId,\n      contentName: row.contentName,\n    });\n    setIsContentModalOpen(true);\n  }, []);\n\n  // === Carregamento inicial ===\n  const initialLoadRef = useRef(false);\n  const hasInitialLoadCompleted = useRef(false);\n\n  useEffect(() => {\n    // Skip if hook is disabled (e.g., not on simulated report)\n    if (!enabled) return;\n    if (initialLoadRef.current) return;\n    initialLoadRef.current = true;\n\n    // Load aggregated overview (based on profile)\n    loadAggregatedOverviewData(null, null);\n    // Load paginated students for table\n    loadStudentsData(null, null);\n    loadGeneralOverviewData();\n\n    // Set after microtask to prevent scoreType effect from firing on mount\n    Promise.resolve().then(() => {\n      hasInitialLoadCompleted.current = true;\n    });\n  }, [\n    enabled,\n    loadStudentsData,\n    loadGeneralOverviewData,\n    loadAggregatedOverviewData,\n  ]);\n\n  // === Recarregar quando scoreType muda ===\n  useEffect(() => {\n    // Skip if hook is disabled\n    if (!enabled) return;\n    if (!hasInitialLoadCompleted.current) return;\n\n    // Always reload aggregated overview\n    loadAggregatedOverviewData(\n      selectedAreaKnowledgeIdRef.current,\n      selectedSubjectIdRef.current\n    );\n\n    if (simulatedViewTabRef.current === SimulatedViewTab.STUDENTS) {\n      loadStudentsData(\n        selectedAreaKnowledgeIdRef.current,\n        selectedSubjectIdRef.current\n      );\n    } else {\n      loadSkillsData(\n        selectedAreaKnowledgeIdRef.current,\n        selectedSubjectIdRef.current\n      );\n      loadStudentsData(\n        selectedAreaKnowledgeIdRef.current,\n        selectedSubjectIdRef.current\n      );\n    }\n    loadGeneralOverviewData();\n  }, [\n    enabled,\n    scoreType,\n    loadStudentsData,\n    loadSkillsData,\n    loadGeneralOverviewData,\n    loadAggregatedOverviewData,\n  ]);\n\n  // === Recarregar quando aggregationType muda (perfil carregado após mount) ===\n  const previousAggregationTypeRef = useRef(aggregationType);\n  useEffect(() => {\n    // Skip if hook is disabled\n    if (!enabled) return;\n    // Skip if aggregationType hasn't actually changed\n    if (previousAggregationTypeRef.current === aggregationType) return;\n    previousAggregationTypeRef.current = aggregationType;\n\n    // Skip if initial load hasn't completed\n    if (!hasInitialLoadCompleted.current) return;\n\n    // Reload aggregated overview with new aggregation type\n    loadAggregatedOverviewData(\n      selectedAreaKnowledgeIdRef.current,\n      selectedSubjectIdRef.current\n    );\n  }, [enabled, aggregationType, loadAggregatedOverviewData]);\n\n  return {\n    // Query Params\n    period,\n    scoreType,\n\n    // Estados de Seleção\n    selectedAreaKnowledgeId,\n    selectedAreaRelatedIds,\n    selectedSubjectId,\n    simulatedViewTab,\n    isEssaySelected,\n\n    // Filtros\n    filters,\n    activeFiltersCount,\n\n    // Aggregation Type\n    aggregationType,\n\n    // Dados da API\n    generalOverview: {\n      data: generalOverviewData,\n      loading: generalOverviewLoading,\n      error: generalOverviewError,\n    },\n    aggregatedOverview: {\n      data: aggregatedData,\n      loading: aggregatedLoading,\n      isRefreshing: aggregatedRefreshing,\n      error: aggregatedError,\n    },\n    studentsOverview: {\n      data: simulatedData,\n      loading: simulatedLoading,\n      isRefreshing: simulatedRefreshing,\n      error: simulatedError,\n    },\n    contentsPerformance: {\n      data: contentsData,\n      loading: contentsLoading,\n      isRefreshing: contentsRefreshing,\n      error: contentsError,\n    },\n\n    // Handlers\n    handlePeriodChange,\n    handleScoreTypeChange,\n    handleAreaKnowledgeChange,\n    handleSubjectChange,\n    handleViewTabChange,\n    handleFiltersApply,\n    handleStudentsParamsChange,\n    handleContentsParamsChange,\n    handleStudentRowClick,\n    handleContentRowClick,\n\n    // Modais\n    studentModal: {\n      isOpen: isStudentModalOpen,\n      student: selectedStudent,\n      close: () => {\n        setIsStudentModalOpen(false);\n        setSelectedStudent(null);\n      },\n    },\n    contentModal: {\n      isOpen: isContentModalOpen,\n      content: selectedContent,\n      close: () => {\n        setIsContentModalOpen(false);\n        setSelectedContent(null);\n      },\n    },\n    filtersModal: {\n      isOpen: isFiltersModalOpen,\n      open: () => setIsFiltersModalOpen(true),\n      close: () => setIsFiltersModalOpen(false),\n    },\n\n    // Colunas das Tabelas\n    studentsTableColumns,\n    contentsTableColumns,\n  };\n}\n","import Text from '../Text/Text';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport { SkeletonRounded } from '../Skeleton/Skeleton';\nimport IconRender from '../IconRender/IconRender';\nimport { formatScore, hexToRgba } from '../../utils/utils';\nimport { ScoreType } from '../../types/common';\nimport {\n  type GeneralOverviewSectionProps,\n  type AreaKnowledgePerformance,\n  type EssayPerformance,\n} from './types';\n\n/**\n * Area knowledge card component\n * Uses color and icon from API data\n */\nfunction AreaCard({\n  area,\n  scoreType = ScoreType.PERCENTAGE,\n}: {\n  readonly area: AreaKnowledgePerformance;\n  readonly scoreType?: ScoreType;\n}) {\n  const bgColor = hexToRgba(area.color, 0.1);\n\n  return (\n    <div\n      className=\"flex-1 min-w-0 flex flex-col items-center justify-center p-4 rounded-xl\"\n      style={{ backgroundColor: bgColor }}\n    >\n      {/* Icon with rounded background */}\n      <div\n        className=\"w-8 h-8 flex items-center justify-center rounded-full mb-2\"\n        style={{ backgroundColor: area.color }}\n      >\n        <IconRender iconName={area.icon} size={18} color=\"white\" />\n      </div>\n\n      {/* Full name (uppercase, smaller) */}\n      <Text\n        size=\"xs\"\n        weight=\"semibold\"\n        className=\"text-center uppercase text-text-700 mb-1 line-clamp-2\"\n      >\n        {area.name}\n      </Text>\n\n      {/* Score (percentage or TRI) */}\n      <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n        {formatScore(area.percentage, scoreType)}\n      </Text>\n    </div>\n  );\n}\n\n/**\n * Essay card component\n * Displays essay performance using color and icon from API\n * Note: Essays always use percentage, TRI doesn't apply to essays\n */\nfunction EssayCard({ essay }: { readonly essay: EssayPerformance }) {\n  const bgColor = hexToRgba(essay.color, 0.1);\n\n  return (\n    <div\n      className=\"flex-1 min-w-0 flex flex-col items-center justify-center p-4 rounded-xl\"\n      style={{ backgroundColor: bgColor }}\n    >\n      {/* Icon with rounded background */}\n      <div\n        className=\"w-8 h-8 flex items-center justify-center rounded-full mb-2\"\n        style={{ backgroundColor: essay.color }}\n      >\n        <IconRender iconName={essay.icon} size={18} color=\"white\" />\n      </div>\n\n      {/* Name (uppercase, smaller) */}\n      <Text\n        size=\"xs\"\n        weight=\"semibold\"\n        className=\"text-center uppercase text-text-700 mb-1 line-clamp-2\"\n      >\n        {essay.name}\n      </Text>\n\n      {/* Percentage large - Essays always use percentage */}\n      <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n        {formatScore(essay.percentage, ScoreType.PERCENTAGE)}\n      </Text>\n    </div>\n  );\n}\n\n/**\n * Skeleton loader for area cards\n */\nfunction AreaCardSkeleton() {\n  return (\n    <div className=\"flex-1 min-w-0 flex flex-col items-center justify-center p-4 rounded-xl bg-background-50\">\n      <SkeletonRounded className=\"h-8 w-8 rounded-full mb-2\" />\n      <SkeletonRounded className=\"h-3 w-16 mb-1\" />\n      <SkeletonRounded className=\"h-6 w-12\" />\n    </div>\n  );\n}\n\n/**\n * GeneralOverviewSection - General overview section for simulated exams\n *\n * Displays overall proficiency percentage and performance by area of knowledge.\n * Uses color and icon directly from API data for each area.\n * This section is independent of areaKnowledgeId and subjectId filters -\n * it always shows consolidated data across all simulated exams.\n *\n * @example\n * ```tsx\n * const { data, loading, error, fetchOverview } = useGeneralOverview(api);\n *\n * <GeneralOverviewSection\n *   data={data}\n *   loading={loading}\n *   error={error}\n *   scoreType=\"tri\"\n * />\n * ```\n */\nexport function GeneralOverviewSection({\n  data,\n  loading = false,\n  error = null,\n  scoreType = ScoreType.PERCENTAGE,\n}: Readonly<GeneralOverviewSectionProps>) {\n  if (error) {\n    return (\n      <div className=\"p-4 bg-error-50 border border-error-200 rounded-xl\">\n        <Text size=\"sm\" className=\"text-error-700\">\n          {error}\n        </Text>\n      </div>\n    );\n  }\n\n  if (loading) {\n    return (\n      <div className=\"space-y-4 p-5 bg-background border border-border-50 rounded-xl\">\n        {/* Header */}\n        <div className=\"space-y-1\">\n          <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n            Geral\n          </Text>\n          <SkeletonRounded className=\"h-4 w-3/4\" />\n        </div>\n\n        {/* Overall progress skeleton */}\n        <div className=\"flex items-center gap-4\">\n          <div className=\"flex-1\">\n            <SkeletonRounded className=\"h-3 w-full rounded-full\" />\n          </div>\n          <SkeletonRounded className=\"h-6 w-12\" />\n        </div>\n\n        {/* Area cards skeleton */}\n        <div className=\"flex gap-3\">\n          {[1, 2, 3, 4, 5].map((i) => (\n            <AreaCardSkeleton key={i} />\n          ))}\n        </div>\n      </div>\n    );\n  }\n\n  if (!data) {\n    return null;\n  }\n\n  return (\n    <div className=\"space-y-4 p-5 bg-background border border-border-50 rounded-xl\">\n      {/* Header with description */}\n      <div className=\"space-y-1\">\n        <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n          Geral\n        </Text>\n        <Text size=\"sm\" className=\"text-text-500\">\n          Dados que mostram a proficiência de todos os simulados digitais já\n          realizados em todas as áreas do conhecimento\n        </Text>\n      </div>\n\n      {/* Overall progress bar */}\n      <div className=\"flex items-center gap-4\">\n        <div className=\"flex-1\">\n          <ProgressBar\n            value={\n              scoreType === ScoreType.TRI\n                ? data.overallPercentage / 10\n                : data.overallPercentage\n            }\n            variant=\"green\"\n            size=\"small\"\n          />\n        </div>\n        <Text\n          size=\"lg\"\n          weight=\"bold\"\n          className=\"text-text-950 min-w-[50px] text-right\"\n        >\n          {formatScore(data.overallPercentage, scoreType)}\n        </Text>\n      </div>\n\n      {/* Area knowledge cards + Essay card - flex to fill 100% equally */}\n      {(data.areas.length > 0 || data.essay) && (\n        <div className=\"flex gap-3\">\n          {data.areas.map((area) => (\n            <AreaCard key={area.id} area={area} scoreType={scoreType} />\n          ))}\n          {data.essay && <EssayCard essay={data.essay} />}\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default GeneralOverviewSection;\n","import { useState, useCallback, useRef } from 'react';\nimport type { BaseApiClient } from '../../types/api';\nimport type {\n  GeneralOverviewParams,\n  GeneralOverviewApiResponse,\n  UseGeneralOverviewState,\n  UseGeneralOverviewReturn,\n} from './types';\n\n/**\n * Initial state for the hook\n */\nconst initialState: UseGeneralOverviewState = {\n  data: null,\n  loading: false,\n  isRefreshing: false,\n  error: null,\n};\n\n/**\n * Hook for fetching general overview data for simulated exams\n *\n * Receives the API client and calls the endpoint directly.\n * Endpoint: POST /performance/simulated/general-overview\n *\n * @param api - API client instance (axios-like)\n * @returns Hook state and methods\n *\n * @example\n * ```tsx\n * import api from '@/services/apiService';\n *\n * const { data, loading, error, fetchOverview } = useGeneralOverview(api);\n *\n * useEffect(() => {\n *   fetchOverview({\n *     period: '1_MONTH',\n *     schoolIds: ['school-id'],\n *     scoreType: 'tri',\n *   });\n * }, []);\n * ```\n */\nexport function useGeneralOverview(\n  api: BaseApiClient\n): UseGeneralOverviewReturn {\n  const [state, setState] = useState<UseGeneralOverviewState>(initialState);\n  const requestIdRef = useRef(0);\n\n  /**\n   * Fetch general overview data\n   * @param params - Request parameters\n   * @param refresh - If true, sets isRefreshing instead of loading\n   */\n  const fetchOverview = useCallback(\n    async (params: GeneralOverviewParams, refresh = false) => {\n      const currentRequestId = ++requestIdRef.current;\n\n      // Set loading or refreshing state\n      setState((prev) => ({\n        ...prev,\n        loading: !refresh,\n        isRefreshing: refresh,\n        error: null,\n      }));\n\n      try {\n        // Build URL with optional scoreType query param\n        let url = '/performance/simulated/general-overview';\n        if (params.scoreType && params.scoreType !== 'percentage') {\n          url += `?scoreType=${params.scoreType}`;\n        }\n\n        // Build request body (excludes scoreType and studentsIds)\n        const body = {\n          period: params.period,\n          schoolIds: params.schoolIds || [],\n          schoolYearIds: params.schoolYearIds || [],\n          classIds: params.classIds || [],\n        };\n\n        const response = await api.post<GeneralOverviewApiResponse>(url, body);\n\n        // Ignore stale responses\n        if (currentRequestId !== requestIdRef.current) return;\n\n        setState({\n          data: response.data.data,\n          loading: false,\n          isRefreshing: false,\n          error: null,\n        });\n      } catch (err) {\n        // Ignore errors from stale requests\n        if (currentRequestId !== requestIdRef.current) return;\n\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : 'Erro ao carregar dados gerais de desempenho';\n\n        console.error('Error fetching general overview:', err);\n\n        setState((prev) => ({\n          ...prev,\n          loading: false,\n          isRefreshing: false,\n          error: errorMessage,\n        }));\n      }\n    },\n    [api]\n  );\n\n  /**\n   * Reset state to initial values\n   */\n  const reset = useCallback(() => {\n    // Invalidate any in-flight requests\n    requestIdRef.current++;\n    setState(initialState);\n  }, []);\n\n  return {\n    ...state,\n    fetchOverview,\n    reset,\n  };\n}\n\nexport default useGeneralOverview;\n","import { useState, useCallback, useRef } from 'react';\nimport type { BaseApiClient } from '../../types/api';\nimport type {\n  SimulatedOverviewData,\n  SimulatedOverviewParams,\n  SimulatedOverviewApiResponse,\n  UseSimulatedOverviewState,\n  UseSimulatedOverviewReturn,\n} from './types';\nimport {\n  simulationTypeToActivityFilters,\n  SimulationType,\n} from '../SimulatedStudentDetailsModal/types';\nimport { getErrorMessage } from './utils';\n\n/**\n * Body type for POST endpoints\n */\ninterface SimulatedOverviewBody {\n  period?: string;\n  subjectId?: string;\n  areaKnowledgeId?: string;\n  schoolIds?: string[];\n  schoolYearIds?: string[];\n  classIds?: string[];\n  studentsIds?: string[];\n  page?: number;\n  limit?: number;\n  orderBy?: string;\n  order?: 'asc' | 'desc';\n}\n\n/**\n * Build the API endpoint with activity filters and scoreType as query params\n */\nfunction buildEndpoint(\n  simulationType: SimulationType,\n  scoreType?: string\n): string {\n  // Essays still use the legacy endpoint since they don't have activity filters\n  if (simulationType === 'essays') {\n    const params = new URLSearchParams();\n    if (scoreType && scoreType !== 'percentage') {\n      params.append('scoreType', scoreType);\n    }\n    const queryString = params.toString();\n    const endpoint = '/performance/simulated/essays/students-overview';\n\n    if (!queryString) {\n      return endpoint;\n    }\n\n    return `${endpoint}?${queryString}`;\n  }\n\n  const activityFilters = simulationTypeToActivityFilters(simulationType);\n  const params = new URLSearchParams();\n\n  activityFilters.types?.forEach((t) => params.append('types', t));\n  // Note: subtypes are not sent - the backend filters by areaKnowledgeId/subjectId in the body\n  activityFilters.statuses?.forEach((s) => params.append('statuses', s));\n\n  // Add scoreType if not default (percentage)\n  if (scoreType && scoreType !== 'percentage') {\n    params.append('scoreType', scoreType);\n  }\n\n  const queryString = params.toString();\n  const endpoint = '/performance/simulated/activities/students-overview';\n\n  if (!queryString) {\n    return endpoint;\n  }\n\n  return `${endpoint}?${queryString}`;\n}\n\n/**\n * Initial state for the hook\n */\nconst initialState: UseSimulatedOverviewState = {\n  data: null,\n  loading: false,\n  isRefreshing: false,\n  error: null,\n};\n\n/**\n * Hook for fetching simulated exams overview data\n * Supports ENEM Prova 1, ENEM Prova 2, and Essays\n *\n * @param api - API client with post method\n *\n * @example\n * ```tsx\n * const { data, loading, error, fetchOverview } = useSimulatedOverview(api);\n *\n * fetchOverview({\n *   simulationType: 'enem-1',\n *   period: '1_MONTH',\n *   subjectId: 'subject-uuid',\n *   page: 1,\n *   limit: 10,\n * });\n * ```\n */\nexport function useSimulatedOverview(\n  api: BaseApiClient\n): UseSimulatedOverviewReturn {\n  const [data, setData] = useState<SimulatedOverviewData | null>(\n    initialState.data\n  );\n  const [loading, setLoading] = useState(initialState.loading);\n  const [isRefreshing, setIsRefreshing] = useState(initialState.isRefreshing);\n  const [error, setError] = useState<string | null>(initialState.error);\n\n  // Track request ID to ignore stale responses\n  const requestIdRef = useRef(0);\n\n  /**\n   * Convert params to POST body format\n   */\n  const paramsToBody = (\n    params: SimulatedOverviewParams\n  ): SimulatedOverviewBody => {\n    return {\n      period: params.period,\n      subjectId: params.subjectId,\n      areaKnowledgeId: params.areaKnowledgeId,\n      schoolIds: params.schoolIds,\n      schoolYearIds: params.schoolYearIds,\n      classIds: params.classIds,\n      studentsIds: params.studentsIds,\n      page: params.page ?? 1,\n      limit: params.limit ?? 10,\n      orderBy: params.orderBy ?? 'name',\n      order: params.order ?? 'asc',\n    };\n  };\n\n  const fetchOverview = useCallback(\n    async (params: SimulatedOverviewParams, refresh = false) => {\n      const currentRequestId = ++requestIdRef.current;\n\n      try {\n        if (refresh) {\n          setIsRefreshing(true);\n        } else {\n          setLoading(true);\n        }\n        setError(null);\n\n        const endpoint = buildEndpoint(params.simulationType, params.scoreType);\n        const body = paramsToBody(params);\n\n        const response = await api.post<SimulatedOverviewApiResponse>(\n          endpoint,\n          body\n        );\n\n        // Ignore stale responses\n        if (currentRequestId !== requestIdRef.current) return;\n\n        setData(response.data.data);\n      } catch (err) {\n        // Ignore errors from stale requests\n        if (currentRequestId !== requestIdRef.current) return;\n\n        setError(\n          getErrorMessage(\n            err,\n            'Não foi possível carregar os dados de simulados'\n          )\n        );\n      } finally {\n        // Only update loading state for current request\n        if (currentRequestId === requestIdRef.current) {\n          setLoading(false);\n          setIsRefreshing(false);\n        }\n      }\n    },\n    [api]\n  );\n\n  const reset = useCallback(() => {\n    // Invalidate any in-flight requests\n    requestIdRef.current++;\n    setData(initialState.data);\n    setLoading(initialState.loading);\n    setIsRefreshing(initialState.isRefreshing);\n    setError(initialState.error);\n  }, []);\n\n  return { data, loading, isRefreshing, error, fetchOverview, reset };\n}\n","import type { BaseApiClient } from '../../types/api';\n\n/**\n * Performance tag for simulated exams\n */\nexport enum SimulatedPerformanceTag {\n  HIGHLIGHT = 'HIGHLIGHT',\n  ABOVE_AVERAGE = 'ABOVE_AVERAGE',\n  BELOW_AVERAGE = 'BELOW_AVERAGE',\n  ATTENTION_POINT = 'ATTENTION_POINT',\n}\n\n/**\n * Tag config for display\n */\nexport enum SimulatedPerformanceTagVariant {\n  SUCCESS = 'success',\n  WARNING = 'warning',\n  ERROR = 'error',\n  INFO = 'info',\n}\n\n/**\n * Tag config for display\n */\nexport interface SimulatedPerformanceTagConfig {\n  label: string;\n  variant: SimulatedPerformanceTagVariant;\n}\n\n/**\n * Map performance to tag config\n */\nexport const SIMULATED_PERFORMANCE_TAG_CONFIG: Record<\n  SimulatedPerformanceTag,\n  SimulatedPerformanceTagConfig\n> = {\n  [SimulatedPerformanceTag.HIGHLIGHT]: {\n    label: 'Destaque da turma',\n    variant: SimulatedPerformanceTagVariant.SUCCESS,\n  },\n  [SimulatedPerformanceTag.ABOVE_AVERAGE]: {\n    label: 'Acima da média',\n    variant: SimulatedPerformanceTagVariant.INFO,\n  },\n  [SimulatedPerformanceTag.BELOW_AVERAGE]: {\n    label: 'Abaixo da média',\n    variant: SimulatedPerformanceTagVariant.WARNING,\n  },\n  [SimulatedPerformanceTag.ATTENTION_POINT]: {\n    label: 'Ponto de atenção',\n    variant: SimulatedPerformanceTagVariant.ERROR,\n  },\n};\n\n/**\n * Badge action enum for performance status indicators\n */\nexport enum PerformanceBadgeAction {\n  SUCCESS = 'success',\n  INFO = 'info',\n  WARNING = 'warning',\n  ERROR = 'error',\n}\n\n/**\n * Map performance tag to Badge action type\n */\nexport const PERFORMANCE_TAG_TO_BADGE_ACTION: Record<\n  SimulatedPerformanceTag,\n  PerformanceBadgeAction\n> = {\n  [SimulatedPerformanceTag.HIGHLIGHT]: PerformanceBadgeAction.SUCCESS,\n  [SimulatedPerformanceTag.ABOVE_AVERAGE]: PerformanceBadgeAction.INFO,\n  [SimulatedPerformanceTag.BELOW_AVERAGE]: PerformanceBadgeAction.WARNING,\n  [SimulatedPerformanceTag.ATTENTION_POINT]: PerformanceBadgeAction.ERROR,\n};\n\n/**\n * Simulation type used in reports\n */\nexport enum ReportSimulationType {\n  ENEM_1 = 'enem-1',\n  ENEM_2 = 'enem-2',\n  ESSAYS = 'essays',\n}\n\n/**\n * Backward-compatible simulation type alias\n */\nexport type SimulationType = `${ReportSimulationType}`;\n\n/**\n * Student info for details modal\n */\nexport interface StudentDetailsInfo {\n  studentId: string;\n  institutionId: string;\n  name: string;\n  school: string;\n  schoolYear: string;\n  class: string;\n  average: number;\n  performance: SimulatedPerformanceTag;\n}\n\n/**\n * Subject performance item (level 1)\n */\nexport interface SubjectPerformanceItem {\n  id: string;\n  name: string;\n  color: string | null;\n  icon: string | null;\n  questionsCount: number;\n  performance: {\n    correct: number;\n    incorrect: number;\n    correctPercentage: number;\n  };\n}\n\n/**\n * Content performance item (level 2)\n */\nexport interface StudentContentPerformanceItem {\n  contentId: string;\n  contentName: string;\n  bnccCode: string | null;\n  questionsCount: number;\n  performance: {\n    correct: number;\n    incorrect: number;\n    correctPercentage: number;\n  };\n}\n\n/**\n * Response data when subjectId is null (list of subjects)\n */\nexport interface StudentSubjectsData {\n  student: StudentDetailsInfo;\n  subjects: SubjectPerformanceItem[];\n  page: number;\n  limit: number;\n  total: number;\n}\n\n/**\n * Response data when subjectId is provided (list of contents)\n */\nexport interface StudentContentsData {\n  student: StudentDetailsInfo;\n  subject: {\n    id: string;\n    name: string;\n  };\n  contents: StudentContentPerformanceItem[];\n  page: number;\n  limit: number;\n  total: number;\n}\n\n/**\n * Union type for student details response\n */\nexport type StudentDetailsData = StudentSubjectsData | StudentContentsData;\n\n/**\n * Type guard to check if data is StudentSubjectsData\n */\nexport function isStudentSubjectsData(\n  data: StudentDetailsData\n): data is StudentSubjectsData {\n  return 'subjects' in data;\n}\n\n/**\n * Type guard to check if data is StudentContentsData\n */\nexport function isStudentContentsData(\n  data: StudentDetailsData\n): data is StudentContentsData {\n  return 'contents' in data;\n}\n\n/**\n * Activity filters for endpoint\n */\nexport interface ActivityFilters {\n  types?: string[];\n  subtypes?: string[];\n  statuses?: string[];\n}\n\n/**\n * Convert SimulationType to ActivityFilters\n */\nexport function simulationTypeToActivityFilters(\n  simulationType: SimulationType\n): ActivityFilters {\n  switch (simulationType) {\n    case ReportSimulationType.ENEM_1:\n      return {\n        types: ['SIMULADO'],\n        subtypes: ['ENEM_PROVA_1'],\n      };\n    case ReportSimulationType.ENEM_2:\n      return {\n        types: ['SIMULADO'],\n        subtypes: ['ENEM_PROVA_2'],\n      };\n    default:\n      return {};\n  }\n}\n\n/**\n * Parameters for fetching student details\n */\nexport interface StudentDetailsParams {\n  simulationType: SimulationType;\n  userInstitutionId: string;\n  period: string;\n  subjectId?: string | null;\n  page?: number;\n  limit?: number;\n}\n\n/**\n * API response structure\n */\nexport interface StudentDetailsApiResponse {\n  message: string;\n  data: StudentDetailsData;\n}\n\n/**\n * Hook state\n */\nexport interface UseSimulatedStudentDetailsState {\n  data: StudentDetailsData | null;\n  loading: boolean;\n  error: string | null;\n}\n\n/**\n * Hook return type\n */\nexport interface UseSimulatedStudentDetailsReturn extends UseSimulatedStudentDetailsState {\n  fetchDetails: (params: StudentDetailsParams) => Promise<void>;\n  reset: () => void;\n}\n\n/**\n * Modal props\n */\nexport interface SimulatedStudentDetailsModalProps {\n  readonly api: BaseApiClient;\n  readonly isOpen: boolean;\n  readonly onClose: () => void;\n  readonly simulationType: SimulationType;\n  readonly userInstitutionId: string | null;\n  readonly studentName?: string;\n  readonly period: string;\n}\n","import type {\n  AggregatedOverviewData,\n  StudentsOnlyOverviewData,\n  ClassesOverviewData,\n  MunicipalitiesOverviewData,\n  OverviewAggregationType,\n} from './types';\n\n/**\n * Extract error message from an unknown error\n *\n * @param err - The caught error\n * @param fallbackMessage - Default message if error is not an Error instance\n * @returns The error message string\n */\nexport function getErrorMessage(err: unknown, fallbackMessage: string): string {\n  return err instanceof Error ? err.message : fallbackMessage;\n}\n\n/**\n * Type guard to check if data is StudentsOnlyOverviewData\n * Verifies both type parameter and data shape (absence of class/municipality-specific fields)\n */\nexport function isStudentsData(\n  data: AggregatedOverviewData | null,\n  type: OverviewAggregationType\n): data is StudentsOnlyOverviewData {\n  return (\n    type === 'students' &&\n    data !== null &&\n    !('totalClasses' in data) &&\n    !('totalMunicipalities' in data)\n  );\n}\n\n/**\n * Type guard to check if data is ClassesOverviewData\n * Verifies both type parameter and data shape (presence of totalClasses)\n */\nexport function isClassesData(\n  data: AggregatedOverviewData | null,\n  type: OverviewAggregationType\n): data is ClassesOverviewData {\n  return type === 'classes' && data !== null && 'totalClasses' in data;\n}\n\n/**\n * Type guard to check if data is MunicipalitiesOverviewData\n * Verifies both type parameter and data shape (presence of totalMunicipalities)\n */\nexport function isMunicipalitiesData(\n  data: AggregatedOverviewData | null,\n  type: OverviewAggregationType\n): data is MunicipalitiesOverviewData {\n  return (\n    type === 'municipalities' && data !== null && 'totalMunicipalities' in data\n  );\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { BaseApiClient } from '../../types/api';\nimport type {\n  AggregatedOverviewData,\n  AggregatedOverviewParams,\n  StudentsOverviewApiResponse,\n  ClassesOverviewApiResponse,\n  MunicipalitiesOverviewApiResponse,\n  UseAggregatedOverviewState,\n  UseAggregatedOverviewReturn,\n  OverviewAggregationType,\n} from './types';\nimport {\n  simulationTypeToActivityFilters,\n  SimulationType,\n} from '../SimulatedStudentDetailsModal/types';\nimport { getErrorMessage } from './utils';\n\n/**\n * Body type for POST endpoints\n */\ninterface AggregatedOverviewBody {\n  period?: string;\n  subjectId?: string;\n  areaKnowledgeId?: string;\n  schoolIds?: string[];\n  schoolYearIds?: string[];\n  classIds?: string[];\n  studentsIds?: string[];\n}\n\n/**\n * Build the API endpoint based on aggregation type\n */\nfunction buildEndpoint(\n  aggregationType: OverviewAggregationType,\n  simulationType: SimulationType,\n  scoreType?: string\n): string {\n  // Essays use the legacy endpoint\n  if (simulationType === 'essays') {\n    return '/performance/simulated/essays/students-overview';\n  }\n\n  const activityFilters = simulationTypeToActivityFilters(simulationType);\n  const params = new URLSearchParams();\n\n  // Add aggregationType as query param (unified endpoint)\n  params.append('aggregationType', aggregationType);\n\n  activityFilters.types?.forEach((t) => params.append('types', t));\n  activityFilters.statuses?.forEach((s) => params.append('statuses', s));\n\n  if (scoreType && scoreType !== 'percentage') {\n    params.append('scoreType', scoreType);\n  }\n\n  const basePath = '/performance/simulated/activities/overview';\n  return `${basePath}?${params.toString()}`;\n}\n\n/**\n * Initial state for the hook\n */\nconst initialState: UseAggregatedOverviewState = {\n  data: null,\n  loading: false,\n  isRefreshing: false,\n  error: null,\n};\n\n/**\n * Hook for fetching aggregated overview data (without students list)\n * Supports different aggregation types: students, classes, municipalities\n *\n * @param api - API client with post method\n *\n * @example\n * ```tsx\n * const { data, loading, error, fetchOverview } = useAggregatedOverview(api);\n *\n * // For students overview\n * fetchOverview({\n *   aggregationType: 'students',\n *   simulationType: 'enem-1',\n *   period: '1_MONTH',\n * });\n *\n * // For classes overview (UNIT_MANAGER)\n * fetchOverview({\n *   aggregationType: 'classes',\n *   simulationType: 'enem-1',\n *   period: '1_MONTH',\n * });\n *\n * // For municipalities overview (REGIONAL_MANAGER)\n * fetchOverview({\n *   aggregationType: 'municipalities',\n *   simulationType: 'enem-1',\n *   period: '1_MONTH',\n * });\n * ```\n */\nexport function useAggregatedOverview(\n  api: BaseApiClient\n): UseAggregatedOverviewReturn {\n  const [data, setData] = useState<AggregatedOverviewData | null>(\n    initialState.data\n  );\n  const [loading, setLoading] = useState(initialState.loading);\n  const [isRefreshing, setIsRefreshing] = useState(initialState.isRefreshing);\n  const [error, setError] = useState<string | null>(initialState.error);\n\n  // Track request ID to ignore stale responses\n  const requestIdRef = useRef(0);\n\n  /**\n   * Convert params to POST body format\n   */\n  const paramsToBody = (\n    params: AggregatedOverviewParams\n  ): AggregatedOverviewBody => {\n    return {\n      period: params.period,\n      subjectId: params.subjectId,\n      areaKnowledgeId: params.areaKnowledgeId,\n      schoolIds: params.schoolIds,\n      schoolYearIds: params.schoolYearIds,\n      classIds: params.classIds,\n      studentsIds: params.studentsIds,\n    };\n  };\n\n  const fetchOverview = useCallback(\n    async (params: AggregatedOverviewParams, refresh = false) => {\n      const currentRequestId = ++requestIdRef.current;\n\n      try {\n        if (refresh) {\n          setIsRefreshing(true);\n        } else {\n          setLoading(true);\n        }\n        setError(null);\n\n        const endpoint = buildEndpoint(\n          params.aggregationType,\n          params.simulationType,\n          params.scoreType\n        );\n        const body = paramsToBody(params);\n\n        let responseData: AggregatedOverviewData;\n\n        switch (params.aggregationType) {\n          case 'classes': {\n            const response = await api.post<ClassesOverviewApiResponse>(\n              endpoint,\n              body\n            );\n            responseData = response.data.data;\n            break;\n          }\n          case 'municipalities': {\n            const response = await api.post<MunicipalitiesOverviewApiResponse>(\n              endpoint,\n              body\n            );\n            responseData = response.data.data;\n            break;\n          }\n          case 'students':\n          default: {\n            const response = await api.post<StudentsOverviewApiResponse>(\n              endpoint,\n              body\n            );\n            responseData = response.data.data;\n            break;\n          }\n        }\n\n        // Ignore stale responses\n        if (currentRequestId !== requestIdRef.current) return;\n\n        setData(responseData);\n      } catch (err) {\n        // Ignore errors from stale requests\n        if (currentRequestId !== requestIdRef.current) return;\n\n        setError(\n          getErrorMessage(err, 'Não foi possível carregar os dados de overview')\n        );\n      } finally {\n        // Only update loading state for current request\n        if (currentRequestId === requestIdRef.current) {\n          setLoading(false);\n          setIsRefreshing(false);\n        }\n      }\n    },\n    [api]\n  );\n\n  const reset = useCallback(() => {\n    // Invalidate any in-flight requests\n    requestIdRef.current++;\n    setData(initialState.data);\n    setLoading(initialState.loading);\n    setIsRefreshing(initialState.isRefreshing);\n    setError(initialState.error);\n  }, []);\n\n  return { data, loading, isRefreshing, error, fetchOverview, reset };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport {\n  ReportSimulationType,\n  simulationTypeToActivityFilters,\n  type SimulationType,\n} from '../SimulatedStudentDetailsModal/types';\nimport type { BaseApiClient } from '../../types/api';\nimport type {\n  SimulatedContentsParams,\n  ContentsPerformanceData,\n  ContentsPerformanceApiResponse,\n  UseSimulatedContentsReturn,\n} from './types';\n\n/**\n * Build the API endpoint with activity filters and scoreType as query params\n */\nfunction buildEndpoint(\n  simulationType: SimulationType,\n  scoreType?: 'percentage' | 'tri'\n): string | null {\n  // Essays don't have contents/skills\n  if (simulationType === ReportSimulationType.ESSAYS) {\n    return null;\n  }\n\n  const activityFilters = simulationTypeToActivityFilters(simulationType);\n  const params = new URLSearchParams();\n\n  activityFilters.types?.forEach((t) => params.append('types', t));\n  // Note: subtypes are not sent - filtering is done via subjectId/areaKnowledgeId in the body\n  activityFilters.statuses?.forEach((s) => params.append('statuses', s));\n\n  if (scoreType && scoreType !== 'percentage') {\n    params.append('scoreType', scoreType);\n  }\n\n  const queryString = params.toString();\n  const endpoint = '/performance/simulated/activities/contents-performance';\n\n  if (!queryString) {\n    return endpoint;\n  }\n\n  return `${endpoint}?${queryString}`;\n}\n\n/**\n * Hook for fetching contents/skills performance in simulated exams\n *\n * @param api - API client with post method\n *\n * @example\n * ```tsx\n * const { data, loading, fetchContents } = useSimulatedContents(api);\n *\n * useEffect(() => {\n *   fetchContents({\n *     simulationType: 'enem-1',\n *     period: 'ONE_MONTH',\n *     page: 1,\n *     limit: 10,\n *   });\n * }, [fetchContents]);\n * ```\n */\nexport function useSimulatedContents(\n  api: BaseApiClient\n): UseSimulatedContentsReturn {\n  const [data, setData] = useState<ContentsPerformanceData | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [isRefreshing, setIsRefreshing] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const isFirstLoad = useRef(true);\n  const latestRequestId = useRef(0);\n  const isCurrentRequest = (requestId: number) =>\n    requestId === latestRequestId.current;\n\n  const buildRequestBody = (params: SimulatedContentsParams) => ({\n    period: params.period,\n    subjectId:\n      params.subjectId && params.subjectId !== 'all'\n        ? params.subjectId\n        : undefined,\n    areaKnowledgeId:\n      params.areaKnowledgeId && params.areaKnowledgeId !== 'all'\n        ? params.areaKnowledgeId\n        : undefined,\n    schoolIds: params.schoolIds,\n    schoolYearIds: params.schoolYearIds,\n    classIds: params.classIds,\n    studentsIds: params.studentsIds,\n    page: params.page ?? 1,\n    limit: params.limit ?? 10,\n    orderBy: params.orderBy ?? 'correctPercentage',\n    order: params.order ?? 'asc',\n  });\n\n  const handleNoEndpoint = (requestId: number) => {\n    if (!isCurrentRequest(requestId)) {\n      return;\n    }\n    setData(null);\n    setError(null);\n    setLoading(false);\n    setIsRefreshing(false);\n    isFirstLoad.current = true;\n  };\n\n  const startRequestState = (requestId: number, refresh: boolean) => {\n    if (!isCurrentRequest(requestId)) {\n      return;\n    }\n    if (isFirstLoad.current && !refresh) {\n      setLoading(true);\n    } else {\n      setIsRefreshing(true);\n    }\n    setError(null);\n  };\n\n  const handleSuccess = (\n    requestId: number,\n    response: { data: ContentsPerformanceApiResponse }\n  ) => {\n    if (!isCurrentRequest(requestId)) {\n      return;\n    }\n    setData(response.data.data);\n    isFirstLoad.current = false;\n  };\n\n  const handleError = (requestId: number, err: unknown) => {\n    if (!isCurrentRequest(requestId)) {\n      return;\n    }\n    const errorMessage =\n      err instanceof Error\n        ? err.message\n        : 'Erro ao carregar dados de habilidades';\n    setError(errorMessage);\n    setData(null);\n  };\n\n  const finishRequestState = (requestId: number) => {\n    if (!isCurrentRequest(requestId)) {\n      return;\n    }\n    setLoading(false);\n    setIsRefreshing(false);\n  };\n\n  const fetchContents = useCallback(\n    async (params: SimulatedContentsParams, refresh = false) => {\n      const localRequestId = ++latestRequestId.current;\n      const endpoint = buildEndpoint(params.simulationType, params.scoreType);\n\n      // Essays don't have contents\n      if (!endpoint) {\n        handleNoEndpoint(localRequestId);\n        return;\n      }\n\n      startRequestState(localRequestId, refresh);\n\n      try {\n        const response = await api.post<ContentsPerformanceApiResponse>(\n          endpoint,\n          buildRequestBody(params)\n        );\n        handleSuccess(localRequestId, response);\n      } catch (err) {\n        handleError(localRequestId, err);\n      } finally {\n        finishRequestState(localRequestId);\n      }\n    },\n    [api]\n  );\n\n  const reset = useCallback(() => {\n    setData(null);\n    setLoading(false);\n    setIsRefreshing(false);\n    setError(null);\n    isFirstLoad.current = true;\n  }, []);\n\n  return {\n    data,\n    loading,\n    isRefreshing,\n    error,\n    fetchContents,\n    reset,\n  };\n}\n","import { useMemo } from 'react';\nimport Select, {\n  SelectTrigger,\n  SelectValue,\n  SelectContent,\n  SelectItem,\n} from '../Select/Select';\nimport Text from '../Text/Text';\nimport { cn } from '../../utils/utils';\nimport { GridFourIcon } from '@phosphor-icons/react/dist/csr/GridFour';\nimport type { AreaKnowledgeSelectorProps } from './types';\nimport type { AreaKnowledgePerformance } from '../GeneralOverviewSection/types';\nimport { ESSAY_AREA_ID } from './types';\n\ninterface SelectItemData {\n  id: string;\n  name: string;\n  color?: string;\n}\n\n/**\n * AreaKnowledgeSelector - Select dropdown for knowledge areas\n *\n * Allows filtering by area of knowledge (Área de Conhecimento).\n * Shows \"Todos\" option plus all available areas from the general overview.\n * Optionally includes \"Redação\" (essay) option at the end.\n *\n * @example\n * ```tsx\n * <AreaKnowledgeSelector\n *   areas={generalOverviewData?.areas || []}\n *   selectedAreaId={selectedAreaKnowledgeId}\n *   onAreaChange={handleAreaKnowledgeChange}\n *   loading={generalOverviewLoading}\n * />\n * ```\n */\nexport function AreaKnowledgeSelector({\n  areas,\n  selectedAreaId,\n  onAreaChange,\n  loading = false,\n  label = 'Área de conhecimento',\n  includeEssay = true,\n}: AreaKnowledgeSelectorProps) {\n  // Build select items with \"Todos\" option and optionally \"Redação\" at the end\n  const selectItems = useMemo((): SelectItemData[] => {\n    const allOption: SelectItemData = {\n      id: 'all',\n      name: 'Todos',\n    };\n\n    const areaItems: SelectItemData[] = areas.map(\n      (area: AreaKnowledgePerformance) => ({\n        id: area.id,\n        name: area.name,\n        color: area.color,\n      })\n    );\n\n    const items = [allOption, ...areaItems];\n\n    if (includeEssay) {\n      const essayOption: SelectItemData = {\n        id: ESSAY_AREA_ID,\n        name: 'Redação',\n      };\n      items.push(essayOption);\n    }\n\n    return items;\n  }, [areas, includeEssay]);\n\n  // Handle value change\n  const handleValueChange = (value: string) => {\n    if (value === 'all') {\n      onAreaChange(null);\n    } else {\n      onAreaChange(value);\n    }\n  };\n\n  const effectiveValue = selectedAreaId || 'all';\n\n  return (\n    <div className=\"space-y-2\">\n      <Text size=\"sm\" weight=\"medium\" className=\"text-text-700\">\n        {label}\n      </Text>\n      <div className=\"relative\">\n        <Select\n          defaultValue=\"all\"\n          value={effectiveValue}\n          onValueChange={handleValueChange}\n        >\n          <SelectTrigger\n            className={cn('w-full', loading && 'opacity-50')}\n            disabled={loading}\n          >\n            <SelectValue placeholder=\"Selecione uma área\" />\n          </SelectTrigger>\n          <SelectContent>\n            {selectItems.map((item: SelectItemData) => {\n              let itemIcon = null;\n\n              if (item.id === 'all') {\n                itemIcon = (\n                  <span className=\"w-[21px] h-[21px] flex items-center justify-center\">\n                    <GridFourIcon\n                      size={17}\n                      weight=\"bold\"\n                      className=\"text-gray-600\"\n                    />\n                  </span>\n                );\n              } else if (item.color) {\n                itemIcon = (\n                  <span\n                    className=\"w-[21px] h-[21px] flex items-center justify-center rounded-sm\"\n                    style={{ backgroundColor: `${item.color}20` }}\n                  >\n                    <span\n                      className=\"w-2 h-2 rounded-full\"\n                      style={{ backgroundColor: item.color }}\n                    />\n                  </span>\n                );\n              }\n\n              return (\n                <SelectItem key={item.id} value={item.id} disabled={loading}>\n                  <div className=\"flex items-center gap-2\">\n                    {itemIcon}\n                    <span className=\"whitespace-nowrap\">{item.name}</span>\n                  </div>\n                </SelectItem>\n              );\n            })}\n          </SelectContent>\n        </Select>\n      </div>\n    </div>\n  );\n}\n\nexport default AreaKnowledgeSelector;\n","// Reuse types from GeneralOverviewSection\nimport type { AreaKnowledgePerformance } from '../GeneralOverviewSection/types';\n\n/**\n * Special ID for essay (Redação) area\n */\nexport const ESSAY_AREA_ID = 'essay';\n\n/**\n * Props for AreaKnowledgeSelector component\n */\nexport interface AreaKnowledgeSelectorProps {\n  /** List of areas from general overview (only id and name are used) */\n  readonly areas: AreaKnowledgePerformance[];\n  /** Currently selected area ID (null means \"Todos\") */\n  readonly selectedAreaId: string | null;\n  /** Callback when area changes */\n  readonly onAreaChange: (areaId: string | null) => void;\n  /** Loading state */\n  readonly loading?: boolean;\n  /** Label text (default: \"Área de conhecimento\") */\n  readonly label?: string;\n  /** Include essay option at the end (default: true) */\n  readonly includeEssay?: boolean;\n}\n","import { useEffect, useState, useCallback, type ReactNode } from 'react';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport Badge from '../Badge/Badge';\nimport { ArrowLeftIcon } from '@phosphor-icons/react/dist/csr/ArrowLeft';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport { useSimulatedStudentDetails } from './useSimulatedStudentDetails';\nimport { formatPercentageRounded } from '../../utils/utils';\nimport {\n  isStudentSubjectsData,\n  SIMULATED_PERFORMANCE_TAG_CONFIG,\n  PERFORMANCE_TAG_TO_BADGE_ACTION,\n  type SimulatedStudentDetailsModalProps,\n  type SubjectPerformanceItem,\n  type StudentContentPerformanceItem,\n} from './types';\nimport Button from '../Button/Button';\n\n/**\n * Modal for displaying student performance details in simulated exams\n * Supports cascading navigation: Subjects (level 1) -> Contents (level 2)\n */\nexport function SimulatedStudentDetailsModal({\n  api,\n  isOpen,\n  onClose,\n  simulationType,\n  userInstitutionId,\n  studentName,\n  period,\n}: SimulatedStudentDetailsModalProps) {\n  const { data, loading, error, fetchDetails, reset } =\n    useSimulatedStudentDetails(api);\n  const [selectedSubject, setSelectedSubject] = useState<{\n    id: string;\n    name: string;\n  } | null>(null);\n\n  // Fetch subjects when modal opens\n  useEffect(() => {\n    if (isOpen && userInstitutionId) {\n      fetchDetails({\n        simulationType,\n        userInstitutionId,\n        period,\n        subjectId: null,\n      });\n    }\n  }, [isOpen, userInstitutionId, simulationType, period, fetchDetails]);\n\n  // Reset state when modal closes\n  useEffect(() => {\n    if (!isOpen) {\n      reset();\n      setSelectedSubject(null);\n    }\n  }, [isOpen, reset]);\n\n  // Handle subject click (navigate to level 2)\n  const handleSubjectClick = useCallback(\n    (subject: SubjectPerformanceItem) => {\n      if (!userInstitutionId) return;\n\n      setSelectedSubject({ id: subject.id, name: subject.name });\n      fetchDetails({\n        simulationType,\n        userInstitutionId,\n        period,\n        subjectId: subject.id,\n      });\n    },\n    [userInstitutionId, simulationType, period, fetchDetails]\n  );\n\n  // Handle back navigation (return to level 1)\n  const handleBack = useCallback(() => {\n    if (!userInstitutionId) return;\n\n    setSelectedSubject(null);\n    fetchDetails({\n      simulationType,\n      userInstitutionId,\n      period,\n      subjectId: null,\n    });\n  }, [userInstitutionId, simulationType, period, fetchDetails]);\n\n  // Build modal title with back button when in level 2\n  const modalTitle = selectedSubject ? (\n    <div className=\"flex items-center gap-2\">\n      <Button\n        onClick={handleBack}\n        variant=\"raw\"\n        className=\"p-1 hover:bg-background-100 rounded-md transition-colors\"\n        aria-label=\"Voltar para lista de matérias\"\n      >\n        <ArrowLeftIcon size={20} className=\"text-text-600\" />\n      </Button>\n      <Text>{selectedSubject.name}</Text>\n    </div>\n  ) : (\n    `Desempenho de ${studentName || 'Estudante'}`\n  );\n\n  // Render loading state\n  if (loading) {\n    return (\n      <Modal isOpen={isOpen} onClose={onClose} title={modalTitle} size=\"lg\">\n        <div className=\"flex items-center justify-center py-8\">\n          <Text size=\"sm\" className=\"text-text-500\">\n            Carregando...\n          </Text>\n        </div>\n      </Modal>\n    );\n  }\n\n  // Render error state\n  if (error) {\n    return (\n      <Modal isOpen={isOpen} onClose={onClose} title={modalTitle} size=\"lg\">\n        <div className=\"flex items-center justify-center py-8\">\n          <Text size=\"sm\" className=\"text-error-500\">\n            {error}\n          </Text>\n        </div>\n      </Modal>\n    );\n  }\n\n  // Render empty state\n  if (!data) {\n    return (\n      <Modal isOpen={isOpen} onClose={onClose} title={modalTitle} size=\"lg\">\n        <div className=\"flex items-center justify-center py-8\">\n          <Text size=\"sm\" className=\"text-text-500\">\n            Nenhum dado encontrado\n          </Text>\n        </div>\n      </Modal>\n    );\n  }\n\n  const isSubjectsLevel = isStudentSubjectsData(data);\n  const renderDetailsContent = (): ReactNode => {\n    if (isSubjectsLevel) {\n      if (data.subjects.length > 0) {\n        return data.subjects.map((subject) => (\n          <SubjectItem\n            key={subject.id}\n            subject={subject}\n            onClick={() => handleSubjectClick(subject)}\n            questionsLabel=\"questões\"\n          />\n        ));\n      }\n\n      return (\n        <Text size=\"sm\" className=\"text-text-500 text-center py-4\">\n          Nenhuma matéria encontrada\n        </Text>\n      );\n    }\n\n    if (data.contents.length > 0) {\n      return data.contents.map((content) => (\n        <ContentItem\n          key={content.contentId}\n          content={content}\n          questionsLabel=\"questões\"\n          ofLabel=\"de\"\n        />\n      ));\n    }\n\n    return (\n      <Text size=\"sm\" className=\"text-text-500 text-center py-4\">\n        Nenhuma habilidade encontrada\n      </Text>\n    );\n  };\n\n  const detailsContent = renderDetailsContent();\n\n  return (\n    <Modal isOpen={isOpen} onClose={onClose} title={modalTitle} size=\"lg\">\n      <div className=\"flex flex-col gap-4\">\n        {/* Student header card */}\n        <div className=\"flex items-center justify-between p-4 bg-background-50 rounded-xl\">\n          <div className=\"flex flex-col gap-1\">\n            <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n              {data.student.name}\n            </Text>\n            <Text size=\"sm\" className=\"text-text-500\">\n              {data.student.school} - {data.student.class}\n            </Text>\n          </div>\n          <div className=\"flex flex-col items-end gap-1\">\n            <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n              {formatPercentageRounded(data.student.average)}\n            </Text>\n            <Badge\n              variant=\"solid\"\n              action={PERFORMANCE_TAG_TO_BADGE_ACTION[data.student.performance]}\n              size=\"small\"\n            >\n              {SIMULATED_PERFORMANCE_TAG_CONFIG[data.student.performance].label}\n            </Badge>\n          </div>\n        </div>\n\n        {/* List of subjects or contents */}\n        <div className=\"flex flex-col gap-2 max-h-[400px] overflow-y-auto\">\n          {detailsContent}\n        </div>\n      </div>\n    </Modal>\n  );\n}\n\n/**\n * Subject item component (level 1)\n */\nfunction SubjectItem({\n  subject,\n  onClick,\n  questionsLabel,\n}: Readonly<{\n  subject: SubjectPerformanceItem;\n  onClick: () => void;\n  questionsLabel: string;\n}>) {\n  return (\n    <button\n      onClick={onClick}\n      className=\"flex items-center gap-4 p-4 bg-background border border-border-50 rounded-xl hover:bg-background-50 transition-colors text-left w-full\"\n    >\n      {/* Subject color indicator */}\n      {subject.color && (\n        <div\n          className=\"w-3 h-3 rounded-full flex-shrink-0\"\n          style={{ backgroundColor: subject.color }}\n        />\n      )}\n\n      {/* Subject info */}\n      <div className=\"flex-1 min-w-0\">\n        <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950 truncate\">\n          {subject.name}\n        </Text>\n        <Text size=\"xs\" className=\"text-text-500\">\n          {subject.questionsCount} {questionsLabel}\n        </Text>\n      </div>\n\n      {/* Progress bar */}\n      <div className=\"w-32 flex-shrink-0\">\n        <ProgressBar\n          value={subject.performance.correctPercentage}\n          variant=\"green\"\n          size=\"small\"\n          showPercentage\n        />\n      </div>\n\n      {/* Arrow indicator */}\n      <CaretRightIcon size={16} className=\"text-text-400 flex-shrink-0\" />\n    </button>\n  );\n}\n\n/**\n * Content item component (level 2)\n */\nfunction ContentItem({\n  content,\n  questionsLabel,\n  ofLabel,\n}: Readonly<{\n  content: StudentContentPerformanceItem;\n  questionsLabel: string;\n  ofLabel: string;\n}>) {\n  return (\n    <div className=\"flex items-center gap-4 p-4 bg-background border border-border-50 rounded-xl\">\n      {/* Content info */}\n      <div className=\"flex-1 min-w-0\">\n        <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950 truncate\">\n          {content.contentName}\n        </Text>\n        <div className=\"flex items-center gap-2\">\n          {content.bnccCode && (\n            <Text size=\"xs\" className=\"text-primary-600\">\n              {content.bnccCode}\n            </Text>\n          )}\n          <Text size=\"xs\" className=\"text-text-500\">\n            {content.questionsCount} {questionsLabel}\n          </Text>\n        </div>\n      </div>\n\n      {/* Progress bar */}\n      <div className=\"w-32 flex-shrink-0\">\n        <ProgressBar\n          value={content.performance.correctPercentage}\n          variant=\"green\"\n          size=\"small\"\n          showPercentage\n        />\n      </div>\n\n      {/* Hit count */}\n      <div className=\"flex items-center gap-1 flex-shrink-0\">\n        <Text size=\"sm\" weight=\"semibold\" className=\"text-success-600\">\n          {content.performance.correct}\n        </Text>\n        <Text size=\"xs\" className=\"text-text-500 whitespace-nowrap\">\n          {ofLabel} {content.questionsCount}\n        </Text>\n      </div>\n    </div>\n  );\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { BaseApiClient } from '../../types/api';\nimport {\n  ReportSimulationType,\n  simulationTypeToActivityFilters,\n  type SimulationType,\n  type StudentDetailsData,\n  type StudentDetailsParams,\n  type StudentDetailsApiResponse,\n  type UseSimulatedStudentDetailsReturn,\n} from './types';\nimport { paramsToBody } from './utils';\n\n/**\n * Build the API endpoint with activity filters as query params\n */\nfunction buildEndpoint(simulationType: SimulationType): string {\n  if (simulationType === ReportSimulationType.ESSAYS) {\n    return '/performance/simulated/essays/student-details';\n  }\n\n  const activityFilters = simulationTypeToActivityFilters(simulationType);\n  const params = new URLSearchParams();\n\n  activityFilters.types?.forEach((t) => params.append('types', t));\n  // Note: subtypes are not sent - filtering is done via subjectId in the body\n  activityFilters.statuses?.forEach((s) => params.append('statuses', s));\n\n  const queryString = params.toString();\n  const endpoint = '/performance/simulated/activities/student-details';\n\n  if (!queryString) {\n    return endpoint;\n  }\n\n  return `${endpoint}?${queryString}`;\n}\n\n/**\n * Hook for fetching student details in simulated exams\n * Supports cascading navigation: Subjects (level 1) -> Contents (level 2)\n *\n * @param api - API client with post method\n *\n * @example\n * ```tsx\n * const { data, loading, error, fetchDetails, reset } = useSimulatedStudentDetails(api);\n *\n * // Fetch subjects list (level 1)\n * fetchDetails({\n *   simulationType: 'enem-1',\n *   userInstitutionId: 'institution-uuid',\n *   period: '1_MONTH',\n * });\n *\n * // Fetch contents list (level 2)\n * fetchDetails({\n *   simulationType: 'enem-1',\n *   userInstitutionId: 'institution-uuid',\n *   period: '1_MONTH',\n *   subjectId: 'subject-uuid',\n * });\n * ```\n */\nexport function useSimulatedStudentDetails(\n  api: BaseApiClient\n): UseSimulatedStudentDetailsReturn {\n  const [data, setData] = useState<StudentDetailsData | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  // Track request ID to ignore stale responses\n  const requestIdRef = useRef(0);\n\n  const fetchDetails = useCallback(\n    async (params: StudentDetailsParams) => {\n      const currentRequestId = ++requestIdRef.current;\n\n      try {\n        setLoading(true);\n        setError(null);\n        setData(null);\n\n        const endpoint = buildEndpoint(params.simulationType);\n        const body = paramsToBody(params);\n\n        const response = await api.post<StudentDetailsApiResponse>(\n          endpoint,\n          body\n        );\n\n        // Ignore stale responses\n        if (currentRequestId !== requestIdRef.current) return;\n\n        setData(response.data.data);\n      } catch (err) {\n        // Ignore errors from stale requests\n        if (currentRequestId !== requestIdRef.current) return;\n\n        const errorMessage =\n          err instanceof Error\n            ? err.message\n            : 'Não foi possível carregar os detalhes do estudante';\n        setData(null);\n        setError(errorMessage);\n      } finally {\n        // Only update loading state for current request\n        if (currentRequestId === requestIdRef.current) {\n          setLoading(false);\n        }\n      }\n    },\n    [api]\n  );\n\n  const reset = useCallback(() => {\n    // Invalidate any in-flight requests\n    requestIdRef.current++;\n    setData(null);\n    setLoading(false);\n    setError(null);\n  }, []);\n\n  return { data, loading, error, fetchDetails, reset };\n}\n","import type { StudentDetailsParams } from './types';\n\n/**\n * Body type for POST request\n */\nexport interface StudentDetailsBody {\n  userInstitutionId: string;\n  period?: string;\n  subjectId?: string | null;\n  page?: number;\n  limit?: number;\n}\n\n/**\n * Convert params to POST body format\n */\nexport function paramsToBody(params: StudentDetailsParams): StudentDetailsBody {\n  return {\n    userInstitutionId: params.userInstitutionId,\n    period: params.period,\n    subjectId: params.subjectId ?? undefined,\n    page: params.page ?? 1,\n    limit: params.limit ?? 20,\n  };\n}\n","import type { OverviewAggregationType } from '../components/SimulatedStudentsOverview/types';\nimport { PROFILE_ROLES } from '../types/chat';\n\n/**\n * Get the overview aggregation type based on user profile\n *\n * - GENERAL_MANAGER: students (default)\n * - REGIONAL_MANAGER: municipalities (aggregated by city)\n * - UNIT_MANAGER: classes (aggregated by turma)\n * - TEACHER: students (default)\n *\n * @param profileName - The user's profile name\n * @returns The aggregation type to use\n */\nexport function getAggregationTypeByProfile(\n  profileName: string | undefined\n): OverviewAggregationType {\n  switch (profileName) {\n    case PROFILE_ROLES.UNIT_MANAGER:\n      return 'classes';\n    case PROFILE_ROLES.REGIONAL_MANAGER:\n      return 'municipalities';\n    case PROFILE_ROLES.GENERAL_MANAGER:\n    case PROFILE_ROLES.TEACHER:\n    default:\n      return 'students';\n  }\n}\n\n/**\n * Check if the profile should use aggregated overview (classes or municipalities)\n *\n * @param profileName - The user's profile name\n * @returns True if the profile should use aggregated overview\n */\nexport function shouldUseAggregatedOverview(\n  profileName: string | undefined\n): boolean {\n  return (\n    profileName === PROFILE_ROLES.UNIT_MANAGER ||\n    profileName === PROFILE_ROLES.REGIONAL_MANAGER\n  );\n}\n","import type { ColumnConfig } from '../TableProvider';\nimport type { StudentsHighlightPeriod } from '../../hooks/useStudentsHighlight';\nimport type { SimulatedFilters } from '../SimulatedFilters/types';\nimport type { ScoreType } from '../../types/common';\nimport type { GeneralOverviewData } from '../GeneralOverviewSection/types';\nimport type {\n  SimulatedOverviewData,\n  SimulatedStudentItem,\n  AggregatedOverviewData,\n  OverviewAggregationType,\n} from '../SimulatedStudentsOverview/types';\nimport type {\n  ContentsPerformanceData,\n  SimulatedContentItem,\n} from '../SimulatedContentsPerformance/types';\nimport type { BaseApiClient } from '../../types/api';\n\n/**\n * View tabs for simulated exams (students vs skills)\n */\nexport enum SimulatedViewTab {\n  STUDENTS = 'students',\n  SKILLS = 'skills',\n}\n\nexport interface UseSimulatedPerformanceOptions {\n  api: BaseApiClient;\n  /**\n   * User's profile name to determine aggregation type.\n   * - UNIT_MANAGER: aggregates by classes\n   * - REGIONAL_MANAGER: aggregates by municipalities\n   * - GENERAL_MANAGER, TEACHER, others: shows students (default)\n   */\n  profileName?: string;\n  /**\n   * When false, the hook will not make automatic API calls (effect-triggered fetches).\n   * The initial data load and effect-based reloads (e.g., scoreType URL changes) will be\n   * skipped. However, manual handler calls (handlePeriodChange, handleFiltersApply, etc.)\n   * will still trigger API requests if invoked directly.\n   * Useful for lazy loading when the simulated report tab is not active.\n   * @default true\n   */\n  enabled?: boolean;\n}\n\nexport interface UseSimulatedPerformanceReturn {\n  // === Query Params (gerenciados internamente) ===\n  period: StudentsHighlightPeriod;\n  scoreType: ScoreType;\n\n  // === Estados de Seleção ===\n  selectedAreaKnowledgeId: string | null;\n  /** Related IDs for merged areas (includes all IDs when area was deduplicated) */\n  selectedAreaRelatedIds: string[];\n  selectedSubjectId: string | null;\n  simulatedViewTab: SimulatedViewTab;\n  isEssaySelected: boolean;\n\n  // === Filtros ===\n  filters: SimulatedFilters;\n  activeFiltersCount: number;\n\n  // === Aggregation Type ===\n  aggregationType: OverviewAggregationType;\n\n  // === Dados da API ===\n  generalOverview: {\n    data: GeneralOverviewData | null;\n    loading: boolean;\n    error: string | null;\n  };\n  /**\n   * Aggregated overview data based on profile.\n   * - students: contains StudentsOnlyOverviewData\n   * - classes: contains ClassesOverviewData\n   * - municipalities: contains MunicipalitiesOverviewData\n   */\n  aggregatedOverview: {\n    data: AggregatedOverviewData | null;\n    loading: boolean;\n    isRefreshing: boolean;\n    error: string | null;\n  };\n  /**\n   * Paginated students list for the table (legacy endpoint).\n   * Still used for drilling into individual student details.\n   */\n  studentsOverview: {\n    data: SimulatedOverviewData | null;\n    loading: boolean;\n    isRefreshing: boolean;\n    error: string | null;\n  };\n  contentsPerformance: {\n    data: ContentsPerformanceData | null;\n    loading: boolean;\n    isRefreshing: boolean;\n    error: string | null;\n  };\n\n  // === Handlers ===\n  handlePeriodChange: (period: string) => void;\n  handleScoreTypeChange: (scoreType: string) => void;\n  handleAreaKnowledgeChange: (areaId: string | null) => void;\n  handleSubjectChange: (subjectId: string | null) => void;\n  handleViewTabChange: (tab: string) => void;\n  handleFiltersApply: (filters: SimulatedFilters) => void;\n  handleStudentsParamsChange: (params: Record<string, unknown>) => void;\n  handleContentsParamsChange: (params: Record<string, unknown>) => void;\n  handleStudentRowClick: (row: SimulatedStudentItem) => void;\n  handleContentRowClick: (row: SimulatedContentItem) => void;\n\n  // === Modais ===\n  studentModal: {\n    isOpen: boolean;\n    student: { userInstitutionId: string; name: string } | null;\n    close: () => void;\n  };\n  contentModal: {\n    isOpen: boolean;\n    content: { contentId: string; contentName: string } | null;\n    close: () => void;\n  };\n  filtersModal: {\n    isOpen: boolean;\n    open: () => void;\n    close: () => void;\n  };\n\n  // === Colunas das Tabelas ===\n  studentsTableColumns: ColumnConfig<SimulatedStudentItem>[];\n  contentsTableColumns: ColumnConfig<SimulatedContentItem>[];\n}\n\nexport interface SimulatedPerformanceViewProps extends UseSimulatedPerformanceReturn {\n  api: BaseApiClient;\n  noSearchImage?: string;\n}\n"],"mappings":"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","names":["useEffect","useCallback","useState","useMemo","useRef","useState","useCallback","useRef","PerformanceBadgeAction","ReportSimulationType","params","queryString","endpoint","initialState","useState","useRef","paramsToBody","useCallback","useState","useCallback","useRef","buildEndpoint","initialState","useState","useRef","paramsToBody","useCallback","useState","useCallback","useRef","buildEndpoint","useState","useRef","useCallback","jsx","jsxs","useState","useCallback","useState","useCallback","useRef","buildEndpoint","useState","useRef","useCallback","jsx","jsxs","useState","useCallback","SimulatedViewTab","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback"]}