class EdFi::Indiana::Sandbox::CourseSectionService < EdFi::Indiana::Sandbox::ApplicationService
  def call
    ed_fi_classes.each { |c| props(c) }
    class_subjects.each { |c| props(c) }
  end

  def endpoint
    'ed-fi/sections'
  end

  private
    def ed_fi_classes
      school.classrooms
        .preload(ed_fi_ids: :school_year)
        .joins(:school_state_classroom)
        .by_type(['period_long'])
        .where.not(course_number: ['', ' '])
    end

    def class_subjects
      school.class_subjects
        .preload(ed_fi_ids: :school_year, classroom: :ed_fi_ids)
        .joins(classroom: :school_state_classroom)
        .where("Classes.type = '1' OR Classes.type = '-1'")
        .where.not(code: ['', ' '])
    end

    def props(object)
      if object.is_a?(Classroom)
        classroom = object
        code = object.course_number
      else
        classroom = object.classroom
        code = object.code
        year_round = true
      end

      has_entry = false
      terms = if year_round
        { 1 => 'Year Round' }
      elsif school.school_config.semesters?
        { 1 => 'Fall Semester', 2 => 'Spring Semester' }
      else
        { 1 => 'First Trimester', 2 => 'Second Trimester', 3 => 'Third Trimester' }
      end

      school_config.semesters.each_key do |semester|
        next unless classroom.semester == :full_year || classroom.semester == semester || year_round
        break if year_round && has_entry

        data = {
          courseOfferingReference: {
            schoolId: state_id.number,
            localCourseCode: code,
            schoolYear: school_year.academic_year,
            sessionName: "#{school_year.academic_year} #{terms[semester]}"
          },
          schoolReference: {
            schoolId: state_id.number
          },
          availableCredits: classroom.credit,
          sequenceOfCourse: semester,
          sectionIdentifier: classroom.period_long? ? classroom.id : object.id
        }

        ed_fi_id = object.ed_fi_ids
          .find { |e| e.school_year == school_year && e[:descriptor] == semester }
        if ed_fi_id
          method = :put
          path = "#{url}/#{ed_fi_id.number}"
        else
          method = :post
          path = url
        end

        response = rest_client_request(method, path, object, body: data.to_json)
        has_entry = true
        next if ed_fi_id || response.nil?

        edfi_id = response.headers[:location].split('/').last
        object.ed_fi_ids.create(
          number: edfi_id,
          endpoint: endpoint,
          descriptor: semester,
          school_year: school_year
        )
      end
    end
end
