import { useMemo } from 'react'
import dayjs from 'dayjs'
import { Course, Lesson } from '../../../../__data__/model'

export interface StudentAttendance {
  id: string
  name: string
  attended: number
  total: number
  percent: number
  avatarUrl?: string
  email?: string
}

export interface CourseStats {
  totalCourses: number
  activeCourses: number
  totalLessons: number
  completedLessons: number
  upcomingLessons: number
  averageAttendance: number
  totalStudents: Set<string>
  totalTeachers: Set<string>
  recentCoursesCount: number
  oldCoursesCount: number
  weekdayActivity: number[]
  mostActiveDayIndex: number
  topStudents: StudentAttendance[]
  topCoursesByAttendance: Array<{id: string, name: string, attendanceRate: number}>
}

export const useStats = (
  courses: Course[], 
  lessonsByCourse: Record<string, Lesson[]> = {}
): CourseStats => {
  
  return useMemo(() => {
    if (!courses?.length) {
      return {
        totalCourses: 0,
        activeCourses: 0,
        totalLessons: 0,
        completedLessons: 0,
        upcomingLessons: 0,
        averageAttendance: 0,
        totalStudents: new Set<string>(),
        totalTeachers: new Set<string>(),
        recentCoursesCount: 0,
        oldCoursesCount: 0,
        weekdayActivity: Array(7).fill(0),
        mostActiveDayIndex: 0,
        topStudents: [] as StudentAttendance[],
        topCoursesByAttendance: [] as {id: string, name: string, attendanceRate: number}[]
      }
    }
    
    const now = dayjs()
    const threeMonthsAgo = now.subtract(3, 'month')
    const weekdayActivity = Array(7).fill(0)
    
    // Множества для уникальных студентов и учителей
    const uniqueStudents = new Set<string>()
    const uniqueTeachers = new Set<string>()
    
    // Количество курсов, созданных за последние 3 месяца
    const recentCourses = courses.filter(course => 
      dayjs(course.created).isAfter(threeMonthsAgo)
    )
    
    // Количество активных курсов
    const activeCourses = []
    
    let totalLessonsCount = 0
    let completedLessonsCount = 0
    let upcomingLessonsCount = 0
    let totalAttendances = 0
    let totalPossibleAttendances = 0
    
    // Для отслеживания посещаемости студентов по всем курсам
    const globalStudentsMap = new Map<string, StudentAttendance>()
    
    // Статистика посещаемости по курсам
    const courseAttendanceStats: {id: string, name: string, attendanceRate: number}[] = []
    
    // Для каждого курса считаем статистику на основе данных об уроках
    courses.forEach(course => {
      // Добавляем учителей в множество
      course.teachers.forEach(teacher => {
        uniqueTeachers.add(teacher.sub)
      })
      
      // Добавляем студентов в множество
      const courseUniqueStudents = new Set<string>()
      
      // Получаем детализированные данные об уроках курса (если доступны)
      const courseLessons = lessonsByCourse[course._id] || []
      
      // Если у нас есть детализированные данные по урокам
      if (courseLessons.length > 0) {
        // Добавляем количество уроков к общему счетчику
        totalLessonsCount += courseLessons.length
        
        // Считаем завершенные и предстоящие уроки
        const completed = courseLessons.filter(lesson => dayjs(lesson.date).isBefore(now))
        const upcoming = courseLessons.filter(lesson => dayjs(lesson.date).isAfter(now))
        
        completedLessonsCount += completed.length
        upcomingLessonsCount += upcoming.length
        
        // Если у курса есть будущие занятия, считаем его активным
        if (upcoming.length > 0) {
          activeCourses.push(course)
        }
        
        // Собираем всех уникальных студентов курса для более точной статистики
        courseLessons.forEach(lesson => {
          lesson.students?.forEach(student => {
            courseUniqueStudents.add(student.sub)
            uniqueStudents.add(student.sub)
          })
        })
        
        // Для статистики посещаемости по курсу
        let courseAttendances = 0
        let coursePossibleAttendances = 0
        
        // Считаем посещаемость ТОЛЬКО по прошедшим занятиям
        completed.forEach(lesson => {
          // Добавляем статистику по дням недели
          // В dayjs 0 = воскресенье, 1 = понедельник, ... 6 = суббота
          // Нужно проверить формат даты урока, что это валидная дата
          if (lesson.date && dayjs(lesson.date).isValid()) {
            const lessonDay = dayjs(lesson.date).day()
            weekdayActivity[lessonDay]++
          }
          
          // Добавляем студентов в глобальное множество
          const lessonStudentsCount = lesson.students?.length || 0
          
          // Добавляем в статистику посещаемости
          courseAttendances += lessonStudentsCount
          
          // Обновляем счетчики общей посещаемости
          totalAttendances += lessonStudentsCount
          
          // Собираем статистику по каждому студенту
          lesson.students?.forEach(student => {
            // Добавляем или обновляем данные студента в глобальной карте
            const studentId = student.sub
            const currentGlobal = globalStudentsMap.get(studentId) || {
              id: studentId,
              name: (student.family_name && student.given_name
                ? `${student.family_name} ${student.given_name}`
                : student.name || student.email || student.preferred_username || student.family_name || student.given_name),
              attended: 0,
              total: 0,
              percent: 0,
              avatarUrl: student.picture,
              email: student.email
            }
            
            currentGlobal.attended += 1
            globalStudentsMap.set(studentId, currentGlobal)
          })
        })
        
        // Потенциальные посещения для этого курса рассчитываем только по прошедшим занятиям
        // и только для студентов, которые есть хотя бы на одном занятии
        // Кол-во прошедших занятий * кол-во уникальных студентов на курсе
        coursePossibleAttendances = completed.length * (courseUniqueStudents.size || 1)
        totalPossibleAttendances += coursePossibleAttendances
        
        // Добавляем статистику курса, если есть прошедшие занятия
        if (completed.length > 0 && coursePossibleAttendances > 0) {
          courseAttendanceStats.push({
            id: course._id,
            name: course.name,
            attendanceRate: (courseAttendances / coursePossibleAttendances) * 100
          })
        }
      } else {
        // Если у нас нет детализированных данных, считаем на основе общих данных курса
        totalLessonsCount += course.lessons.length
        
        // Предполагаем, что курс активен
        activeCourses.push(course)
      }
    })
    
    // Отладочная информация по активности по дням недели
    console.log('Weekday activity:', weekdayActivity)
    
    // Обрабатываем глобальную статистику посещаемости студентов
    // Устанавливаем общее число занятий для каждого студента
    globalStudentsMap.forEach(student => {
      // Устанавливаем максимально возможное кол-во занятий как общее число прошедших занятий
      // (это завышенная оценка, т.к. студент может быть не на всех курсах)
      student.total = completedLessonsCount
      student.percent = completedLessonsCount > 0 ? (student.attended / student.total) * 100 : 0
    })
    
    // Находим самый активный день недели
    const maxValue = Math.max(...weekdayActivity)
    // Если максимальное значение = 0, то устанавливаем понедельник как самый активный день по умолчанию
    const mostActiveDayIndex = maxValue > 0 ? weekdayActivity.indexOf(maxValue) : 1
    
    // Вычисляем среднюю посещаемость
    const averageAttendance = totalPossibleAttendances > 0
      ? (totalAttendances / totalPossibleAttendances) * 100
      : 0
      
    // Топ студенты по посещаемости (по всем курсам)
    const topStudents = Array.from(globalStudentsMap.values())
      .sort((a, b) => (b.percent - a.percent) || (b.attended - a.attended))
      .slice(0, 5)
      
    // Сортируем курсы по посещаемости
    const topCoursesByAttendance = courseAttendanceStats
      .sort((a, b) => b.attendanceRate - a.attendanceRate)
      .slice(0, 3)
    
    return {
      totalCourses: courses.length,
      activeCourses: activeCourses.length,
      totalLessons: totalLessonsCount,
      completedLessons: completedLessonsCount,
      upcomingLessons: upcomingLessonsCount,
      averageAttendance,
      totalStudents: uniqueStudents,
      totalTeachers: uniqueTeachers,
      recentCoursesCount: recentCourses.length,
      oldCoursesCount: courses.length - recentCourses.length,
      weekdayActivity,
      mostActiveDayIndex,
      topStudents,
      topCoursesByAttendance
    }
  }, [courses, lessonsByCourse])
} 