class Family::Legacy::Students::AttendancesController < Family::Controller
  def index
    data = attendances
      .includes(:classroom)
      .by_quarter(params[:quarter])
      .by_classroom(params[:classroom_id])
      .by_parent_viewable
      .by_tardy(params[:tardy]&.to_bool)
      .by_absent(params[:absent]&.to_bool)
      .order(date: :desc)
    render_success :ok, json: data.map { |a| attendance_props(a) }
  end

  def statistics
    data = { classes: [], total: {} }
    attendance_by_classroom.each do |classroom, classroom_attendances|
      next if classroom_attendances.blank?

      attendance_present_sum = classroom_attendances.sum(&:is_present)

      attendance_absent_sum = classroom_attendances.sum(&:absent)

      classroom_percentage = (attendance_present_sum / (attendance_present_sum +
       attendance_absent_sum).to_f) * 100

      classroom_data = {
        class_id: classroom.id,
        class_name: classroom.name,
        class_description: classroom.description,
        class_section: classroom.section,
        present: attendance_present_sum,
        absent: attendance_absent_sum,
        tardies: classroom_attendances.sum(&:tardy),
        hours: classroom_attendances.sum(&:hours),
        percentage: classroom_percentage,
        semester: classroom.semester,
        quarters: []
      }

      quarters.each do |key, value|
        quarter_attendance = classroom_attendances.select { |a| a.quarter == key }
        quarter_data = {}
        quarter_data[:name] = value
        quarter_data[:present] = quarter_attendance.sum(&:is_present)
        quarter_data[:absent] = quarter_attendance.sum(&:absent)
        quarter_data[:tardy] = quarter_attendance.sum(&:tardy)
        quarter_data[:hours] = quarter_attendance.sum(&:hours)
        quarter_percentage = (quarter_data[:present] / (quarter_data[:present] +
          quarter_data[:absent]).to_f) * 100
        quarter_data[:percentage] = quarter_percentage
        classroom_data[:quarters] << quarter_data
      end
      data[:classes] << classroom_data
    end
    render_success :ok, json: data
  end

  private
    def attendance_by_classroom
      @attendance_by_classroom ||= attendances
        .includes(:classroom)
        .by_parent_viewable
        .order_by_class_name
        .group_by(&:classroom)
    end

    def attendances
      student.attendances
    end

    def quarters
      current_school.school_config.quarters
    end

    def attendance_props(attendance)
      {
        id: attendance.id,
        date: attendance.date,
        homeroom: attendance.homeroom,
        present: attendance.is_present,
        tardy: attendance.tardy,
        notes: attendance.notes,
        excused: attendance.excused,
        unexcused: attendance.unexcused,
        quarter: attendance.quarter,
        absent: attendance.absent,
        classroom_name: attendance.classroom.name
      }
    end
end
