class AttendancesController < ApplicationController

  before_action :require_login
  before_action :find_course, only: [:index, :statistics]
  before_action :user_course_identity

  def index
    current_date = Date.current
    current_end_time = Time.current.strftime("%H:%M:%S")

    if params[:history]
      @attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
                            (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')")
      if @user_course_identity == Course::STUDENT
        member = @course.students.find_by(user_id: current_user.id)
        group_ids = [member&.course_group_id.to_i, 0]
        @attendances = @attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: group_ids})

        attendance_ids = @attendances.pluck(:id)
        @normal_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "NORMAL").size
        @leave_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "LEAVE").size
        @absence_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "ABSENCE").size
      end
    else
      @attendances = @course.course_attendances.where("attendance_date > '#{current_date}' or
                            (attendance_date = '#{current_date}' and end_time > '#{current_end_time}')")
    end
    @attendances_count = @attendances.size

    @attendances = @attendances.order("attendance_date desc, start_time desc")
    @attendances = paginate @attendances.includes(:user, :course_member_attendances)
  end

  def statistics
    current_date = Date.current
    current_end_time = Time.current.strftime("%H:%M:%S")
    history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
                            (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')")
    all_member_attendances = CourseMemberAttendance.where(course_attendance_id: history_attendances)
    if params[:group_id].present?
      history_attendances = history_attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: [params[:group_id], 0]})
      all_member_attendances = all_member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_id]})
    end

    history_attendances = history_attendances.order("attendance_date desc, start_time desc")
    data = AttendanceStatisticsService.call history_attendances, all_member_attendances
    @all_history_count = data[:all_history_count]
    @history_attendances = data[:history_attendances]
    @avg_normal_rate = data[:avg_normal_rate]
    @avg_absence_rate = data[:avg_absence_rate]
    @avg_leave_rate = data[:avg_leave_rate]
  end

  private
  def find_attendance
    @attendance = CourseAttendance.find params[:id]
    @course = @attendance.course
  end
end