class Csv::AppleManager::ClassroomService < Csv::ApplicationService
  def initialize(school)
    @school = school
  end

  def call
    CSV.generate do |csv|
      csv << headers
      classrooms.each do |classroom|
        csv << content(classroom)
      end
    end
  end

  private
    def classrooms
      @school.classrooms
        .joins(:location)
        .preload(:class_teachers)
        .where.not(course_number: ['', ' '])
    end

    def max_teacher_count
      @max_teacher_count ||= @school.class_teachers
        .joins(classroom: :location)
        .where.not(user_id: 0, Classes: { Course: ['', ' '] })
        .group(:class_id)
        .count
        .values
        .max
    end

    def headers
      data = [
        'class_display_name',
        'class_id',
        'class_number',
        'course_id',
        'instructor_id'
      ]

      data += (max_teacher_count - 1).times.map { |n| "instructor_id_#{2 + n}" }
      data + ['location_id']
    end

    def content(classroom)
      data = [
        classroom.name,
        classroom.id,
        nil,
        classroom.course_number
      ]

      data << classroom.primary_teacher_id if classroom.primary_teacher_id?

      classroom.class_teachers.each do |class_teacher|
        next if !class_teacher.user_id? || class_teacher.user_id == classroom.primary_teacher_id

        data << class_teacher.user_id
      end

      data += Array.new((max_teacher_count - classroom.class_teachers.size))
      data + [classroom.location_id]
    end
end
