class EdFi::Indiana::Sandbox::TranscriptLogsService <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    student_ids = []
    transcript_ids = []
    entire_grade_range.each do |grade|
      student_ids << students_by_grade[grade]&.map(&:id) if students_by_grade[grade]
      transcript_ids << transcripts_by_grade[grade]&.map(&:id) if transcripts_by_grade[grade]
    end
    value = logs.find_all do |log|
      log.associated_type == 'Student' &&
        student_ids.flatten.include?(log.associated_id)
    end
    value += logs.find_all do |log|
      log.associated_type == 'StudentTranscript' &&
        transcript_ids.flatten.include?(log.associated_id)
    end
    value
  end

  private
    def logs
      @logs ||= school_year.ed_fi_logs
        .by_endpoints(['transcript'])
        .where.not(status_code: nil)
        .where('status_code < 500')
        .ordered
    end

    def grade_range
      {
        'preschool' => [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1],
        'primary' => [0, 1, 2, 3, 4, 5],
        'middle' => [6, 7, 8],
        'secondary' => [9, 10, 11, 12]
      }
    end

    def entire_grade_range
      arr = []
      @params[:grade].each { |grade| arr.push(grade_range[grade]) }
      @entire_grade_range ||= arr.flatten
    end

    def students_by_grade
      @students_by_grade ||=
        school_year.students.where(grade: entire_grade_range).group_by(&:grade)
    end

    def transcripts_by_grade
      @transcripts_by_grade ||=
        school.student_transcripts
          .where(school_year: school_year, grade: entire_grade_range)
          .group_by(&:grade)
    end
end
