class EdFi::Indiana::Sandbox::StudentAccommodationService <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    accommodations.each { |a| create_or_update(a, props(a)) }
  end

  def endpoint
    'idoe/studenteducationorganizationassessmentaccommodations'
  end

  private
    def student_ids
      @student_ids ||= school_year_students.pluck(:student_id)
    end

    def accommodations
      school_year.ed_fi_accommodations
        .includes(:student)
        .where(student_id: student_ids)
    end

    def accommodation_descriptors
      @accommodation_descriptors ||= descriptor_service(:accommodationDescriptors)
        .pluck('id', 'codeValue')
        .to_h
    end

    def academic_subject_descriptors
      @academic_subject_descriptors ||= descriptor_service(:academicSubjectDescriptors)
        .pluck('id', 'codeValue')
        .to_h
    end

    def academic_subject_url(descriptor_id)
      return unless descriptor_id

      'uri://doe.in.gov/AcademicSubjectDescriptor#'\
      "#{academic_subject_descriptors[descriptor_id]}"
    end

    def accommodation_url(descriptor_id)
      return unless descriptor_id

      'uri://doe.in.gov/AccommodationDescriptor#'\
      "#{accommodation_descriptors[descriptor_id]}"
    end

    def props(accommodation)
      {
        educationOrganizationReference: {
          educationOrganizationId: organization_id.number
        },
        studentReference: {
          studentUniqueId: accommodation.student.state_id
        },
        assessmentReference: {
          assessmentIdentifier: accommodation.decorate.assessment_label,
          namespace: "uri://idoe.gov/assessment/#{accommodation.assessment.remove('_')}"
        },
        academicSubjectDescriptor:
          academic_subject_url(accommodation.academic_subject_descriptor),
        accommodationDescriptor: accommodation_url(accommodation.accommodation_descriptor)
      }
    end
end
