class EdFi::Indiana::Sandbox::StaffEmploymentAssociationService <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    employees.each { |e| props(e) }
  end

  def endpoint
    'ed-fi/staffeducationorganizationemploymentassociations'
  end

  private
    def employees
      school.employees
        .preload(:state_id, :detail, :race, :title, :oldest_position, recent_position: :position)
        .joins(:positions, :state_id)
        .position_within_date_range(semester_range)
    end

    def semester_range
      semester = school.school_config.trimesters? ? 2 : school_year.current_semester
      school_year.semester_date_range(semester)
    end

    def organization_id
      @organization_id ||= school.additional_ids.school.first
    end

    def employment_descriptors
      descriptor_service(:employmentstatusdescriptors)
    end

    def employment_statuses
      @employment_statuses ||= employment_descriptors.map { |d| [d['id'], d['codeValue']] }.to_h
    end

    def status_url(id)
      "uri://ed-fi.org/EmploymentStatusDescriptor##{employment_statuses[id]}"
    end

    def props(employee)
      recent_position = employee.recent_position
      return if recent_position.position.edfi_id.blank?

      oldest_position = employee.oldest_position
      full_time = case employee.detail&.ncea_status
      when 'full_time'
        1
      when 'part_time'
        0.5
      else
        0
      end

      data = {
        educationOrganizationReference: {
          educationOrganizationId: organization_id.number
        },
        staffReference: {
          staffUniqueId: employee.state_id.number
        },
        employmentStatusDescriptor: status_url(recent_position.employment_descriptor),
        hireDate: oldest_position.start_date,
        fullTimeEquivalency: full_time,
        _ext: {
          IDOE: {
            yearsOfPriorProfessionalExperience: employee.service_years
          }
        }
      }

      rest_client_request(:post, url, employee, body: data.to_json)
    end
end
