import { useState, useEffect, useRef, useMemo } from 'react'

import { AccessCode, BaseResponse, User } from '../__data__/model'

export const useStudentAttendance = (
  accessCode: BaseResponse<AccessCode>,
  allStudents: any
) => {
  // Создаем ref для отслеживания ранее присутствовавших студентов
  const prevPresentStudentsRef = useRef(new Set<string>())
  
  // Добавляем состояние для отслеживания пульсации
  const [isPulsing, setIsPulsing] = useState(false)
  // Отслеживаем предыдущее количество студентов
  const prevStudentCountRef = useRef(0)

  // Эффект для обнаружения и обновления новых присутствующих студентов
  useEffect(() => {
    if (accessCode?.body) {
      const currentPresent = new Set(accessCode.body.lesson.students.map(s => s.sub))
      
      // Проверяем, изменилось ли количество студентов
      const currentCount = accessCode.body.lesson.students.length;
      if (prevStudentCountRef.current !== currentCount && prevStudentCountRef.current > 0) {
        // Запускаем эффект пульсации
        setIsPulsing(true);
        // Сбрасываем эффект через 1.5 секунды
        setTimeout(() => {
          setIsPulsing(false);
        }, 1500);
      }
      
      // Обновляем предыдущее количество
      prevStudentCountRef.current = currentCount;
      
      // Очищаем флаги предыдущего состояния после задержки
      const timeoutId = setTimeout(() => {
        prevPresentStudentsRef.current = currentPresent
      }, 3000)
      
      return () => clearTimeout(timeoutId)
    }
  }, [accessCode])

  const studentsArr = useMemo(() => {
    let allStudentsList: (User & { present?: boolean; recentlyPresent?: boolean })[] = [
      ...(allStudents.data?.body || []),
    ].map((st) => ({ ...st, present: false, recentlyPresent: false }))
    let presentStudents: (User & { present?: boolean })[] = [
      ...(accessCode?.body?.lesson?.students || []),
    ]

    // Находим новых студентов по сравнению с предыдущим состоянием
    const currentPresent = new Set(presentStudents.map(s => s.sub))
    const newlyPresent = [...currentPresent].filter(id => !prevPresentStudentsRef.current.has(id))

    while (presentStudents.length) {
      const student = presentStudents.pop()

      const present = allStudentsList.find((st) => st.sub === student.sub)

      if (present) {
        present.present = true
        present.recentlyPresent = newlyPresent.includes(student.sub)
      } else {
        allStudentsList.push({ 
          ...student, 
          present: true, 
          recentlyPresent: newlyPresent.includes(student.sub) 
        })
      }
    }

    return allStudentsList
  }, [accessCode?.body, allStudents.data, prevPresentStudentsRef.current])

  return {
    studentsArr,
    isPulsing
  }
} 