local Players = game:GetService("Players")
local Stats = game:GetService("Stats")

local EmotesAnalytics = {}
EmotesAnalytics.__index = EmotesAnalytics

EmotesAnalytics.EventName = {
	MenuOpened = "emoteMenuOpened",
	EmotePlayed = "emoteTriggered",
}

function EmotesAnalytics.new()
	local self = {
		eventStreamImpl = nil,
	}
	setmetatable(self, EmotesAnalytics)

	return self
end

function EmotesAnalytics:withEventStream(eventStreamImpl)
	self.eventStreamImpl = eventStreamImpl
	return self
end

function EmotesAnalytics:onMenuOpened()
    local eventContext = "emoteMenu"
    local eventName = self.EventName.MenuOpened

	local additionalArgs = {
        pid = tostring(game.PlaceId),
        uid = tostring(Players.LocalPlayer.UserId),
        btid = Stats:GetBrowserTrackerId(),
    }

	self:_getEventStream():setRBXEventStream(eventContext, eventName, additionalArgs)
end

function EmotesAnalytics:onEmotePlayed(slotNumber, assetId)
    local eventContext = "emoteMenu"
    local eventName = self.EventName.EmotePlayed

	local additionalArgs = {
        pid = tostring(game.PlaceId),
        uid = tostring(Players.LocalPlayer.UserId),
        btid = Stats:GetBrowserTrackerId(),
        slotNumber = slotNumber,
        assetID = assetId,
    }

	self:_getEventStream():setRBXEventStream(eventContext, eventName, additionalArgs)
end

function EmotesAnalytics:_getEventStream()
    assert(self.eventStreamImpl, "EventStream implementation not found. Did you forget to construct withEventStream?")
	return self.eventStreamImpl
end

return EmotesAnalytics