class EdFi::Indiana::Sandbox::StudentSpecialEducationProgramAssociationsService <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    query.each { |p| create_or_update(p, props(p)) }
  end

  def delete
    rest_client_request(:delete, "#{url}/#{@params[:id]}", @params[:program])
  end

  def endpoint
    'ed-fi/studentspecialeducationprogramassociations'
  end

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

    def programs
      EdFi::StateProgram
        .where(student_id: student_ids, school_year: school_year)
        .by_program(:special_education)
    end

    def query
      programs.where(start_date: school_year_range)
        .or(programs.where(end_date: [school_year_range, nil]))
    end

    def program_descriptors
      @program_descriptors ||= descriptor_service(:programs).pluck('id', 'programName').to_h
    end

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

    def exit_url(descriptor_id)
      return unless descriptor_id

      "uri://doe.in.gov/ReasonExitedDescriptor##{exit_descriptors[descriptor_id]}"
    end

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

    def disability_url(descriptor_id)
      return unless descriptor_id

      label = disability_descriptors[descriptor_id]
      "uri://doe.in.gov/DisabilityDescriptor##{label}"
    end

    def props(program)
      program_title = program.program.titleize
      program_namespace = "uri://ed-fi.org/ProgramTypeDescriptor##{program_title}"
      data = {
        educationOrganizationReference: {
          educationOrganizationId: organization_id.number
        },
        programReference: {
          educationOrganizationId: '1088000000',
          programTypeDescriptor: program_namespace,
          programName: program_descriptors[program.program_descriptor]
        },
        studentReference: {
          studentUniqueId: program.student.state_number.number
        },
        beginDate: program.start_date.strftime('%Y/%m/%d'),
        endDate: program.end_date&.strftime('%Y/%m/%d'),
        ideaEligibility: true,
        reasonExitedDescriptor: exit_url(program.exit_descriptor),
        disabilities: disability_props(program)
      }
    end

    def disability_props(program)
      [].tap do |disabilities|
        disabilities << {
          disabilityDescriptor: disability_url(program.disability_descriptor),
          orderOfDisability: 1
        }
        return disabilities if program.disability_2_descriptor.nil?
        return disabilities if disability_descriptors[program.disability_2_descriptor].blank?

        disabilities << {
          disabilityDescriptor: disability_url(program.disability_2_descriptor),
          orderOfDisability: 2
        }
      end
    end
end
