class Csv::Service::StudentTotalService < Csv::ApplicationService
  include DateRangeHelper

  def initialize(school, params)
    @school = school
    @grades = params['grades']
    @classrooms = params['classrooms']
    @dates = params['dates']
  end

  def call
    CSV.generate do |csv|
      csv << ['Student Code', 'Name', 'Grade', 'Total Hours', 'Approved Hours']
      order_params = [:last_name, :first_name]
      order_params.unshift(:grade) if @grades.present?
      students.order(order_params).each do |student|
        student_total_hours = total_hours[student.id] || 0
        student_approved_hours = approved_hours[student.id] || 0
        csv << [
          student.code,
          student.full_name(:reverse),
          grade_levels[student.grade],
          student_total_hours.round(2),
          student_approved_hours.round(2)
        ]
      end
    end
  end

  private
    def students
      @students ||= @school.students
        .current_status(@school, :current)
        .by_grade(@grades)
        .by_classroom(@classrooms)
    end

    def grade_levels
      @grade_levels ||= @school.grades_hash
    end

    def service_logs
      @school.service_student_logs
        .by_date_range(date_range(@dates))
        .by_student_ids(students.pluck(:id))
    end

    def total_hours
      @total_hours ||= service_logs.group(:student_id).sum(:hours)
    end

    def approved_hours
      @approved_hours ||= service_logs.approved.group(:student_id).sum(:hours)
    end
end
