module OneRoster::UserScoped
  extend ActiveSupport::Concern
  include OneRoster::SchoolScoped

  private
    def current_student_ids
      @current_student_ids ||= current_school_year.school_year_students
        .where(student: @student || @students, current: true)
        .pluck(:student_id)
    end

    def student_grades(student)
      if current_student_ids.include?(student.id)
        student.ceds_grade
      else
        student.ceds_grade(student.most_recent_grade)
      end
    end

    def teacher?(id)
      return @teacher if @teacher.present?

      current_school.class_teachers.by_teachers(id)
    end

    def user_props(source, current_ids=[])
      if source.class.name == 'Student'
        status = current_ids.include?(source.id) ? :active : :tobedeleted
        user = source.user
        is_student = true
      else
        user = source
        status = :active
        is_student = false
      end

      {}.tap do |props|
        props[:dateLastModified] = source.updated_at&.iso8601
        props[:sourcedId] = encode_source_id(source.class.name.downcase, source.id)
        props[:identifier] = source.id
        props[:username] = user.username
        props[:enabledUser] = (user && user&.active?).present?
        props[:givenName] = source.first_name
        props[:familyName] = source.last_name
        props[:middleName] = source.middle_name if source.middle_name?
        props[:email] = source.email
        props[:grade] = student_grades(source) if is_student
        props[:orgs] = [school_references]
        props[:status] = status
        props[:role] =
          if is_student
            :student
          elsif teacher?(user.id)
            :teacher
          else
            user.role
          end
      end
    end

    def user_references(source)
      {}.tap do |props|
        props[:sourcedId] = encode_source_id(source.class.name.downcase, source.id)
        props[:href] = "#{site_url}/users/#{props[:sourcedId]}"
        props[:type] = :user
      end
    end

    def endpoint_props
      [
        :dateLastModified,
        :sourcedId,
        :identifier,
        :username,
        :enabledUser,
        :givenName,
        :familyName,
        :middleName,
        :email,
        :grade,
        :orgs,
        :status,
        :role
      ]
    end
end
