#pragma once #include "local_ads/event.hpp" #include "base/thread.hpp" #include #include #include #include #include #include #include #include namespace local_ads { using ServerSerializer = std::function(std::list const & events, std::string const & userId, std::string & contentType, std::string & contentEncoding)>; class Statistics final { public: struct PackedData { int64_t m_mercator = 0; uint32_t m_featureIndex = 0; uint32_t m_seconds = 0; uint16_t m_accuracy = 0; uint8_t m_eventType = 0; uint8_t m_zoomLevel = 0; }; Statistics(); void Startup(); void RegisterEvent(Event && event); void RegisterEvents(std::list && events); // Save the event synchronously (for lightweight frawework only). void RegisterEventSync(Event && event); void SetEnabled(bool isEnabled); std::list WriteEventsForTesting(std::list const & events, std::string & fileNameToRebuild); std::list ReadEventsForTesting(std::string const & fileName); void ProcessEventsForTesting(std::list const & events); void CleanupAfterTesting(); private: using MetadataKey = std::pair; struct Metadata { std::string m_fileName; Timestamp m_timestamp; Metadata() = default; Metadata(std::string const & fileName, Timestamp const & timestamp) : m_fileName(fileName), m_timestamp(timestamp) {} }; void IndexMetadata(); void ExtractMetadata(std::string const & fileName); void BalanceMemory(); std::list WriteEvents(std::list & events, std::string & fileNameToRebuild); void ProcessEvents(std::list & events); void SendToServer(); void SendFileWithMetadata(MetadataKey && metadataKey, Metadata && metadata); std::string const m_userId; bool m_isEnabled = false; std::map m_metadataCache; }; } // namespace local_ads