class OneRoster::EnrollmentsController < OneRoster::Controller
  include OneRoster::ClassroomScoped
  include OneRoster::EnrollmentScoped
  include OneRoster::UserScoped

  before_action :authorize_roster_scope
  before_action :validate_school_id, only: :index
  after_action :set_total_count_header, only: :index

  def index
    data = bind_and_parse(enrollments.map { |e| enrollment_props(e, :references) })
    render_success :ok, json: { enrollments: data }
  end

  def show
    render_success :ok, json: { enrollment: enrollment_props(enrollment, :references) }
  end

  private
    def enrollments
      @enrollments ||= enrollment_students + enrollment_teachers
    end

    def enrollment_students
      @enrollment_students ||= current_school.class_students
        .preload(:classroom, student: :user)
        .joins(:student)
        .by_classroom_type([:day_long, :period_long, :general])
        .with_user
        .distinct
    end

    def enrollment_teachers
      @enrollment_teachers ||= current_school.class_teachers
        .preload(:classroom, :employee)
        .joins(:employee)
        .by_classroom_type([:day_long, :period_long, :general])
        .distinct
    end

    def enrollment
      @enrollment ||= current_school.send(model).find_by(id: id)
    end

    def set_total_count_header
      response.set_header('X-Total-Count', enrollments.count.to_s)
    end
end
