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

  def endpoint
    'ed-fi/courseofferings'
  end

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

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

    def props(object)
      school_config.semesters.keys.each do |semester|
        if object.is_a?(Classroom)
          next if object.period_long? && object.semester != :full_year &&
            object.semester != semester

          code = object.course_number
        else
          year_round = true
          code = object.code
        end

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

        data = {
          courseReference: {
            educationOrganizationId: 1088000000,
            courseCode: code
          },
          schoolReference: {
            schoolId: state_id.number
          },
          sessionReference: {
            schoolId: state_id.number,
            schoolYear: school_year.academic_year,
            sessionName: "#{school_year.academic_year} #{term}"
          },
          localCourseCode: code
        }

        rest_client_request(data.to_json)
        break if year_round
      end
    end

    def rest_client_request(body)
      RestClient::Request.execute(
        method: :post,
        url: url,
        headers: headers,
        payload: body
      )
    rescue RestClient::Exception => e
      return if e.response&.body.blank?

      tmp_endpoint = endpoint.to_s.split('/').last
      school.ed_fi_course_error_logs.create(
        school_year: school_year,
        endpoint: tmp_endpoint,
        json: body,
        response: e.response.body,
        status_code: e.response.code
      )
      false
    end

    # This commented code will overwrite what is written upon.
    # Code above is written to satisfy IN until courses/classrooms are integrated fully in 3.0.

    # def call
    #   courses.each { |c| props(c) }
    # end

    # def delete
    #   @params[:ids].each { |id| rest_client_request(:delete, "#{url}/#{id}", @params[:course]) }
    # end

    # def endpoint
    #   :courseofferings
    # end

    # private
    #   def courses
    #     school.courses
    #       .includes(:ed_fi_ids, :classrooms)
    #       .joins(:classrooms)
    #       .where.not(state_descriptor: nil)
    #       .distinct
    #   end

    #   def state_descriptors
    #     @state_descriptors ||= descriptor_service(:courses)
    #       .map { |d| [d['id'], d['code']] }
    #       .to_h
    #   end

    #   def props(course)
    #     school_config.semesters.keys.each do |semester|
    #       term = course.ed_fi_id_descriptor(semester)
    #       data = {
    #         courseReference: {
    #           educationOrganizationId: 1088000000,
    #           courseCode: state_descriptors[course.state_descriptor]
    #         },
    #         schoolReference: {
    #           schoolId: state_id.number
    #         },
    #         sessionReference: {
    #           schoolId: state_id.number,
    #           schoolYear: school_year.academic_year,
    #           sessionName: "uri://doe.in.gov/TermDescriptor##{term}"
    #         },
    #         localCourseCode: course.id
    #       }

    #       ed_fi_id = course.ed_fi_ids.find { |e| 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, course, body: data.to_json)
    #       next if ed_fi_id || response.nil?

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