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

  def endpoint
    'idoe/studentaccommodations'
  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)
      assessment_namespace = if accommodation.assessment == 'wida'
        'https://wida.wisc.edu'
      else
        'https://www.cambiumassessment.com'
      end

      {
        assessmentAccommodationReference: {
          accommodationDescriptor: accommodation_url(accommodation.accommodation_descriptor),
          assessmentIdentifier: accommodation.decorate.assessment_label,
          namespace: assessment_namespace
        },
        educationOrganizationReference: {
          educationOrganizationId: organization_id.number
        },
        studentReference: {
          studentUniqueId: accommodation.student.state_id
        }
      }
    end
end
