local ABTestHelper = {}

ABTestHelper.VARIATION_B = 2
ABTestHelper.VARIATION_C = 3
ABTestHelper.VARIATION_D = 4
ABTestHelper.VARIATION_E = 5

local SUBJECT_TYPE_USERID = 1

local PlayersService = game:GetService("Players")
local HttpRbxApiService = game:GetService('HttpRbxApiService')
local HttpService = game:GetService('HttpService')

local BaseUrl = game:GetService('ContentProvider').BaseUrl:lower()
BaseUrl = string.gsub(BaseUrl, "/m.", "/www.")
BaseUrl = string.gsub(BaseUrl, "http:", "https:")
local AbTestEnrollmentsUrl = string.gsub(BaseUrl, 'www', 'abtesting') ..'v1/enrollments'

local LocalPlayer = PlayersService.LocalPlayer
while not LocalPlayer do
  PlayersService.PlayerAdded:wait()
  LocalPlayer = PlayersService.LocalPlayer
end

-- Returns the Variation of the given AB test the LocalPlayer is enrolled in. 
-- Only checks AB tests by UserId, does not support BrowserTrackerId. 
function ABTestHelper.GetTestEnrollmentAsync(abTestName)
  local abTestRequest = {
    {
      ["ExperimentName"] = abTestName,
      ["SubjectType"] = SUBJECT_TYPE_USERID,
      ["SubjectTargetId"] = LocalPlayer.UserId,
    }
  }
  
  local jsonPostBody = HttpService:JSONEncode(abTestRequest)
  local success, abTestEnrollmentsResponse = pcall(function()
    return HttpRbxApiService:PostAsyncFullUrl(AbTestEnrollmentsUrl, jsonPostBody) 
  end)
  if success then
    local abTestEnrollments = HttpService:JSONDecode(abTestEnrollmentsResponse)
    if abTestEnrollments and abTestEnrollments.data then
      local enrollment = abTestEnrollments.data[1]
      return enrollment.Variation
    end
  else
    warn("Error getting ABTestEnrollment: ", abTestEnrollmentsResponse)
  end
  
  return false
end

return ABTestHelper
