module SMARTAppLaunch::MockSMARTServer::SMARTIntrospectionResponseCreation

def make_smart_introspection_response

def make_smart_introspection_response
  target_token = request.params[:token]
  introspection_inactive_response_body = { active: false }
  return introspection_inactive_response_body if MockSMARTServer.token_expired?(target_token)
  
  token_requests = Inferno::Repositories::Requests.new.tagged_requests(test_run.test_session_id, [TOKEN_TAG])
  original_response_body = nil
  original_token_request = token_requests.find do |request|
    next unless request.status == 200
    original_response_body = JSON.parse(request.response_body)
    [original_response_body['access_token'], original_response_body['refresh_token']].include?(target_token)
  end
  return introspection_inactive_response_body unless original_token_request.present?
  decoded_token = MockSMARTServer.decode_token(target_token)
  introspection_active_response_body = {
    active: true,
    client_id: decoded_token['client_id'],
    exp: decoded_token['expiration']
  }
  original_response_body.each do |element, value|
    next if ['access_token', 'refresh_token', 'token_type', 'expires_in'].include?(element)
    next if introspection_active_response_body.key?(element)
    introspection_active_response_body[element] = value
  end
  if original_response_body.key?('id_token')
    user_claims, _header = JWT.decode(original_response_body['id_token'], nil, false)
    introspection_active_response_body['iss'] = user_claims['iss']
    introspection_active_response_body['sub'] = user_claims['sub']
    introspection_active_response_body['fhirUser'] = user_claims['fhirUser'] if user_claims['fhirUser'].present?
  end
  
  introspection_active_response_body
end