module OneRoster::ClassroomScoped
  extend ActiveSupport::Concern
  include OneRoster::CourseScoped
  include OneRoster::SchoolScoped

  private
    def class_name(classroom)
      return classroom.name if oauth_application.class_name_token.nil?

      title = oauth_application.class_name_token.gsub('<class_name>', classroom.name)
      title = title.gsub('<school_year>', current_school_year.name)
      title.gsub('<period_name>', classroom.period&.name || '')
    end

    def classroom_props(classroom)
      {}.tap do |props|
        props[:sourcedId] = encode_source_id(:classroom, classroom.id)
        props[:status] = :active
        props[:title] = class_name(classroom)
        props[:classType] = classroom.homeroom? ? :homeroom : :scheduled
        props[:location] = classroom.room&.name if classroom.room&.name.present?
        props[:grades] = [classroom.ceds_grade] if classroom.ceds_grade
        props[:course] = course_references(classroom.course.first) if classroom.course.first
        props[:periods] = classroom.periods.map(&:order) if classroom.periods.present?
        props[:school] = school_references
        props[:terms] = term_references(classroom)
        props[:dateLastModified] = classroom.updated_at.iso8601
      end
    end

    def classroom_references(classroom)
      {}.tap do |props|
        props[:sourcedId] = encode_source_id(:classroom, classroom.id)
        props[:href] = "#{site_url}/classes/#{props[:sourcedId]}"
        props[:type] = :class
      end
    end

    def term_references(classroom)
      current_school.school_config.semesters.keys.map do |semester|
        next unless classroom.semester == :full_year || classroom.semester == semester

        {}.tap do |props|
          props[:sourcedId] = encode_source_id("term_#{current_school_year.id}", semester)
          props[:href] = "#{site_url}/terms/#{props[:sourcedId]}"
          props[:type] = :term
        end
      end.compact
    end

    def endpoint_props
      [
        :sourcedId,
        :status,
        :title,
        :classType,
        :location,
        :grades,
        :course,
        :periods,
        :school,
        :terms,
        :dateLastModified
      ]
    end
end
