import { useMemo } from 'react' import dayjs from 'dayjs' import { AttendanceData } from './useAttendanceData' export interface AttendanceStats { totalLessons: number averageAttendance: number topStudents: Array<{ name: string attendance: number attendancePercent: number }> lessonsAttendance: Array<{ name: string date: string attendancePercent: number }> } export const useAttendanceStats = (data: AttendanceData): AttendanceStats => { return useMemo(() => { if (!data.attendance || !data.students.length) { return { totalLessons: 0, averageAttendance: 0, topStudents: [], lessonsAttendance: [] } } const now = dayjs() // Фильтруем лекции, оставляя только те, которые уже прошли (исключаем будущие) const pastLessons = data.attendance.filter(lesson => dayjs(lesson.date).isBefore(now)) const totalLessons = pastLessons.length // Рассчитываем посещаемость для каждого студента const studentAttendance = data.students.map(student => { let attended = 0 pastLessons.forEach(lesson => { if (lesson.students.some(s => s.sub === student.sub)) { attended++ } }) return { student, name: student.value, attendance: attended, attendancePercent: totalLessons > 0 ? (attended / totalLessons) * 100 : 0 } }) // Рассчитываем статистику посещаемости для каждого урока const lessonsAttendance = pastLessons.map(lesson => { const attendedStudents = lesson.students.length const attendancePercent = data.students.length > 0 ? (attendedStudents / data.students.length) * 100 : 0 return { name: lesson.name, date: lesson.date, attendancePercent } }) // Выбираем топ-3 студентов по посещаемости const topStudents = [...studentAttendance] .sort((a, b) => b.attendance - a.attendance) .slice(0, 3) .map(student => ({ name: student.name, attendance: student.attendance, attendancePercent: student.attendancePercent })) // Считаем среднюю посещаемость const totalAttendance = studentAttendance.reduce((sum, student) => sum + student.attendance, 0) const averageAttendance = data.students.length > 0 && totalLessons > 0 ? (totalAttendance / (data.students.length * totalLessons)) * 100 : 0 return { totalLessons, averageAttendance, topStudents, lessonsAttendance } }, [data]) }