package com.gh.gamecenter.common.utils

import android.app.Application
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.entity.SensorsEvent
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.json.json
import com.gh.gamecenter.core.provider.ISensorsProvider
import com.gh.gamecenter.core.utils.SPUtils
import com.therouter.TheRouter
import org.json.JSONObject

/**
 * 调用神策相关 API 的桥梁
 */
object SensorsBridge {

    const val KEY_GAME_ID = "game_id"
    const val KEY_GAME_NAME = "game_name"
    private const val KEY_PAGE_NAME = "page_name"
    private const val KEY_PAGE_ID = "page_id"
    private const val KEY_PAGE_BUSINESS_ID = "page_business_id"
    private const val KEY_LAST_PAGE_ID = "last_page_id"
    private const val KEY_LAST_PAGE_NAME = "last_page_name"
    private const val KEY_LAST_PAGE_BUSINESS_ID = "last_page_business_id"
    private const val KEY_DOWNLOAD_STATUS = "download_status"
    private const val KEY_DOWNLOAD_TYPE = "download_type"
    private const val KEY_GAME_SCHEMA_TYPE = "game_schema_type"
    private const val KEY_GAME_TYPE = "game_type"
    const val KEY_POSITION = "position"
    const val KEY_TAB_CONTENT = "tab_content"
    private const val KEY_TITLE = "title"
    private const val KEY_GAME_TAG = "game_tag"
    const val KEY_LINK_TYPE = "link_type"
    const val KEY_LINK_ID = "link_id"
    const val KEY_LINK_TEXT = "link_text"
    private const val KEY_ACTION = "action"
    private const val KEY_CLICK_GAME_ID = "click_game_id"
    private const val KEY_CLICK_GAME_NAME = "click_game_name"
    private const val KEY_CLICK_GAME_TYPE = "click_game_type"
    private const val KEY_TEXT = "text"
    const val KEY_GAME_COLLECT_TITLE = "game_collect_title"
    const val KEY_GAME_COLLECT_ID = "game_collect_id"
    private const val KEY_BUTTON_NAME = "button_name"
    private const val KEY_PLATFORM = "platform"
    private const val KEY_LOCATION = "location"
    private const val KEY_BLOCK_NAME = "block_name"
    private const val KEY_BLOCK_ID = "block_id"
    private const val KEY_LINK_CONTENT_COLLECTION_NAME = "link_content_collection_name"
    private const val KEY_LINK_CONTENT_COLLECTION_ID = "link_content_collection_id"
    private const val KEY_COLUMN_COLLECTION_NAME = "column_collection_name"
    private const val KEY_COLUMN_COLLECTION_ID = "column_collection_id"
    private const val KEY_GAME_COLUMN_NAME = "game_column_name"
    private const val KEY_GAME_COLUMN_ID = "game_column_id"
    private const val KEY_SOURCE_ENTRANCE = "source_entrance"
    private const val KEY_SOURCE = "source"
    private const val KEY_SEARCH_CONTENT = "search_content"
    private const val KEY_SEARCH_TYPE = "search_type"
    private const val KEY_SEARCH_RESULT = "search_result"
    private const val KEY_IS_NOT_PROMPT = "is_not_prompt"
    private const val KEY_SESSION_MESSAGE_TYPE = "session_message_type"
    private const val KEY_REMINDER_TYPE = "reminder_type"
    private const val KEY_MESSAGE_TYPE = "message_type"
    private const val KEY_DIALOG_REMINDER_TIME = "dialog_reminder_time"
    private const val KEY_DIALOG_CLOSE = "dialog_close"
    private const val KEY_POST_RESULT = "post_result"
    private const val KEY_RESULT = "result"
    private const val KEY_BBS_ID = "bbs_id"
    private const val KEY_BBS_TYPE = "bbs_type"
    private const val KEY_FORUM_NAME = "forum_name"
    private const val KEY_CUSTOMER_TYPE = "customer_type"
    private const val KEY_ARTICLE_ID = "article_id"
    private const val KEY_ARTICLE_TYPE = "article_type"
    private const val KEY_ACTIVITY_TAG = "activity_tag"
    private const val KEY_GAME_FORUM_TYPE = "game_forum_type"
    private const val KEY_STAY_LENGTH = "stay_length"
    private const val KEY_SHARE_TYPE = "share_type"
    const val KEY_IS_FIRST_TIME = "\$is_first_time"
    private const val KEY_TAB_TYPE = "tab_type"
    private const val KEY_BANNER_NAME = "banner_name"
    private const val KEY_TOPPING_TYPE = "topping_type"
    private const val KEY_FORUM_TYPE = "forum_type"
    private const val KEY_ADVERTISEMENT_TYPE = "advertisement_type"
    private const val KEY_USER_ID = "ghuser_id"
    private const val KEY_USER_NAME = "user_name"
    private const val KEY_VERIFICATION_TYPE = "verification_type"
    private const val KEY_VIDEO_ID = "video_id"
    private const val KEY_PLAY_TYPE = "play_type"
    private const val KEY_LABEL_NAME = "label_name"
    private const val KEY_LABEL_ID = "label_id"
    const val KEY_BOTTOM_TAB = "bottom_tab"
    const val KEY_MULTI_TAB_NAME = "several_tab_page_name"
    const val KEY_MULTI_TAB_ID = "several_tab_page_id"
    const val KEY_CUSTOM_PAGE_ID = "custom_page_id"
    const val KEY_CUSTOM_PAGE_NAME = "custom_page_name"
    private const val KEY_SEARCH_BOX_PATTERN = "search_box_pattern"
    private const val KEY_ENTRANCE = "entrance"
    private const val KEY_BUTTON_TYPE = "button_type"
    const val KEY_MODULE_TYPE = "module_type"
    const val KEY_MODULE_PATTERN = "module_pattern"
    const val KEY_MODULE_NAME = "module_name"
    const val KEY_LINK_CONTENT_NAME = "link_content_name"
    const val KEY_LINK_CONTENT_ID = "link_content_id"
    private const val KEY_GAME_LIST_COLLECTION_ID = "game_list_collection_id"
    private const val KEY_GAME_LIST_COLLECTION_NAME = "game_list_collection_name"
    const val KEY_MONGOLD_ID = "mongold_id"
    private const val KEY_GAME_COLLECT_PATTERN = "game_collect_pattern"
    private const val KEY_LINK_CONTENT_COLLECTIONE_PATTERN = "link_content_collectione_pattern"
    private const val KEY_COLUMN_COLLECTIONE_PATTERN = "column_collectione_pattern"
    private const val KEY_COLUMN_PATTERN = "column_pattern"
    private const val KEY_SEQUENCE = "sequence"
    private const val KEY_NUMBER = "number"
    private const val KEY_APP_LIST = "app_list"
    private const val KEY_FILTER_NAME = "filter_name"
    private const val KEY_CONTENT_TITLE = "content_title"
    private const val KEY_USER_ID_2 = "user_id"
    private const val KEY_BBS_NAME = "bbs_name"
    private const val KEY_CONTENT_TYPE = "content_type"
    private const val KEY_DOWNLOAD_TASK_STATUS = "download_task_status"
    private const val KEY_CONTENT_ID = "content_id"
    private const val KEY_CONTENT_NAME = "content_name"
    private const val KEY_PROFILE = "profile"
    private const val KEY_WECHAT_REMIND = "wechat_remind"
    private const val KEY_MESSAGE_REMIND = "message_remind"
    private const val KEY_AUTOMATIC_DOWNLOAD = "automatic_download"
    private const val KEY_PACKAGE_NAME = "package_name"
    private const val KEY_MEMBER_TYPE = "member_type"
    private const val KEY_DISTRICT_SERVER = "district_server"
    private const val KEY_SCENE_TYPE = "scene_type"
    private const val KEY_SET_MENU_NAME = "set_menu_name"
    private const val KEY_PAYMENT_AMOUNT = "payment_amount"
    private const val KEY_PAYMENT_TYPE = "payment_type"
    const val EVENT_NAME = "event_name"
    private const val KEY_CALENDAR_REMIND = "calendar_remind"
    private const val KEY_CLASSIFICATION_ID = "classification_id"
    private const val KEY_CLASSIFICATION_NAME = "classification_name"
    private const val KEY_INTERACTION_TYPE = "interaction_type"
    private const val KEY_WECHAT_APPID = "wechat_appid"
    private const val KEY_IS_AD = "is_ad"
    private const val KEY_AD_ID = "ad_id"
    private const val KEY_AD_GROUP_ID = "ad_group_id"

    private const val EVENT_GAME_DETAIL_PAGE_TAB_SELECT = "GameDetailPageTabSelect"
    private const val EVENT_GAME_DETAIL_PAGE_TAG_CLICK = "GameDetailPageGameTagClick"
    private const val EVENT_GAME_DETAIL_PAGE_MAJOR_EVENT_CLICK = "GameDetailPageMajorEventClick"
    private const val EVENT_GAME_DETAIL_PAGE_RELATED_GAME_CLICK = "GameDetailPageRelatedGameClick"
    private const val EVENT_ADOLESCENT_MODE_DIALOG_SHOW = "AdolescentModeDialogShow"
    private const val EVENT_ADOLESCENT_MODE_DIALOG_CLICK = "AdolescentModeDialogClick"
    private const val EVENT_SWITCH_INSTALL_DIALOG_SHOW = "SwitchInstallDialogShow"
    private const val EVENT_SWITCH_INSTALL_DIALOG_CLICK = "SwitchInstallDialogClick"
    private const val EVENT_PKG_CHECK_DIALOG_SHOW = "PkgCheckDialogShow"
    private const val EVENT_PKG_CHECK_DIALOG_CLICK = "PkgCheckDialogClick"
    private const val EVENT_GAME_DOWNLOAD_DIALOG_SHOW = "GameDownloadDialogShow"
    private const val EVENT_GAME_DOWNLOAD_DIALOG_CLICK = "GameDownloadDialogClick"
    private const val EVENT_GAME_DEMO_DIALOG_SHOW = "GameDemoDialogShow"
    private const val EVENT_GAME_DEMO_DIALOG_CLICK = "GameDemoDialogClick"
    private const val EVENT_OVERSEAS_ADDRESS_DIALOG_SHOW = "OverseasAddressDialogShow"
    private const val EVENT_OVERSEAS_ADDRESS_DIALOG_CLICK = "OverseasAddressDialogClick"
    private const val EVENT_NETWORK_CHECK_DIALOG_SHOW = "NetworkCheckDialogShow"
    private const val EVENT_NETWORK_CHECK_DIALOG_CLICK = "NetworkCheckDialogClick"
    private const val EVENT_DOWNLOAD_MOBILE_DATA_DIALOG_SHOW = "DownloadMobileDataDialogShow"
    private const val EVENT_DOWNLOAD_MOBILE_DATA_DIALOG_CLICK = "DownloadMobileDataDialogClick"
    private const val EVENT_DOWNLOAD_LINK_ROT_DIALOG_SHOW = "DownloadLinkRotDialogShow"
    private const val EVENT_DOWNLOAD_LINK_ROT_DIALOG_CLICK = "DownloadLinkRotDialogClick"
    private const val EVENT_SIMULATOR_INSTALL_DIALOG_SHOW = "SimulatorInstallDialogShow"
    private const val EVENT_SIMULATOR_INSTALL_DIALOG_CLICK = "SimulatorInstallDialogClick"
    private const val EVENT_SIMULATOR_UPDATE_DIALOG_SHOW = "SimulatorUpdateDialogShow"
    private const val EVENT_SIMULATOR_UPDATE_DIALOG_CLICK = "SimulatorUpdateDialogClick"
    private const val EVENT_SIMULATOR_DOWNLOAD_DIALOG_SHOW = "SimulatorDownloadDialogShow"
    private const val EVENT_SIMULATOR_DOWNLOAD_DIALOG_CLOSE = "SimulatorDownloadDialogClose"
    private const val EVENT_GAME_DEPRESSION_FAILED = "GameDecompressionFailed"
    private const val EVENT_INSTALL_PERMISSION_DIALOG_SHOW = "InstallPermissionDialogShow"
    private const val EVENT_INSTALL_PERMISSION_DIALOG_CLICK = "InstallPermissionDialogClick"
    private const val EVENT_GAME_DEPRESSION_FAILED_DIALOG_SHOW = "GameDecompressionFailedDialogShow"
    private const val EVENT_GAME_DEPRESSION_FAILED_DIALOG_CLICK = "GameDecompressionFailedDialogClick"
    private const val EVENT_MIUI_OPTIMIZE_CLOSE_DIALOG_SHOW = "MiuiOptimizeCloseDialogShow"
    private const val EVENT_MIUI_OPTIMIZE_CLOSE_DIALOG_CLICK = "MiuiOptimizeCloseDialogClick"
    private const val EVENT_PLUGIN_INSTALL_DIALOG_SHOW = "PluginInstallDialogShow"
    private const val EVENT_PLUGIN_INSTALL_DIALOG_CLICK = "PluginInstallDialogClick"
    private const val EVENT_CONFLICT_SIGNATURE_INSTALL_DIALOG_SHOW = "ConflictSignatureInstallDialogShow"
    private const val EVENT_CONFLICT_SIGNATURE_INSTALL_DIALOG_CLICK = "ConflictSignatureInstallDialogClick"
    private const val EVENT_VERSION_UPDATE_DIALOG_SHOW = "VersionUpdateDialogShow"
    private const val EVENT_VERSION_UPDATE_DIALOG_CLICK = "VersionUpdateDialogClick"
    private const val EVENT_DOWNLOAD_MANAGER_ENTER = "DownloadManagerEnter"
    private const val EVENT_DOWNLOAD_MANAGER_TAB_SELECT = "DownloadManagerTabSelect"
    private const val EVENT_HALO_FUN_GAME_MANAGER_ENTER = "HaloFunGameManagerEnter"
    private const val EVENT_HALO_FUN_GAME_MANAGER_TAB_SELECT = "HaloFunGameManagerTabSelect"
    private const val EVENT_LINK_CONTENT_COLLECTION_CLICK = "LinkContentCollectionClick"
    private const val EVENT_COLUMN_COLLECTION_CLICK = "ColumnCollectionClick"
    private const val EVENT_UNLOAD_GAME_CLICK = "UnloadGameClick"
    private const val EVENT_UNLOAD_GAME_FINISH = "UnloadGameFinish"
    private const val EVENT_INSTALL_GAME_CLICK = "InstallGameClick"
    private const val EVENT_INSTALL_GAME_FINISH = "InstallGameFinish"
    private const val EVENT_SEARCH_BUTTON_CLICK = "SearchButtonClick"
    private const val EVENT_ARTICLE_SEARCH_TAB_CLICK = "ArticleSearchTabClick"
    private const val EVENT_MESSAGE_RECEIVE = "MessageReceive"
    private const val EVENT_MESSAGE_CENTER_CLICK = "MessageCenterClick"
    private const val EVENT_MESSAGE_SESSION_CLICK = "MessageSessionClick"
    private const val EVENT_MESSAGE_ITEM_CLICK = "MessageItemClick"
    private const val EVENT_MESSAGE_ITEM_LINK_CLICK = "MessageItemLinkClick"
    private const val EVENT_LAUNCH_SERVER_SUBSCRIBE_CLICK = "LaunchServerSubscribeClick"
    private const val EVENT_LAUNCH_SERVER_SUBSCRIBE_CANCEL_CLICK = "LaunchServerSubscribeCancelClick"
    private const val EVENT_LAUNCH_SERVER_REMINDER_CLICK = "LaunchServerReminderClick"
    private const val EVENT_LAUNCH_SERVER_REMINDER_CANCEL_CLICK = "LaunchServerReminderCancelClick"
    private const val EVENT_GAME_SEARCH_FIRST_GAME_BANNER_CLICK = "GameSearchFirstGameBannerClick"
    private const val EVENT_GAME_SEARCH_FIRST_GAME_CARD_CLICK = "GameSearchFirstGameCardClick"
    private const val EVENT_ARTICLE_POST_RESULT = "ArticlePostResult"
    private const val EVENT_ARTICLE_DETAILS_BROWSING = "ArticleDetailsBrowsing"
    private const val EVENT_ARTICLE_BROWSING_DURATION = "ArticleBrowsingDuration"
    private const val EVENT_ARTICLE_LIKE_CLICK = "ArticleLikeClick"
    private const val EVENT_ARTICLE_COLLECTION_CLICK = "ArticleCollectionClick"
    private const val EVENT_ARTICLE_COMMENT = "ArticleComment"
    private const val EVENT_ARTICLE_COMMENT_RESULT = "ArticleCommentResult"
    private const val EVENT_ARTICLE_REPLY = "ArticleReply"
    private const val EVENT_ARTICLE_REPLY_RESULT = "ArticleReplyResult"
    private const val EVENT_ARTICLE_SHARE = "ArticleShare"
    private const val EVENT_ARTICLE_SHARE_RESULT = "ArticleShareResult"
    private const val EVENT_VIDEO_START_PLAYING = "VideoStartPlaying"
    private const val EVENT_VIDEO_END_PLAYING = "VideoEndPlaying"
    private const val EVENT_FOLLOW_FORUM_CLICK = "FollowForumClick"
    private const val EVENT_USER_FOLLOW_CLICK = "UserFollowClick"
    private const val EVENT_VIEW_FORUM = "ViewForum"
    private const val EVENT_COMMUNITY_TOP_TAB_SELECTED = "CommunityTopTabSelected"
    private const val EVENT_FORUM_BANNER_CLICK = "ForumBannerClick"
    private const val EVENT_FORUM_DETAILS_ANNOUNCEMENT_BOARD_CLICK = "ForumDetailsAnnouncementBoardClick"
    private const val EVENT_ACCESS_VIDEO_STREAMING = "AccessVideoStreaming"
    private const val EVENT_VIDEO_STREAMING_TAB_SELECT = "VideoStreamingTabSelect"
    private const val EVENT_VIDEO_STREAMING_ADVERTISING_SPACE_CLICK = "VideoStreamingAdvertisingSpaceClick"
    private const val EVENT_MY_PAGE_BANNER_CLICK = "MyPageBannerClick"
    private const val EVENT_MOBILE_NUMBER_VERIFICATION_SHOW = "MobileNumberVerificationPageShow"
    private const val EVENT_MOBILE_NUMBER_VERIFICATION_COMPLETE = "MobileNumberVerificationComplete"
    private const val EVENT_MOBILE_NUMBER_VERIFICATION_DIALOG = "MobileNumberVerificationDialog"
    private const val EVENT_MOBILE_NUMBER_VERIFICATION_POPUP_CLICK = "MobileNumberVerificationPopupClick"
    private const val EVENT_VERIFICATION_DIALOG_SHOW = "VerificationDialogShow"
    private const val EVENT_VERIFICATION_POPUP_CLICK = "VerificationPopupClick"

    private const val EVENT_PERSONAL_HOME_PAGE_BROWSING = "PersonalHomepageBrowsing"
    private const val EVENT_FORUM_BROWSING_DURATION = "ForumBrowsingDuration"
    private const val EVENT_COMMUNITY_BROWSING_DURATION = "CommunityBrowsingDuration"
    private const val EVENT_COLUMN_CLICK = "ColumnClick"
    private const val EVENT_QQ_GAME_CLICK = "QqGameClick"
    private const val EVENT_WECHAT_GAME_CLICK = "WechatGameClick"
    private const val EVENT_GAME_LIST_COLLECTION_CLICK = "GameListCollectionClick"
    private const val EVENT_CONTENT_CARD_CLICK = "ContentCardClick"
    private const val EVENT_PLUGIN_AREA_CLICK = "PluginAreaClick"
    private const val EVENT_CW_RECENTLY_PLAYED_CLICK = "CWRecentlyPlayedClick"
    private const val EVENT_QQ_GAME_RECENTLY_PLAYED_CLICK = "QqGameRecentlyPlayedClick"
    private const val EVENT_GAME_EXPLORE_CLICK = "GameExploreClick"
    private const val EVENT_VIEW_CUSTOM_PAGE = "ViewCustomPage"
    private const val EVENT_SUSPENDED_WINDOW_SHOW = "SuspendedWindowShow"
    private const val EVENT_SUSPENDED_WINDOW_CLICK = "SuspendedWindowClick"

    private const val EVENT_INSTALLED_LIST_PERMISSIONS_DIALOG_SHOW = "InstalledListPermissionsDialogShow"
    private const val EVENT_INSTALLED_LIST_PERMISSIONS_CLICK = "InstalledListPermissionsClick"
    private const val EVENT_INSTALLED_LIST_PERMISSIONS_CUSTOM_DIALOG_SHOW = "InstalledListPermissionsCustomDialogShow"
    private const val EVENT_INSTALLED_LIST_PERMISSIONS_CUSTOM_CLICK = "InstalledListPermissionsCustomClick"
    private const val EVENT_INSTALLED_LIST_PERMISSIONS_RESULT = "InstalledListPermissionsResult"
    private const val EVENT_NUMBER_OF_INSTALLED_LIST = "NumberOfInstalledList"

    private const val EVENT_PURE_MODE_DIALOG_SHOW = "PureModeDialogShow"
    private const val EVENT_PURE_MODE_DIALOG_CLICK = "PureModeDialogClick"
    private const val EVENT_ADDED_PROTECTION_DIALOG_SHOW = "AddedProtectionDialogShow"
    private const val EVENT_ADDED_PROTECTION_DIALOG_CLICK = "AddedProtectionDialogClick"

    private const val EVENT_FOLLOW_TAB_FILTER_OPTION_CLICK = "follow_tab_filter_option_click"
    private const val EVENT_FOLLOW_PAGE_CONTENT_CLICK = "follow_page_content_click"
    private const val EVENT_RECOMMENDED_USER_FOLLOW_BUTTON_CLICK = "recommended_user_follow_button_click"
    private const val EVENT_FOLLOW_PAGE_RECOMMENDED_USER_CARD_CLICK = "follow_page_recommended_user_card_click"
    private const val EVENT_FOLLOW_TAB_BROWSE = "follow_tab_browse"
    private const val EVENT_FOLLOW_TAB_BROWSE_DURATION = "follow_tab_browse_duration"
    private const val EVENT_FOLLOW_PAGE_USER_AND_FORUM_DATA_CLICK = "follow_page_user_and_forum_data_click"

    private const val EVENT_JUMP_LAND_PAGE_ADDRESS_DIALOG_SHOW = "JumpLandPageAddressDialogShow"
    private const val EVENT_JUMP_LAND_PAGE_ADDRESS_DIALOG_CLICK = "JumpLandPageAddressDialogClick"
    private const val EVENT_GAME_SEARCH_PAGE_SHOW = "GameSearchPageShow"
    private const val EVENT_GAME_SEARCH_PAGE_TAB_CLICK = "GameSearchPageTabClick"
    private const val EVENT_GAME_SEARCH_PAGE_BUTTON_CLICK = "GameSearchPageButtonClick"
    private const val EVENT_GAME_SEARCH_RESULT_RETURN = "GameSearchResultReturn"
    private const val EVENT_GAME_SEARCH_RESULT_CLICK = "GameSearchResultClick"
    private const val EVENT_ARTICLE_SEARCH_RESULT_RETURN = "ArticleSearchResultReturn"
    private const val EVENT_ARTICLE_SEARCH_RESULT_CLICK = "ArticleSearchResultClick"
    private const val EVENT_QA_SEARCH_RESULT_RETURN = "QASearchResultReturn"
    private const val EVENT_QA_SEARCH_RESULT_CLICK = "QASearchResultClick"
    private const val EVENT_MINI_GAME_SEARCH_RESULT_RETURN = "MiniGameSearchResultReturn"
    private const val EVENT_MINI_GAME_SEARCH_RESULT_CLICK = "MiniGameSearchResultClick"
    private const val EVENT_USER_SEARCH_RESULT_RETURN = "UserSearchResultReturn"
    private const val EVENT_USER_SEARCH_RESULT_CLICK = "UserSearchResultClick"
    private const val EVENT_FORUM_SEARCH_RESULT_RETURN = "ForumSearchResultReturn"
    private const val EVENT_FORUM_SEARCH_RESULT_CLICK = "ForumSearchResultClick"
    private const val EVENT_TRACK_GAME_COLLECT_SEARCH_RESULT_RETURN = "GameCollectSearchResultReturn"
    private const val EVENT_GAME_COLLECT_SEARCH_RESULT_CLICK = "GameCollectSearchResultClick"

    private const val EVENT_INSTALLATION_PROMPT_BAR_SHOW = "InstallationPromptBarShow"
    private const val EVENT_INSTALLATION_PROMPT_BAR_CLICK = "InstallationPromptBarClick"
    private const val EVENT_AUTOMATIC_DOWNLOAD_PROMPT_BAR_SHOW = "AutomaticDownloadPromptBarShow"
    private const val EVENT_AUTOMATIC_DOWNLOAD_PROMPT_BAR_CLICK = "AutomaticDownloadPromptBarClick"
    private const val EVENT_DOWNLOAD_COMPONENTS_SHOW = "DownloadComponentsShow"
    private const val EVENT_DOWNLOAD_COMPONENTS_CONTENT_CLICK = "DownloadComponentsContentClick"

    private const val EVENT_DOWNLOAD_SUSPENDED_WINDOW_GUIDE_SHOW = "DownloadSuspendedWindowGuideShow"
    private const val EVENT_DOWNLOAD_SUSPENDED_WINDOW_GUIDE_CLICK = "DownloadSuspendedWindowGuideClick"
    private const val EVENT_DOWNLOAD_SUSPENDED_WINDOW_RESULT_RETURN = "DownloadSuspendedWindowResultReturn"

    private const val EVENT_HALO_SELF_CLICK = "HaloSelfClick"

    private const val EVENT_COLUMN_TEST_CLICK = "ColumnTestClick"

    private const val EVENT_SEARCH_DISCOVERY_CLICK = "SearchDiscoveryClick"

    private const val EVENT_BYPASS_BROWSING = "BypassBrowsing"
    private const val EVENT_FAIL_BYPASS = "FailBypass"

    private const val EVENT_CANCEL_APPOINTMENT_DIALOG_SHOW = "CancelAppointmentDialogShow"
    private const val EVENT_CANCEL_APPOINTMENT_DIALOG_CLICK = "CancelAppointmentDialogClick"
    private const val EVENT_APPOINTMENT_SUCCESS_DIALOG_SHOW = "AppointmentSuccessDialogShow"
    private const val EVENT_APPOINTMENT_SUCCESS_DIALOG_CLICK = "AppointmentSuccessDialogClick"
    private const val EVENT_OPEN_APPOINTMENT_AUTOMATIC_DOWNLOAD = "OpenAppointmentAutomaticDownload"
    private const val EVENT_CANCEL_APPOINTMENT_AUTOMATIC_DOWNLOAD = "CancelAppointmentAutomaticDownload"
    private const val EVENT_APPOINTMENT_GAME_ONLINE_DIALOG_SHOW = "AppointmentGameOnlineDialogShow"
    private const val EVENT_APPOINTMENT_GAME_ONLINE_DIALOG_CLICK = "AppointmentGameOnlineDialogClick"
    private const val EVENT_JIGUANG_PUSH_CLICK = "JiGuangPushClick"

    private const val EVENT_PK_CLICK = "PkClick"
    private const val EVENT_GAME_DETAIL_MODULE_CLICK = "GameDetailModuleClick"

    private const val EVENT_NETWORK_ACCELERATION_GUIDANCE_DIAGRAM_SHOW = "NetworkAccelerationGuidanceDiagramShow"
    private const val EVENT_NETWORK_ACCELERATION_BUTTON_CLICK = "NetworkAccelerationButtonClick"
    private const val EVENT_NETWORK_ACCELERATION_START_UP = "NetworkAccelerationStartup"
    private const val EVENT_NETWORK_ACCELERATION_START_UP_RESULT = "NetworkAccelerationStartupResult"
    private const val EVENT_NETWORK_ACCELERATION_OTHER_BUTTON_CLICK = "NetworkAccelerationOtherButtonClick"
    private const val EVENT_MEMBERSHIP_ACTIVATION_DIALOG_SHOW = "MembershipActivationDialogShow"
    private const val EVENT_MEMBERSHIP_ACTIVATION_DIALOG_CLICK = "MembershipActivationDialogClick"
    private const val EVENT_NETWORK_ACCELERATION_FAILURE_DIALOG_SHOW = "NetworkAccelerationFailureDialogShow"
    private const val EVENT_NETWORK_ACCELERATION_FAILURE_DIALOG_CLICK = "NetworkAccelerationFailureDialogClick"
    private const val EVENT_NETWORK_ACCELERATION_CONFLICT_DIALOG_SHOW = "NetworkAccelerationConflictDialogShow"
    private const val EVENT_NETWORK_ACCELERATION_CONFLICT_DIALOG_CLICK = "NetworkAccelerationConflictDialogClick"
    private const val EVENT_MY_ASSETS_PAGE_SHOW = "MyAssetsPageShow"
    const val EVENT_MEMBER_RECHARGE_BUTTON_CLICK = "MemberRechargeButtonClick"
    private const val EVENT_MEMBER_PAYMENT_BUTTON_CLICK = "MemberPaymentButtonClick"
    private const val EVENT_MEMBER_RECHARGE_RESULT = "MemberRechargeResult"
    private const val EVENT_MY_ASSETS_PAGE_CONTACT_CUSTOMER_SERVICE_CLICK = "MyAssetsPageContactCustomerServiceClick"
    private const val EVENT_STOP_ACCELERATING_DIALOG_SHOW = "StopAcceleratingDialogShow"
    private const val EVENT_CALENDAR_PERMISSIONS_DIALOG_SHOW = "CalendarPermissionsDialogShow"
    private const val EVENT_CALENDAR_PERMISSIONS_DIALOG_CLICK = "CalendarPermissionsDialogClick"
    private const val CALENDAR_PERMISSIONS_DIALOG_RESULT = "CalendarPermissionsDialogResult"
    private const val EVENT_CLASSIFICATION_SEARCH = "ClassificationSearch"
    private const val EVENT_CLASSIFICATION_SEARCH_RETURN = "ClassificationSearchReturn"
    private const val EVENT_CLASSIFICATION_SEARCH_RETURN_CLICK = "ClassificationSearchReturnClick"
    private const val EVENT_GET_AD_TAG = "GetAdTag"
    private const val EVENT_INSUFFICIENT_DURATION_DIALOG_SHOW = "InsufficientDurationDialogShow"
    private const val EVENT_INSUFFICIENT_DURATION_DIALOG_CLICK = "InsufficientDurationDialogClick"
    private const val EVENT_TIMED_PACKAGE_EXPIRES_DIALOG_SHOW = "TimedPackageExpiresDialogShow"
    private const val EVENT_TIMED_PACKAGE_EXPIRES_DIALOG_CLICK = "TimedPackageExpiresDialogClick"
    private const val EVENT_MONTHLY_PACKAGE_EXPIRES_DIALOG_SHOW = "MonthlyPackageExpiresDialogShow"
    private const val EVENT_MONTHLY_PACKAGE_EXPIRES_DIALOG_CLICK = "MonthlyPackageExpiresDialogClick"
    private const val EVENT_DURATION_EXHAUSTED_DIALOG_SHOW = "DurationExhaustedDialogShow"
    private const val EVENT_DURATION_EXHAUSTED_DIALOG_CLICK = "DurationExhaustedDialogClick"
    private const val EVENT_GAME_DETAIL_VIDEO_CLICK = "GameDetailVideoClick"

    private const val EVENT_DSP_AD_CLICK = "DspAdClick"
    private const val EVENT_INSTALL_DSP_AD_CLICK = "InstallDspAdClick"
    private const val EVENT_INSTALL_DSP_ADC_FINISH = "InstallDspAdCFinish"

    private var mIsSensorsEnabled = false

    private val mSensor by lazy {
        TheRouter.get(ISensorsProvider::class.java)
    }

    @JvmStatic
    fun init(context: Application, channel: String) {
        mIsSensorsEnabled = true

        // 初始化
        mSensor?.init(context, channel)
    }

    @JvmStatic
    fun login(loginId: String) {
        if (mIsSensorsEnabled) mSensor?.login(loginId)
    }

    @JvmStatic
    fun logout(loginId: String) {
        if (mIsSensorsEnabled) mSensor?.logout(loginId)
    }

    fun setOAID(oaid: String) {
        if (mIsSensorsEnabled || oaid.isNotEmpty()) mSensor?.setOAID(oaid)
    }

    @JvmStatic
    fun trackEvent(eventName: String, vararg kv: Any) {
        if (mIsSensorsEnabled) mSensor?.trackEvent(eventName, *kv)
    }

    @JvmStatic
    fun trackEventWithExposureSource(eventName: String, exposureSourceList: List<ExposureSource>?, vararg kv: Any) {
        if (mIsSensorsEnabled) {
            if (!exposureSourceList.isNullOrEmpty()) {
                val sourceKVList = arrayListOf<String>()
                val exposureSourceString = exposureSourceList.toString()

                val appendedKVList = arrayListOf<Any>()
                appendedKVList.addAll(kv)

                for ((index, value) in exposureSourceList.withIndex()) {
                    sourceKVList.add("source_k${index + 1}")
                    sourceKVList.add(value.k)
                    sourceKVList.add("source_v${index + 1}")
                    sourceKVList.add(value.v)
                }

                appendedKVList.add("source")
                appendedKVList.add(exposureSourceString)
                appendedKVList.addAll(sourceKVList)

                mSensor?.trackEvent(eventName, *appendedKVList.toTypedArray())
            } else {
                mSensor?.trackEvent(eventName, *kv)
            }
        }
    }

    @JvmStatic
    fun trackEvent(eventName: String, jsonObject: JSONObject) {
        mSensor?.trackEvent(eventName, jsonObject)
    }

    @JvmStatic
    fun trackEvent(sensorsEvent: SensorsEvent) {
        mSensor?.trackEvent(sensorsEvent.eventName, JSONObject(sensorsEvent.paramsJson))
    }

    @JvmStatic
    fun profileSet(key: String, value: String) {
        mSensor?.profileSet(key, value)
    }

    @JvmStatic
    fun profileAppend(key: String, value: String) {
        mSensor?.profileAppend(key, value)
    }

    /**
     *  序号:26
     *  事件ID: SearchButtonClick
     *  事件名称：搜索按钮点击事件
     *  @param pageId 页面ID
     *  @param pageName 页面名称
     *  @param searchContent 搜索内容
     *  @param searchType 搜索内型
     *  @param sourceEntrance 入口来源：首页、游戏库、游戏详情、QQ小游戏、社区、论坛、webView
     */
    fun trackSearchButtonClick(
        pageId: String,
        pageName: String,
        searchContent: String,
        searchType: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_SEARCH_BUTTON_CLICK, json)
    }

    /**
     * 事件ID：ArticleSearchTabClick
     * 事件名称:内容搜索Tab选中事件
     * @param searchContent 搜索内容
     * @param searchType 搜索类型
     */
    fun trackArticleSearchTabClick(
        searchContent: String,
        searchType: String
    ) {
        val json = json {
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
        }
        trackEvent(EVENT_ARTICLE_SEARCH_TAB_CLICK, json)
    }

    /**
     * 序号：44
     * 事件ID：GameDetailPageTabSelect
     * 事件名称：游戏详情页tab选中事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param pageName 页面名称
     * @param pageId 页面Id
     * @param pageBusinessId 页面业务ID
     * @param lastPageName 上一个页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @param downloadStatus 下载状态
     * @param gameType 游戏类型
     * @param position 序号
     * @param tabContent 当前tab名称
     * @see EVENT_GAME_DETAIL_PAGE_TAB_SELECT
     */
    @JvmStatic
    fun trackGameDetailPageTabSelect(
        gameId: String,
        gameName: String,
        pageName: String,
        pageId: String,
        pageBusinessId: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String,
        downloadStatus: String,
        gameType: String,
        position: Int,
        tabContent: String,
        linkType: String,
        linkId: String,
        linkText: String,
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PAGE_NAME to pageName
            KEY_PAGE_ID to pageId
            KEY_PAGE_BUSINESS_ID to pageBusinessId
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_TYPE to gameType
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
        }

        trackEvent(EVENT_GAME_DETAIL_PAGE_TAB_SELECT, json)
    }

    /**
     * 序号：47
     * 事件ID：GameDetailPageMajorEventClick
     * 事件名称：游戏详情页大事件点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param pageName 页面名称
     * @param pageId 页面Id
     * @param pageBusinessId 页面业务ID
     * @param lastPageName 上一个页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @param downloadStatus 下载状态
     * @param gameType 游戏类型
     * @param action 触发行为
     * @param linkType 链接类型
     * @param linkId 跳转链接
     * @param linkText 链接文案
     * @see EVENT_GAME_DETAIL_PAGE_MAJOR_EVENT_CLICK
     */
    @JvmStatic
    fun trackGameDetailPageMajorEventClick(
        gameId: String,
        gameName: String,
        pageName: String,
        pageId: String,
        pageBusinessId: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String,
        downloadStatus: String,
        gameType: String,
        action: String,
        linkType: String,
        linkId: String,
        linkText: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PAGE_NAME to pageName
            KEY_PAGE_ID to pageId
            KEY_PAGE_BUSINESS_ID to pageBusinessId
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_TYPE to gameType
            KEY_ACTION to action
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
        }

        trackEvent(EVENT_GAME_DETAIL_PAGE_MAJOR_EVENT_CLICK, json)
    }

    /**
     * 序号：48
     * 事件ID：GameDetailPageRelatedGameClick
     * 事件名称：游戏详情页相关游戏点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param pageName 页面名称
     * @param pageId 页面Id
     * @param pageBusinessId 页面业务ID
     * @param lastPageName 上一个页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @param downloadStatus 下载状态
     * @param gameType 游戏类型
     * @param clickGameId 点击游戏ID
     * @param clickGameName 点击游戏名称
     * @param clickGameType 点击游戏类型
     * @see EVENT_GAME_DETAIL_PAGE_RELATED_GAME_CLICK
     */
    @JvmStatic
    fun trackGameDetailPageRelatedGameClick(
        gameId: String,
        gameName: String,
        pageName: String,
        pageId: String,
        pageBusinessId: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String,
        downloadStatus: String,
        gameType: String,
        clickGameId: String,
        clickGameName: String,
        clickGameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PAGE_NAME to pageName
            KEY_PAGE_ID to pageId
            KEY_PAGE_BUSINESS_ID to pageBusinessId
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_TYPE to gameType
            KEY_CLICK_GAME_ID to clickGameId
            KEY_CLICK_GAME_NAME to clickGameName
            KEY_CLICK_GAME_TYPE to clickGameType
        }

        trackEvent(EVENT_GAME_DETAIL_PAGE_RELATED_GAME_CLICK, json)
    }

    /**
     * 序号：51
     * 事件ID：AdolescentModeDialogShow
     * 事件名称：青少年模式弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_ADOLESCENT_MODE_DIALOG_SHOW
     */
    @JvmStatic
    fun trackAdolescentModeDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_ADOLESCENT_MODE_DIALOG_SHOW, json)
    }

    /**
     * 序号：52
     * 事件ID：AdolescentModeDialogClick
     * 事件名称：青少年模式弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_ADOLESCENT_MODE_DIALOG_CLICK
     */
    @JvmStatic
    fun trackAdolescentModeDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_ADOLESCENT_MODE_DIALOG_CLICK, json)
    }

    /**
     * 序号：55
     * 事件ID：SwitchInstallDialogShow
     * 事件名称：切换安装方式弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_SWITCH_INSTALL_DIALOG_SHOW
     */
    @JvmStatic
    fun trackSwitchInstallDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_SWITCH_INSTALL_DIALOG_SHOW, json)
    }

    /**
     * 序号：56
     * 事件ID：SwitchInstallDialogClick
     * 事件名称：切换安装方式弹窗展示事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_SWITCH_INSTALL_DIALOG_CLICK
     */
    @JvmStatic
    fun trackSwitchInstallDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_SWITCH_INSTALL_DIALOG_CLICK, json)
    }

    /**
     * 序号：57
     * 事件ID：PkgCheckDialogShow
     * 事件名称：包名检测弹窗弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_PKG_CHECK_DIALOG_SHOW
     */
    @JvmStatic
    fun trackPkgCheckDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_PKG_CHECK_DIALOG_SHOW, json)
    }

    /**
     * 序号：58
     * 事件ID：PkgCheckDialogClick
     * 事件名称：包名检测弹窗弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param isNotPrompt 是否不再提示
     * @param linkId 跳转链接，仅点击“跳转链接”按钮时上报
     * @param linkType 链接类型，仅点击“跳转链接”按钮时上报
     * @param linkText 链接文案，仅点击“跳转链接”按钮时上报
     * @see EVENT_PKG_CHECK_DIALOG_CLICK
     */
    @JvmStatic
    fun trackPkgCheckDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String,
        isNotPrompt: Boolean?,
        linkId: String = "",
        linkType: String = "",
        linkText: String = "",
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_LINK_ID to linkId
            KEY_LINK_TYPE to linkType
            KEY_LINK_TEXT to linkText
            isNotPrompt?.let {
                KEY_IS_NOT_PROMPT to it
            }
        }

        trackEvent(EVENT_PKG_CHECK_DIALOG_CLICK, json)
    }

    /**
     * 序号：59
     * 事件ID：GameDownloadDialogShow
     * 事件名称：游戏下载弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_GAME_DOWNLOAD_DIALOG_SHOW
     */
    @JvmStatic
    fun trackGameDownloadDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_GAME_DOWNLOAD_DIALOG_SHOW, json)
    }

    /**
     * 序号：60
     * 事件ID：GameDownloadDialogClick
     * 事件名称：游戏下载弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_GAME_DOWNLOAD_DIALOG_CLICK
     */
    @JvmStatic
    fun trackGameDownloadDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_GAME_DOWNLOAD_DIALOG_CLICK, json)
    }

    /**
     * 序号：61
     * 事件ID：GameDemoDialogShow
     * 事件名称：试玩提醒弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_GAME_DEMO_DIALOG_SHOW
     */
    @JvmStatic
    fun trackGameDemoDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_GAME_DEMO_DIALOG_SHOW, json)
    }

    /**
     * 序号：62
     * 事件ID：GameDemoDialogClick
     * 事件名称：试玩提醒弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_GAME_DEMO_DIALOG_CLICK
     */
    @JvmStatic
    fun trackGameDemoDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_GAME_DEMO_DIALOG_CLICK, json)
    }

    /**
     * 序号：63
     * 事件ID：OverseasAddressDialogShow
     * 事件名称：海外备份地址弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_OVERSEAS_ADDRESS_DIALOG_SHOW
     */
    @JvmStatic
    fun trackOverseasAddressDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_OVERSEAS_ADDRESS_DIALOG_SHOW, json)
    }

    /**
     * 序号：64
     * 事件ID：OverseasAddressDialogClick
     * 事件名称：海外备份地址弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_OVERSEAS_ADDRESS_DIALOG_CLICK
     */
    @JvmStatic
    fun trackOverseasAddressDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_OVERSEAS_ADDRESS_DIALOG_CLICK, json)
    }

    /**
     * 序号：65
     * 事件ID：NetworkCheckDialogShow
     * 事件名称：检查网络状态弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_NETWORK_CHECK_DIALOG_SHOW
     */
    @JvmStatic
    fun trackNetworkCheckDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_NETWORK_CHECK_DIALOG_SHOW, json)
    }

    /**
     * 序号：66
     * 事件ID：NetworkCheckDialogClick
     * 事件名称：检查网络状态弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_NETWORK_CHECK_DIALOG_CLICK
     */
    @JvmStatic
    fun trackNetworkCheckDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_NETWORK_CHECK_DIALOG_CLICK, json)
    }

    /**
     * 序号：67
     * 事件ID：DownloadMobileDataDialogShow
     * 事件名称：移动网络下载提示弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_DOWNLOAD_MOBILE_DATA_DIALOG_SHOW
     */
    @JvmStatic
    fun trackDownloadMobileDataDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_DOWNLOAD_MOBILE_DATA_DIALOG_SHOW, json)
    }

    /**
     * 序号：68
     * 事件ID：DownloadMobileDataDialogClick
     * 事件名称：移动网络下载提示弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_DOWNLOAD_MOBILE_DATA_DIALOG_CLICK
     */
    @JvmStatic
    fun trackDownloadMobileDataDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_DOWNLOAD_MOBILE_DATA_DIALOG_CLICK, json)
    }

    /**
     * 序号：69
     * 事件ID：DownloadLinkRotDialogShow
     * 事件名称：下载链接失效提示弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_DOWNLOAD_LINK_ROT_DIALOG_SHOW
     */
    @JvmStatic
    fun trackDownloadLinkRotDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_DOWNLOAD_LINK_ROT_DIALOG_SHOW, json)
    }

    /**
     * 序号：70
     * 事件ID：DownloadLinkRotDialogClick
     * 事件名称：下载链接失效提示弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_DOWNLOAD_LINK_ROT_DIALOG_CLICK
     */
    @JvmStatic
    fun trackDownloadLinkRotDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_DOWNLOAD_LINK_ROT_DIALOG_CLICK, json)
    }

    /**
     * 序号：71
     * 事件ID：SimulatorInstallDialogShow
     * 事件名称：安装模拟器弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param lastPageName 上一页页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @see EVENT_SIMULATOR_INSTALL_DIALOG_SHOW
     */
    @JvmStatic
    fun trackSimulatorInstallDialogShow(
        gameId: String,
        gameName: String,
        gameType: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
        }

        trackEvent(EVENT_SIMULATOR_INSTALL_DIALOG_SHOW, json)
    }

    /**
     * 序号：72
     * 事件ID：SimulatorInstallDialogClick
     * 事件名称：安装模拟器弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param lastPageName 上一页页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @see EVENT_SIMULATOR_INSTALL_DIALOG_CLICK
     */
    @JvmStatic
    fun trackSimulatorInstallDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
        }

        trackEvent(EVENT_SIMULATOR_INSTALL_DIALOG_CLICK, json)
    }

    /**
     * 序号：73
     * 事件ID：SimulatorUpdateDialogShow
     * 事件名称：更新模拟器弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param lastPageName 上一页页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @see EVENT_SIMULATOR_UPDATE_DIALOG_SHOW
     */
    @JvmStatic
    fun trackSimulatorUpdateDialogShow(
        gameId: String,
        gameName: String,
        gameType: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
        }

        trackEvent(EVENT_SIMULATOR_UPDATE_DIALOG_SHOW, json)
    }

    /**
     * 序号：74
     * 事件ID：SimulatorUpdateDialogClick
     * 事件名称：更新模拟器弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param lastPageName 上一页页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @see EVENT_SIMULATOR_UPDATE_DIALOG_CLICK
     */
    @JvmStatic
    fun trackSimulatorUpdateDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String,
        lastPageName: String,
        lastPageId: String,
        lastPageBusinessId: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_LAST_PAGE_BUSINESS_ID to lastPageBusinessId
        }

        trackEvent(EVENT_SIMULATOR_UPDATE_DIALOG_CLICK, json)
    }

    /**
     * 序号：75
     * 事件ID：SimulatorDownloadDialogShow
     * 事件名称：下载模拟器弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_SIMULATOR_DOWNLOAD_DIALOG_SHOW
     */
    @JvmStatic
    fun trackSimulatorDownloadDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_SIMULATOR_DOWNLOAD_DIALOG_SHOW, json)
    }

    /**
     * 序号：76
     * 事件ID：SimulatorDownloadDialogClose
     * 事件名称：关闭模拟器弹窗事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_SIMULATOR_DOWNLOAD_DIALOG_CLOSE
     */
    @JvmStatic
    fun trackSimulatorDownloadDialogClose(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_SIMULATOR_DOWNLOAD_DIALOG_CLOSE, json)
    }

    /**
     * 序号：77
     * 事件ID：GameDecompressionFailed
     * 事件名称：游戏解压失败事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param exceptionDigest 异常摘要
     * @see EVENT_GAME_DEPRESSION_FAILED
     */
    @JvmStatic
    fun trackGameDecompressionFailed(
        gameId: String,
        gameName: String,
        gameType: String,
        exceptionDigest: String,
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            "exception_digest" to exceptionDigest
        }

        trackEvent(EVENT_GAME_DEPRESSION_FAILED, json)
    }

    /**
     * 序号：78
     * 事件ID：InstallPermissionDialogShow
     * 事件名称：引导设置安装权限弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_INSTALL_PERMISSION_DIALOG_SHOW
     */
    @JvmStatic
    fun trackInstallPermissionDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_INSTALL_PERMISSION_DIALOG_SHOW, json)
    }

    /**
     * 序号：79
     * 事件ID：InstallPermissionDialogClick
     * 事件名称：引导设置安装权限弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_INSTALL_PERMISSION_DIALOG_CLICK
     */
    @JvmStatic
    fun trackInstallPermissionDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_INSTALL_PERMISSION_DIALOG_CLICK, json)
    }

    /**
     * 序号：80
     * 事件ID：GameDecompressionFailedDialogShow
     * 事件名称：游戏解压失败弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_GAME_DEPRESSION_FAILED_DIALOG_SHOW
     */
    @JvmStatic
    fun trackGameDecompressionFailedDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_GAME_DEPRESSION_FAILED_DIALOG_SHOW, json)
    }

    /**
     * 序号：81
     * 事件ID：GameDecompressionFailedDialogClick
     * 事件名称：游戏解压失败弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_GAME_DEPRESSION_FAILED_DIALOG_CLICK
     */
    @JvmStatic
    fun trackGameDecompressionFailedDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_GAME_DEPRESSION_FAILED_DIALOG_CLICK, json)
    }

    /**
     * 序号：82
     * 事件ID：MiuiOptimizeCloseDialogShow
     * 事件名称：引导关闭MIUI优化提示弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_MIUI_OPTIMIZE_CLOSE_DIALOG_SHOW
     */
    @JvmStatic
    fun trackMiuiOptimizeCloseDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_MIUI_OPTIMIZE_CLOSE_DIALOG_SHOW, json)
    }

    /**
     * 序号：83
     * 事件ID：MiuiOptimizeCloseDialogClick
     * 事件名称：引导关闭MIUI优化提示弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_MIUI_OPTIMIZE_CLOSE_DIALOG_CLICK
     */
    @JvmStatic
    fun trackMiuiOptimizeCloseDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_MIUI_OPTIMIZE_CLOSE_DIALOG_CLICK, json)
    }

    /**
     * 序号：84
     * 事件ID：PluginInstallDialogShow
     * 事件名称：插件化安装提示弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param platform 游戏平台
     * @see EVENT_PLUGIN_INSTALL_DIALOG_SHOW
     */
    @JvmStatic
    fun trackPluginInstallDialogShow(
        gameId: String,
        gameName: String,
        gameType: String,
        platform: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_PLATFORM to platform
        }

        trackEvent(EVENT_PLUGIN_INSTALL_DIALOG_SHOW, json)
    }

    /**
     * 序号：85
     * 事件ID：PluginInstallDialogClick
     * 事件名称：插件化安装提示弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @param platform 游戏平台
     * @see EVENT_PLUGIN_INSTALL_DIALOG_CLICK
     */
    @JvmStatic
    fun trackPluginInstallDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String,
        platform: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_PLATFORM to platform
        }

        trackEvent(EVENT_PLUGIN_INSTALL_DIALOG_CLICK, json)
    }

    /**
     * 序号：86
     * 事件ID：ConflictSignatureInstallDialogShow
     * 事件名称：签名冲突提示弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_CONFLICT_SIGNATURE_INSTALL_DIALOG_SHOW
     */
    @JvmStatic
    fun trackConflictSignatureInstallDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_CONFLICT_SIGNATURE_INSTALL_DIALOG_SHOW, json)
    }

    /**
     * 序号：87
     * 事件ID：ConflictSignatureInstallDialogClick
     * 事件名称：签名冲突提示弹窗点击事件
     * @param buttonName 按钮名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型
     * @see EVENT_CONFLICT_SIGNATURE_INSTALL_DIALOG_CLICK
     */
    @JvmStatic
    fun trackConflictSignatureInstallDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_CONFLICT_SIGNATURE_INSTALL_DIALOG_CLICK, json)
    }

    /**
     * 序号：88
     * 事件ID：VersionUpdateDialogShow
     * 事件名称：版本更新弹窗展示事件
     * @param keyDialogReminderTime 对应后台设置的“弹窗提醒频次”选项，包括“仅一次、仅一次（第二次打开）、每天一次、每次打开”
     * @param keyDialogClose 对应后台设置的“弹窗关闭”选项，包括“仅关闭、关闭且强退”
     * @see EVENT_VERSION_UPDATE_DIALOG_SHOW
     */
    @JvmStatic
    fun trackVersionUpdateDialogShow(keyDialogReminderTime: String?, keyDialogClose: String?) {
        val json = json {
            KEY_DIALOG_REMINDER_TIME to keyDialogReminderTime
            KEY_DIALOG_CLOSE to keyDialogClose
        }

        trackEvent(EVENT_VERSION_UPDATE_DIALOG_SHOW, json)
    }

    /**
     * 序号：89
     * 事件ID：VersionUpdateDialogClick
     * 事件名称：版本更新弹窗点击事件
     * @param buttonName 按钮名称
     * @param keyDialogReminderTime 对应后台设置的“弹窗提醒频次”选项，包括“仅一次、仅一次（第二次打开）、每天一次、每次打开”
     * @param keyDialogClose 对应后台设置的“弹窗关闭”选项，包括“仅关闭、关闭且强退”
     * @see EVENT_VERSION_UPDATE_DIALOG_CLICK
     */
    @JvmStatic
    fun trackVersionUpdateDialogClick(
        buttonName: String,
        keyDialogReminderTime: String?,
        keyDialogClose: String?
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_DIALOG_REMINDER_TIME to keyDialogReminderTime
            KEY_DIALOG_CLOSE to keyDialogClose
        }

        trackEvent(EVENT_VERSION_UPDATE_DIALOG_CLICK, json)
    }

    /**
     * 序号：90
     * 事件ID：DownloadManagerEnter
     * 事件名称：进入下载管理事件
     * @param entrance 入口
     * @param bottomTab 底部tab
     * @param gameColumnId 游戏专题ID
     * @param gameColumnName 游戏专题名称
     * @param customPageId 自定义页面ID
     * @param customPageName 自定义页面名称
     * @see EVENT_DOWNLOAD_MANAGER_ENTER
     */
    @JvmStatic
    fun trackDownloadManagerEnter(
        entrance: String = "",
        bottomTab: String = "",
        gameColumnId: String = "",
        gameColumnName: String = "",
        customPageId: String = "",
        customPageName: String = "",
        multiTabId: String = "",
        multiTabName: String = ""
    ) {
        val json = json {
            KEY_ENTRANCE to entrance
            KEY_BOTTOM_TAB to bottomTab
            KEY_GAME_COLUMN_ID to gameColumnId
            KEY_GAME_COLUMN_NAME to gameColumnName
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
        }

        trackEvent(EVENT_DOWNLOAD_MANAGER_ENTER, json)
    }

    /**
     * 序号：91
     * 事件ID：DownloadManagerTabSelect
     * 事件名称：下载管理tab选中事件
     * @param tabContent 选中tab的名称
     * @see EVENT_DOWNLOAD_MANAGER_TAB_SELECT
     */
    @JvmStatic
    fun trackDownloadManagerTabSelect(
        tabContent: String
    ) {
        val json = json {
            KEY_TAB_CONTENT to tabContent
        }

        trackEvent(EVENT_DOWNLOAD_MANAGER_TAB_SELECT, json)
    }

    /**
     * 序号：92
     * 事件ID：HaloFunGameManagerEnter
     * 事件名称：进入畅玩游戏管理事件
     * @see EVENT_HALO_FUN_GAME_MANAGER_ENTER
     */
    @JvmStatic
    fun trackHaloFunGameManagerEnter(
        entrance: String,
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        position: Int,
        tabContent: String,
        customPageId: String,
        customPageName: String,
    ) {
        val json = json {
            KEY_ENTRANCE to entrance
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
        }
        trackEvent(EVENT_HALO_FUN_GAME_MANAGER_ENTER, json)
    }

    /**
     * 序号：93
     * 事件ID：HaloFunGameManagerTabSelect
     * 事件名称：畅玩游戏管理tab选中事件
     * @param tabContent 选中tab的名称
     * @see EVENT_HALO_FUN_GAME_MANAGER_TAB_SELECT
     */
    @JvmStatic
    fun trackHaloFunGameManagerTabSelect(
        tabContent: String
    ) {
        val json = json {
            KEY_TAB_CONTENT to tabContent
        }

        trackEvent(EVENT_HALO_FUN_GAME_MANAGER_TAB_SELECT, json)
    }

    /**
     * 序号：94
     * 事件ID：LinkContentCollectionClick
     * 事件名称：通用内容合集点击事件
     * @param location 位置
     * @param blockName 版块名称
     * @param blockId 版块ID
     * @param linkContentCollectionName 通用内容合集名称
     * @param linkContentCollectionId 通用内容合集ID
     * @param position 序号
     * @param linkType 链接类型
     * @param linkId 跳转链接
     * @param linkText 链接文案
     * @param text 点击位置 1.全部 2.通用内容
     * @see EVENT_LINK_CONTENT_COLLECTION_CLICK
     */
    @JvmStatic
    fun trackLinkContentCollectionClick(
        location: String,
        blockName: String,
        blockId: String,
        linkContentCollectionName: String,
        linkContentCollectionId: String,
        position: Int,
        linkType: String,
        linkId: String,
        linkText: String,
        text: String,
        linkContentCollectionePattern: String = "",
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        sequence: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        gameId: String = "",
        gameName: String = ""
    ) {
        val json = json {
            KEY_LOCATION to location
            KEY_BLOCK_NAME to blockName
            KEY_BLOCK_ID to blockId
            KEY_LINK_CONTENT_COLLECTION_NAME to linkContentCollectionName
            KEY_LINK_CONTENT_COLLECTION_ID to linkContentCollectionId
            KEY_POSITION to sequence
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
            KEY_TEXT to text
            KEY_LINK_CONTENT_COLLECTIONE_PATTERN to linkContentCollectionePattern
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            if (position != -1) {
                KEY_SEQUENCE to position
            }
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }

        trackEvent(EVENT_LINK_CONTENT_COLLECTION_CLICK, json)
    }

    /**
     * 序号：95
     * 事件ID：ColumnCollectionClick
     * 事件名称：专题合集点击事件
     * @param location 位置
     * @param blockName 版块名称
     * @param blockId 版块ID
     * @param columnCollectionName 专题合集名称
     * @param columnCollectionId 专题合集ID
     * @param position 序号
     * @param gameColumnName 游戏专题名称
     * @param gameColumnId 游戏专题ID
     * @param text 点击位置 1.全部 2.游戏专题
     * @param adGroupId 广告组广告 id
     * @see EVENT_COLUMN_COLLECTION_CLICK
     */
    @JvmStatic
    fun trackColumnCollectionClick(
        location: String,
        blockName: String = "",
        blockId: String = "",
        columnCollectionName: String,
        columnCollectionId: String,
        position: Int = -1,
        gameColumnName: String = "",
        gameColumnId: String = "",
        text: String,
        columnCollectionPattern: String = "",
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        sequence: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        gameId: String = "",
        gameName: String = "",
        linkType: String = "",
        linkId: String = "",
        linkText: String = "",
        adGroupId: String = ""
    ) {
        val json = json {
            KEY_LOCATION to location
            KEY_BLOCK_NAME to blockName
            KEY_BLOCK_ID to blockId
            KEY_COLUMN_COLLECTION_NAME to columnCollectionName
            KEY_COLUMN_COLLECTION_ID to columnCollectionId
            KEY_SEQUENCE to position
            KEY_GAME_COLUMN_NAME to gameColumnName
            KEY_GAME_COLUMN_ID to gameColumnId
            KEY_TEXT to text
            KEY_COLUMN_COLLECTIONE_PATTERN to columnCollectionPattern
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            if (position != -1) {
                KEY_POSITION to sequence
            }
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_LINK_ID to linkId
            KEY_LINK_TYPE to linkType
            KEY_LINK_TEXT to linkText
            KEY_IS_AD to adGroupId.isNotEmpty()
            KEY_AD_GROUP_ID to adGroupId
        }

        trackEvent(EVENT_COLUMN_COLLECTION_CLICK, json)
    }

    /**
     * 序号：96
     * 事件ID：UnloadGameClick
     * 事件名称：游戏卸载点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @see EVENT_UNLOAD_GAME_CLICK
     */
    @JvmStatic
    fun trackUnloadGameClick(
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }

        trackEvent(EVENT_UNLOAD_GAME_CLICK, json)
    }

    /**
     * 序号：97
     * 事件ID：UnloadGameFinish
     * 事件名称：游戏卸载完成事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @see EVENT_UNLOAD_GAME_FINISH
     */
    @JvmStatic
    fun trackUnloadGameFinish(
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }

        trackEvent(EVENT_UNLOAD_GAME_FINISH, json)
    }

    @JvmStatic
    fun trackInstallGameClick(
        gameId: String,
        gameName: String,
        action: String,
        isDspGame: Boolean = false,
        dspAdId: String = ""
    ) {
        if (isDspGame) {
            trackInstallDspAdClick(
                adId = dspAdId,
                gameName = gameName,
                action = action
            )
        } else {
            trackInstallGameClick(gameId, gameName, action)
        }
    }

    /**
     * 序号：98
     * 事件ID：InstallGameClick
     * 事件名称：游戏安装点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param action 触发行为：主动安装/自动安装
     * @see EVENT_INSTALL_GAME_CLICK
     */
    private fun trackInstallGameClick(
        gameId: String,
        gameName: String,
        action: String,
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_ACTION to action
        }

        trackEvent(EVENT_INSTALL_GAME_CLICK, json)
    }

    /**
     * 序号：99
     * 事件ID：InstallGameFinish
     * 事件名称：游戏安装完成事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @see EVENT_INSTALL_GAME_FINISH
     */
    @JvmStatic
    fun trackInstallGameFinish(
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }

        trackEvent(EVENT_INSTALL_GAME_FINISH, json)
    }

    @JvmStatic
    fun trackInstallGameFinish(
        gameId: String,
        gameName: String,
        isDspGame: Boolean,
        dspAdId: String,
    ) {
        if (isDspGame) {
            trackInstallDspAdCFinish(dspAdId, gameName)
        } else {
            trackInstallGameFinish(gameId, gameName)
        }
    }

    /**
     * 事件ID：MessageReceive
     * 事件名称：消息接收事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @param sessionMessageType 会话类型: 游戏消息、系统消息、客服消息、互动消息、运营消息
     * @param messageType 消息类型
     * @see EVENT_MESSAGE_RECEIVE
     */
    @JvmStatic
    fun trackMessageReceive(
        gameId: String,
        gameName: String,
        gameType: String,
        sessionMessageType: String,
        messageType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_SESSION_MESSAGE_TYPE to sessionMessageType
            KEY_MESSAGE_TYPE to messageType
        }

        trackEvent(EVENT_MESSAGE_RECEIVE, json)
    }

    /**
     * 事件ID：MessageCenterClick
     * 事件名称：消息中心点击事件
     * @see EVENT_MESSAGE_CENTER_CLICK
     */
    @JvmStatic
    fun trackMessageCenterClick() {
        val json = json {}

        trackEvent(EVENT_MESSAGE_CENTER_CLICK, json)
    }

    /**
     * 事件ID：MessageSessionClick
     * 事件名称：消息会话点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @param sessionMessageType 会话类型: 游戏消息、系统消息、客服消息、互动消息、运营消息
     * @see EVENT_MESSAGE_SESSION_CLICK
     */
    @JvmStatic
    fun trackMessageSessionClick(
        gameId: String,
        gameName: String,
        gameType: String,
        sessionMessageType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_SESSION_MESSAGE_TYPE to sessionMessageType
        }

        trackEvent(EVENT_MESSAGE_SESSION_CLICK, json)
    }

    /**
     * 事件ID：MessageItemClick
     * 事件名称：消息点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @param sessionMessageType 会话类型: 游戏消息、系统消息、客服消息、互动消息、运营消息
     * @param messageType 消息类型
     * @see EVENT_MESSAGE_ITEM_CLICK
     */
    @JvmStatic
    fun trackMessageItemClick(
        gameId: String,
        gameName: String,
        gameType: String,
        sessionMessageType: String,
        messageType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_SESSION_MESSAGE_TYPE to sessionMessageType
            KEY_MESSAGE_TYPE to messageType
        }

        trackEvent(EVENT_MESSAGE_ITEM_CLICK, json)
    }


    /**
     * 事件ID：MessageItemLinkClick
     * 事件名称：消息点击事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param sessionMessageType 会话类型: 游戏消息、系统消息、客服消息、互动消息、运营消息
     * @param messageType 消息类型
     * @see EVENT_MESSAGE_ITEM_LINK_CLICK
     */
    @JvmStatic
    fun trackMessageItemLinkClick(
        gameId: String,
        gameName: String,
        sessionMessageType: String,
        messageType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SESSION_MESSAGE_TYPE to sessionMessageType
            KEY_MESSAGE_TYPE to messageType
        }

        trackEvent(EVENT_MESSAGE_ITEM_LINK_CLICK, json)
    }

    /**
     * 事件ID：LaunchServerSubscribeClick
     * 事件名称：加入开服订阅事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @see EVENT_LAUNCH_SERVER_SUBSCRIBE_CLICK
     */
    @JvmStatic
    fun trackLaunchServerSubscribeClick(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_LAUNCH_SERVER_SUBSCRIBE_CLICK, json)
    }

    /**
     * 事件ID：LaunchServerSubscribeCancelClick
     * 事件名称：取消开服订阅事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @see EVENT_LAUNCH_SERVER_SUBSCRIBE_CANCEL_CLICK
     */
    @JvmStatic
    fun trackLaunchServerSubscribeCancelClick(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }

        trackEvent(EVENT_LAUNCH_SERVER_SUBSCRIBE_CANCEL_CLICK, json)
    }

    /**
     * 事件ID：LaunchServerReminderClick
     * 事件名称：添加开服提醒事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @param reminderType 提醒类型: 已知服、未知服
     * @see EVENT_LAUNCH_SERVER_REMINDER_CLICK
     */
    @JvmStatic
    fun trackLaunchServerReminderClick(
        gameId: String,
        gameName: String,
        gameType: String,
        reminderType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_REMINDER_TYPE to reminderType
        }

        trackEvent(EVENT_LAUNCH_SERVER_REMINDER_CLICK, json)
    }

    /**
     * 事件ID：LaunchServerReminderCancelClick
     * 事件名称：游戏安装完成事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @see EVENT_LAUNCH_SERVER_REMINDER_CANCEL_CLICK
     */
    @JvmStatic
    fun trackLaunchServerReminderCancelClick(
        gameId: String,
        gameName: String,
        gameType: String,
        reminderType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_REMINDER_TYPE to reminderType
        }

        trackEvent(EVENT_LAUNCH_SERVER_REMINDER_CANCEL_CLICK, json)
    }

    /**
     * 事件ID:GameSearchFirstgameBannerClick
     * 事件名称:游戏搜索首位游戏轮播图点击事件
     * gameId: 游戏id
     * gameName: 游戏名称
     * position: 序号 从0开始
     * linkType: 卡片图连接的类型
     * linkId: 卡片图跳转的链接
     * linkText: 卡片图的链接名称
     */
    @JvmStatic
    fun trackGameSearchFirstGameBannerClick(
        gameId: String,
        gameName: String,
        position: Int,
        linkType: String?,
        linkId: String?,
        linkText: String?
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_POSITION to position
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
        }
        trackEvent(EVENT_GAME_SEARCH_FIRST_GAME_BANNER_CLICK, json)
    }

    /**
     * 事件ID:GameSearchFirstgameBannerClick
     * 事件名称:游戏搜索首位游戏轮播图点击事件
     * gameId: 游戏id
     * gameName: 游戏名称
     * position: 序号 从0开始
     * linkType: 卡片图连接的类型
     * linkId: 卡片图跳转的链接
     * linkText: 卡片图的链接名称
     */
    @JvmStatic
    fun trackGameSearchFirstGameCardClick(
        gameId: String,
        gameName: String,
        position: Int,
        linkType: String?,
        linkId: String?,
        linkText: String?
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_POSITION to position
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
        }
        trackEvent(EVENT_GAME_SEARCH_FIRST_GAME_CARD_CLICK, json)
    }

    /**
     * 事件ID:ViewForum
     * 事件名称:内容发布结果事件
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param forumName 论坛名称
     * @param gameForumType 游戏论坛分类: gj单机\福利游戏等
     */
    fun trackViewForum(
        bbsId: String,
        bbsType: String,
        forumName: String,
        gameForumType: String
    ) {
        val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_VIEW_FORUM, true)
        val json = json {
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_FORUM_NAME to forumName
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_IS_FIRST_TIME to isFirstTime
        }
        SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_VIEW_FORUM, false)
        trackEvent(EVENT_VIEW_FORUM, json)
    }

    /**
     * 事件ID:ArticlePostResult
     * 事件名称:内容发布结果事件
     * @param postResult 发布结果: 成功\失败
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param customerType 用户分类：认证-游戏达人\专区版主等
     */
    @JvmStatic
    fun trackArticlePostResult(
        postResult: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        customerType: String
    ) {
        val json = json {
            KEY_POST_RESULT to postResult
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_CUSTOMER_TYPE to customerType
        }
        trackEvent(EVENT_ARTICLE_POST_RESULT, json)
    }

    /**
     * 事件ID:ArticleDetailsBrowsing
     * 事件名称:帖子详情浏览事件
     * @param customerType 用户分类：认证-游戏达人\专区版主等
     * @param subSection 子版块名称
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param sourceEntrance 来源
     *
     */
    fun trackArticleDetailsBrowsing(
        customerType: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        articleId: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_ARTICLE_ID to articleId
        }
        trackEvent(EVENT_ARTICLE_DETAILS_BROWSING, json)
    }

    /**
     * 事件ID:ArticleBrowsingDuration
     * 事件名称:帖子浏览时长事件
     * @param customerType 用户分类：认证-游戏达人\专区版主等
     * @param subSection 子版块名称
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleId 帖子的ID
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param sourceEntrance 来源
     * @param stayLength 用户在页面停留的时长
     *
     */
    fun trackArticleBrowsingDuration(
        customerType: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleId: String,
        articleType: String,
        sourceEntrance: String,
        stayLength: Double
    ) {
        val json = json {
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_STAY_LENGTH to stayLength
        }
        trackEvent(EVENT_ARTICLE_BROWSING_DURATION, json)
    }

    /**
     * 事件ID:ArticleLikeClick
     * 事件名称:帖子点赞按钮点击事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param buttonName 按钮名称
     */
    fun trackArticleLikeClick(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        buttonName: String
    ) {
        val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_LIKE_CLICK, true)
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_BUTTON_NAME to buttonName
        }
        SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_LIKE_CLICK, false)
        trackEvent(EVENT_ARTICLE_LIKE_CLICK, json)
    }

    /**
     * 事件ID:ArticleCollectionClick
     * 事件名称:帖子收藏按钮点击事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param buttonName 按钮名称
     */
    fun trackArticleCollectionClick(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        buttonName: String
    ) {
        val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COLLECTION_CLICK, true)
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_BUTTON_NAME to buttonName
        }
        SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COLLECTION_CLICK, false)
        trackEvent(EVENT_ARTICLE_COLLECTION_CLICK, json)
    }

    /**
     * 事件ID:ArticleComment
     * 事件名称:帖子评论按钮点击事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     */
    fun trackArticleComment(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
    ) {
        val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COMMENT, true)
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
        }
        SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COMMENT, false)
        trackEvent(EVENT_ARTICLE_COMMENT, json)
    }

    /**
     * 事件ID:ArticleCommentResult
     * 事件名称:帖子评论结果返回事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param result 返回结果：评论成功\评论失败
     */
    fun trackArticleCommentResult(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        result: String
    ) {
        val json = json {
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_RESULT to result
        }
        trackEvent(EVENT_ARTICLE_COMMENT_RESULT, json)
    }

    /**
     * 事件ID:ArticleShare
     * 事件名称:帖子分享按钮点击事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param shareType 分享方式：微信、朋友圈、QQ好友、QQ空间、新浪微博、短信、复制链接
     */
    @JvmStatic
    fun trackArticleShare(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        shareType: String
    ) {
        val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_SHARE, true)
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_SHARE_TYPE to shareType
        }
        SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_SHARE, false)
        trackEvent(EVENT_ARTICLE_SHARE, json)
    }

    /**
     * 事件ID:ArticleShareResult
     * 事件名称:帖子分享按钮点击事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param shareType 分享方式：微信、朋友圈、QQ好友、QQ空间、新浪微博、短信、复制链接
     * @param result 点击按钮的结果：分享成功\分享失败
     */
    @JvmStatic
    fun trackArticleShareResult(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        shareType: String,
        result: String
    ) {
        val json = json {
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_SHARE_TYPE to shareType
            KEY_RESULT to result
        }
        trackEvent(EVENT_ARTICLE_SHARE_RESULT, json)
    }

    /**
     * 事件ID:ArticleReply
     * 事件名称:帖子回复按钮点击事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     */
    fun trackArticleReply(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
    ) {
        val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_REPLY, true)
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
        }
        SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_REPLY, false)
        trackEvent(EVENT_ARTICLE_REPLY, json)
    }

    /**
     * 事件ID:ArticleReplyResult
     * 事件名称:帖子回复结果返回事件
     * @param customerType 用户分类
     * @param subSection 子版块名称
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param result 返回结果：回复成功\回复失败
     */
    fun trackArticleReplyResult(
        customerType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        result: String
    ) {
        val json = json {
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_RESULT to result
        }
        trackEvent(EVENT_ARTICLE_REPLY_RESULT, json)
    }

    /**
     * 事件ID:VideoStartPlaying
     * 事件名称:帖子回复按钮点击事件
     * @param customerType 用户分类
     * @param videoId 视频ID
     * @param playType 播放形式：视频贴\视频流
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     */
    fun trackVideoStartPlaying(
        customerType: String,
        videoId: String,
        playType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
    ) {
        val json = json {
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_VIDEO_ID to videoId
            KEY_PLAY_TYPE to playType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
        }
        trackEvent(EVENT_VIDEO_START_PLAYING, json)
    }

    /**
     * 事件ID:VideoEndPlaying
     * 事件名称:视频结束播放上报事件
     * @param customerType 用户分类
     * @param videoId 视频ID
     * @param playType 播放形式：视频贴\视频流
     * @param articleId 帖子的ID
     * @param bbsId 论坛ID
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param activityTag 活动标签名称
     * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     * @param result 结果：是否播放进度达到95%
     */
    fun trackVideoEndPlaying(
        customerType: String,
        videoId: String,
        playType: String,
        articleId: String,
        bbsId: String,
        bbsType: String,
        activityTag: String,
        gameForumType: String,
        articleType: String,
        result: String
    ) {
        val json = json {
            KEY_ARTICLE_ID to articleId
            KEY_CUSTOMER_TYPE to customerType
            KEY_VIDEO_ID to videoId
            KEY_PLAY_TYPE to playType
            KEY_BBS_ID to bbsId
            KEY_BBS_TYPE to bbsType
            KEY_ACTIVITY_TAG to activityTag
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_ARTICLE_TYPE to articleType
            KEY_RESULT to result
        }
        trackEvent(EVENT_VIDEO_END_PLAYING, json)
    }

    /**
     * 事件ID:FollowForumClick
     * 事件名称:关注论坛按钮点击事件
     * @param bbsId 论坛ID
     * @param forumName 论坛名称
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param gameForumType 游戏论坛分类: gj单机\福利游戏等
     * @param buttonName 按钮名称：关注\已关注
     */
    fun trackFollowForumClick(
        bbsId: String,
        forumName: String,
        bbsType: String,
        gameForumType: String,
        buttonName: String
    ) {
        val json = json {
            KEY_BBS_ID to bbsId
            KEY_FORUM_NAME to forumName
            KEY_BBS_TYPE to bbsType
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_FOLLOW_FORUM_CLICK, json)
    }

    /**
     * 事件ID:UserFollowClick
     * 事件名称:关注用户按钮点击事件
     * @param userId 用户ID
     * @param userName 用户名称
     * @param buttonName 按钮名称：关注\已关注
     */
    fun trackUserFollowClick(
        userId: String,
        userName: String,
        buttonName: String
    ) {
        val json = json {
            KEY_USER_ID to userId
            KEY_USER_NAME to userName
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_USER_FOLLOW_CLICK, json)
    }

    /**
     * 事件ID:CommunityTopTabSelected
     * 事件名称:社区顶部Tab选中事件
     * @param tabType 选中tab类型: 推荐\论坛\活动
     */
    fun trackCommunityTopTabSelected(
        tabType: String
    ) {
        val json = json {
            KEY_TAB_TYPE to tabType
        }
        trackEvent(EVENT_COMMUNITY_TOP_TAB_SELECTED, json)
    }

    /**
     * 事件ID:ForumBannerClick
     * 事件名称:论坛banner点击事件
     * @param bannerName 后台填写的轮播图标题
     */
    fun trackForumBannerClick(
        bannerName: String
    ) {
        val json = json {
            KEY_BANNER_NAME to bannerName
        }
        trackEvent(EVENT_FORUM_BANNER_CLICK, json)
    }

    /**
     * 事件ID:ForumDetailsAnnouncementBoardClick
     * 事件名称:论坛详情公告栏点击事件
     * @param toppingType 置顶的公告类型
     * @param title 公告的标题
     * @param forumName 论坛名称
     * @param forumType 论坛类型
     */
    fun trackForumDetailsAnnouncementBoardClick(
        toppingType: String,
        title: String,
        forumName: String,
        forumType: String
    ) {
        val json = json {
            KEY_TOPPING_TYPE to toppingType
            KEY_TITLE to title
            KEY_FORUM_NAME to forumName
            KEY_FORUM_TYPE to forumType
        }
        trackEvent(EVENT_FORUM_DETAILS_ANNOUNCEMENT_BOARD_CLICK, json)
    }

    /**
     * 事件ID:AccessVideoStreaming
     * 事件名称:视频流访问事件
     * @param sourceEntrance 来源：光环底部tab\社区的右上角入口
     */
    fun trackAccessVideoStreaming(
        sourceEntrance: String,
    ) {
        val json = json {
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_ACCESS_VIDEO_STREAMING, json)
    }

    /**
     * 事件ID:VideoStreamingTabSelect
     * 事件名称:视频流Tab选中事件
     * @param tabContent 选中Tab的名称
     */
    fun trackVideoStreamingTabSelect(
        tabContent: String
    ) {
        val json = json {
            KEY_TAB_CONTENT to tabContent
        }
        trackEvent(EVENT_VIDEO_STREAMING_TAB_SELECT, json)
    }

    /**
     * 事件ID:VideoStreamingAdvertisingSpaceClick
     * 事件名称:视频流广告位点击事件
     * @param advertisementType 广告的类型
     * @param location 广告的位置
     * @param title 广告的标题
     */
    fun trackVideoStreamingAdvertisingSpaceClick(
        advertisementType: String,
        location: String,
        title: String
    ) {
        val json = json {
            KEY_ADVERTISEMENT_TYPE to advertisementType
            KEY_LOCATION to location
            title to title
        }
        trackEvent(EVENT_VIDEO_STREAMING_ADVERTISING_SPACE_CLICK, json)
    }

    /**
     * 事件ID:MyPageBannerClick
     * 事件名称:我的光环banner点击事件
     * @param position 序号
     */
    fun trackMyPageBannerClick(
        position: Int,
    ) {
        val json = json {
            KEY_POSITION to position
        }
        trackEvent(EVENT_MY_PAGE_BANNER_CLICK, json)
    }

    /**
     * 事件ID:VerificationDialogShow
     * 事件名称:实名认证弹窗展示事件
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏类型：单机、网游等
     * @param verificationType 实名类型：游戏实名\内容实名
     * @param articleType 发帖类型: 帖子\提问帖\视频贴
     */
    fun trackVerificationDialogShow(
        gameId: String,
        gameName: String,
        gameType: String,
        verificationType: String,
        articleType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_VERIFICATION_TYPE to verificationType
            KEY_ARTICLE_TYPE to articleType
        }

        trackEvent(EVENT_VERIFICATION_DIALOG_SHOW, json)
    }

    /**
     * 事件ID:VerificationPopupClick
     * 事件名称:实名认证弹窗点击事件
     * @param buttonName 按钮名称
     */
    fun trackVerificationPopupClick(
        buttonName: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
        }

        trackEvent(EVENT_VERIFICATION_POPUP_CLICK, json)
    }

    /**
     * 事件ID:MobileNumberVerificationDialog
     * 事件名称:社区手机号验证弹窗展示事件
     * @param articleType 发帖时所选择的类型
     */
    fun trackMobileNumberVerificationDialog(
        articleType: String
    ) {
        val json = json {
            KEY_ARTICLE_TYPE to articleType
        }
        trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_DIALOG, json)
    }

    /**
     * 事件ID:MobileNumberVerificationPopupClick
     * 事件名称:社区手机号验证弹窗点击事件
     * @param buttonName 按钮名称：前往手机号验证\以后再说
     */
    fun trackMobileNumberVerificationPopupClick(
        buttonName: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_POPUP_CLICK, json)
    }

    /**
     * 事件ID:MobileNumberVerificationPageShow
     * 事件名称:手机号验证界面展示事件
     */
    fun trackMobileNumberVerificationPageShow() {
        val json = json {}
        trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_SHOW, json)
    }

    /**
     * 事件ID:MobileNumberVerificationComplete
     * 事件名称:完成手机号验证事件
     * @param result 返回结果: 验证成功\验证错误
     */
    fun trackMobileNumberVerificationComplete(
        result: String
    ) {
        val json = json {
            KEY_RESULT to result
        }
        trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_COMPLETE, json)
    }

    /**
     * 事件ID:PersonalHomepageBrowsing
     * 事件名称:个人主页浏览事件
     * @param userId 用户ID
     * @param customerType 用户分类
     */
    fun trackPersonalHomepageBrowsing(
        userId: String,
        customerType: String
    ) {
        val json = json {
            KEY_USER_ID to userId
            KEY_CUSTOMER_TYPE to customerType
        }
        trackEvent(EVENT_PERSONAL_HOME_PAGE_BROWSING, json)
    }

    /**
     * 事件ID:ForumBrowsingDuration
     * 事件名称:论坛浏览时长事件
     * @param bbsId 论坛ID
     * @param forumName 论坛名称
     * @param bbsType 论坛类型: 游戏论坛\综合论坛
     * @param gameForumType 游戏论坛分类: gj单机\福利游戏等
     */
    fun trackForumBrowsingDuration(
        bbsId: String,
        forumName: String,
        bbsType: String,
        gameForumType: String,
        stayLength: Double
    ) {
        val json = json {
            KEY_BBS_ID to bbsId
            KEY_FORUM_NAME to forumName
            KEY_BBS_TYPE to bbsType
            KEY_GAME_FORUM_TYPE to gameForumType
            KEY_STAY_LENGTH to stayLength
        }
        trackEvent(EVENT_FORUM_BROWSING_DURATION, json)
    }

    /**
     * 事件ID:CommunityBrowsingDuration
     * 事件名称:社区浏览时长事件
     * @param stayLength 用户在页面停留的时长
     */
    fun trackCommunityBrowsingDuration(
        stayLength: Double
    ) {
        val json = json {
            KEY_STAY_LENGTH to stayLength
        }
        trackEvent(EVENT_COMMUNITY_BROWSING_DURATION, json)
    }

    /**
     * 事件ID：ColumnClick
     * 事件名称：游戏专题点击事件
     * @param bottomTab 底部tab
     * @param multiTabId 多tab导航页ID
     * @param multiTabName 多tab导航页名称
     * @param position 序号
     * @param tabContent 选中tab的名称
     * @param customPageId 自定义页面ID
     * @param customPageName 自定义页面名称
     * @param linkType 链接类型
     * @param linkId 跳转链接
     * @param linkText 链接文案
     * @param gameColumnId 游戏专题ID
     * @param gameColumnName 游戏专题名称
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param location 位置
     * @param columnPattern 游戏专题样式
     * @param text 点击内容
     * @param buttonType 右上角文案
     * @param adGroupId 广告组广告 id
     * @see EVENT_COLUMN_CLICK
     */
    fun trackColumnClick(
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        linkType: String = "",
        linkId: String = "",
        linkText: String = "",
        gameColumnId: String = "",
        gameColumnName: String = "",
        gameId: String = "",
        gameName: String = "",
        location: String = "",
        columnPattern: String = "",
        text: String = "",
        buttonType: String = "",
        adGroupId: String,
        gameTag: List<String> = listOf(),
        sort: String = "",
        inclusionSize: String = "",
    ) {
        val json = json {
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_TAB_CONTENT to tabContent
            if (position != -1) {
                KEY_POSITION to position
            }
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
            KEY_GAME_COLUMN_ID to gameColumnId
            KEY_GAME_COLUMN_NAME to gameColumnName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_LOCATION to location
            KEY_COLUMN_PATTERN to columnPattern
            KEY_TEXT to text
            KEY_BUTTON_TYPE to buttonType
            KEY_IS_AD to adGroupId.isNotEmpty()
            KEY_AD_GROUP_ID to adGroupId
            KEY_GAME_TAG to gameTag
            "sort" to sort
            "inclusion_size" to inclusionSize
        }
        trackEvent(EVENT_COLUMN_CLICK, json)
    }

    /**
     * 事件ID：QqGameClick
     * 事件名称：QQ小游戏点击事件
     * @param bottomTab 底部tab
     * @param multiTabId 多tab导航页ID
     * @param multiTabName 多tab导航页名称
     * @param position 序号
     * @param tabContent 选中tab的名称
     * @param customPageId 自定义页面ID
     * @param customPageName 自定义页面名称
     * @param gameColumnId 游戏专题ID
     * @param gameColumnName 游戏专题名称
     * @param location 位置
     * @param columnPattern 游戏专题样式
     * @param searchContent 搜索内容
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @see EVENT_QQ_GAME_CLICK
     */
    fun trackQQGameClick(
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        gameColumnId: String = "",
        gameColumnName: String = "",
        location: String = "",
        columnPattern: String = "",
        searchContent: String = "",
        gameId: String = "",
        gameName: String = ""
    ) {
        val json = json {
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_TAB_CONTENT to tabContent
            if (position != -1) {
                KEY_POSITION to position
            }
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_COLUMN_ID to gameColumnId
            KEY_GAME_COLUMN_NAME to gameColumnName
            KEY_LOCATION to location
            "column_pattern" to columnPattern
            KEY_SEARCH_CONTENT to searchContent
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_QQ_GAME_CLICK, json)
    }

    /**
     * 事件ID：WechatGameClick
     * 事件名称：微信小游戏点击事件
     * @param bottomTab 底部tab
     * @param multiTabId 多tab导航页ID
     * @param multiTabName 多tab导航页名称
     * @param position 序号
     * @param tabContent 选中tab的名称
     * @param customPageId 自定义页面ID
     * @param customPageName 自定义页面名称
     * @param gameColumnId 游戏专题ID
     * @param gameColumnName 游戏专题名称
     * @param location 位置
     * @param columnPattern 游戏专题样式
     * @param searchContent 搜索内容
     * @param gameId 微信小游戏ID
     * @param gameName 微信小游戏名称
     * @see EVENT_WECHAT_GAME_CLICK
     */
    fun trackWechatGameClick(
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        gameColumnId: String = "",
        gameColumnName: String = "",
        location: String = "",
        columnPattern: String = "",
        searchContent: String = "",
        gameId: String = "",
        gameName: String = ""
    ) {
        val json = json {
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_TAB_CONTENT to tabContent
            if (position != -1) {
                KEY_POSITION to position
            }
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_COLUMN_ID to gameColumnId
            KEY_GAME_COLUMN_NAME to gameColumnName
            KEY_LOCATION to location
            KEY_COLUMN_PATTERN to columnPattern
            KEY_SEARCH_CONTENT to searchContent
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_WECHAT_GAME_CLICK, json)
    }

    /**
     * 事件ID GameListCollectionClick
     * 事件名称 游戏单合集点击事件
     */
    fun trackGameListCollectionClick(
        location: String,
        gameListCollectionId: String,
        gameListCollectionName: String,
        text: String,
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        gameCollectPattern: String = "",
        otherParams: HashMap<String, Any>
    ) {
        val json = json {
            KEY_LOCATION to location
            KEY_GAME_LIST_COLLECTION_ID to gameListCollectionId
            KEY_GAME_LIST_COLLECTION_NAME to gameListCollectionName
            KEY_TEXT to text
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_COLLECT_PATTERN to gameCollectPattern
            otherParams.forEach { (key, value) ->
                key to value
            }
        }
        trackEvent(EVENT_GAME_LIST_COLLECTION_CLICK, json)
    }

    /**
     * ContentCardClick 自定义页面：内容卡片点击事件
     */
    fun trackContentCardClick(
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        position: Int,
        tabContent: String,
        customPageId: String,
        customPageName: String,
        linkId: String,
        linkType: String,
        linkText: String
    ) {
        val json = json {
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_LINK_ID to linkId
            KEY_LINK_TYPE to linkType
            KEY_LINK_TEXT to linkText
        }
        trackEvent(EVENT_CONTENT_CARD_CLICK, json)
    }

    /**
     *  插件化区域点击事件
     */
    fun trackPluginAreaClick(
        text: String,
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        position: Int,
        tabContent: String,
        customPageId: String,
        customPageName: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_TEXT to text
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_PLUGIN_AREA_CLICK, json)
    }

    /**
     *  畅玩最近在玩点击事件
     */
    fun trackCWRecentlyPlayedClick(
        text: String,
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        position: Int,
        tabContent: String,
        customPageId: String,
        customPageName: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_TEXT to text
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_CW_RECENTLY_PLAYED_CLICK, json)
    }

    /**
     * qq小游戏最近在玩点击事件
     */
    fun trackQqGameRecentlyPlayedClick(
        text: String,
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        position: Int,
        tabContent: String,
        customPageId: String,
        customPageName: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_TEXT to text
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_QQ_GAME_RECENTLY_PLAYED_CLICK, json)
    }

    /**
     * 发现页点击事件
     */
    fun trackGameExploreClick(
        text: String,
        location: String,
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = 0,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        gameId: String = "",
        gameName: String = "",
        linkType: String = "",
        linkId: String = "",
        linkText: String = "",
        buttonType: String = "",
    ) {
        val json = json {
            KEY_TEXT to text
            KEY_LOCATION to location
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
            KEY_BUTTON_TYPE to buttonType
        }
        trackEvent(EVENT_GAME_EXPLORE_CLICK, json)
    }

    /**
     * ViewCustomPage 自定义页面浏览事件
     */
    fun trackViewCustomPage(
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        position: Int,
        tabContent: String,
        customPageId: String,
        customPageName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_VIEW_CUSTOM_PAGE, json)
    }

    /**
     * 事件ID：SuspendedWindowShow
     * 事件名称：右下悬浮窗展示事件
     */
    fun trackSuspendedWindowShow(
        pattern: String = "",
        location: String = "",
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        linkId: String = "",
        linkType: String = "",
        linkText: String = "",
        gameId: String = "",
        gameName: String = ""
    ) {
        val json = json {
            "suspended_window_pattern" to pattern
            KEY_LOCATION to location
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_LINK_ID to linkId
            KEY_LINK_TYPE to linkType
            KEY_LINK_TEXT to linkText
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_SUSPENDED_WINDOW_SHOW, json)
    }

    /**
     * 事件ID：SuspendedWindowClick
     * 事件名称：右下悬浮窗点击事件
     */
    fun trackSuspendedWindowClick(
        pattern: String = "",
        action: String = "",
        location: String = "",
        bottomTab: String = "",
        multiTabId: String = "",
        multiTabName: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageId: String = "",
        customPageName: String = "",
        linkId: String = "",
        linkType: String = "",
        linkText: String = "",
        gameId: String = "",
        gameName: String = ""
    ) {
        val json = json {
            "suspended_window_pattern" to pattern
            KEY_ACTION to action
            KEY_LOCATION to location
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_POSITION to position
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_LINK_ID to linkId
            KEY_LINK_TYPE to linkType
            KEY_LINK_TEXT to linkText
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_SUSPENDED_WINDOW_CLICK, json)
    }

    /**
     * 事件ID：InstalledListPermissionsDialogShow
     * 事件名称：已安装列表权限提示条展示事件
     * 触发时机： 授权提示条展示时触发 （提示条在底部TAB主页面常驻，各TAB切换时不重复上报展示事件）
     */
    fun trackInstalledListPermissionsDialogShow() {
        trackEvent(EVENT_INSTALLED_LIST_PERMISSIONS_DIALOG_SHOW)
    }

    /**
     * 事件ID：InstalledListPermissionsClick
     * 事件名称：已安装列表权限提示条点击事件
     * 触发时机：点击对应按钮时触发上报
     */
    fun trackInstalledListPermissionsClick(btnName: String) {
        val json = json {
            KEY_BUTTON_NAME to btnName
        }
        trackEvent(EVENT_INSTALLED_LIST_PERMISSIONS_CLICK, json)
    }

    /**
     * 事件ID：InstalledListPermissionsCustomDialogShow
     * 事件名称：已安装列表权限自定义弹窗展示事件
     * 触发时机：自定义授权提示弹窗展示时触发
     */
    fun trackInstalledListPermissionsCustomDialogShow() {
        trackEvent(EVENT_INSTALLED_LIST_PERMISSIONS_CUSTOM_DIALOG_SHOW)
    }

    /**
     * 事件ID：InstalledListPermissionsCustomClick
     * 事件名称：已安装列表权限自定义弹窗点击事件
     * 触发时机：点击对应按钮时触发上报
     */
    fun trackInstalledListPermissionsCustomClick(btnName: String) {
        val json = json {
            KEY_BUTTON_NAME to btnName
        }
        trackEvent(EVENT_INSTALLED_LIST_PERMISSIONS_CUSTOM_CLICK, json)
    }

    /**
     * 事件ID：InstalledListPermissionsResult
     * 事件名称：已安装列表权限获取结果事件
     * 触发时机：1、用户点击已安装列表自定义弹窗“开启”后，上报权限获取的结果
     * 2、用户点击授权提示条“去开启”后，上报权限获取的结果
     */
    fun trackInstalledListPermissionsResult(result: String) {
        val json = json {
            KEY_RESULT to result
        }
        trackEvent(EVENT_INSTALLED_LIST_PERMISSIONS_RESULT, json)
    }

    /**
     * 事件ID：NumberOfInstalledList
     * 事件名称：已安装列表数量
     * 触发时机：客户端检测到获取已安装列表权限5s上报所读取到的已安装应用的数量
     */
    fun trackNumberOfInstalledList(number: Int, packageSet: Set<String>) {
        val json = json {
            KEY_NUMBER to number
            KEY_APP_LIST to packageSet
        }
        trackEvent(EVENT_NUMBER_OF_INSTALLED_LIST, json)
    }

    /**
     * 事件ID: PureModeDialogShow
     * 事件名称: 纯净模式弹窗展示事件
     */
    fun trackPureModeDialogShow(gameId: String, gameName: String, gameType: String) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_PURE_MODE_DIALOG_SHOW, json)
    }

    /**
     * 事件ID: PureModeDialogClick
     * 事件名称: 纯净模式弹窗点击事件
     */
    fun trackPureModeDialogClick(
        gameId: String,
        gameName: String,
        gameType: String,
        buttonName: String,
        isIgnored: Boolean,
        linkId: String,
        linkType: String,
        linkText: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_BUTTON_NAME to buttonName
            KEY_IS_NOT_PROMPT to isIgnored
            KEY_LINK_TEXT to linkText
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
        }
        trackEvent(EVENT_PURE_MODE_DIALOG_CLICK, json)
    }

    /**
     * 事件ID: AddedProtectionDialogShow
     * 事件名称: 增强保护弹窗展示事件
     */
    fun trackAddedProtectionDialogShow(gameId: String, gameName: String, gameType: String) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_ADDED_PROTECTION_DIALOG_SHOW, json)
    }

    /**
     * 事件ID: AddedProtectionDialogClick
     * 事件名称: 增强保护弹窗点击事件
     */
    fun trackAddedProtectionDialogClick(
        gameId: String,
        gameName: String,
        gameType: String,
        buttonName: String,
        isIgnored: Boolean,
        linkId: String,
        linkType: String,
        linkText: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_BUTTON_NAME to buttonName
            KEY_IS_NOT_PROMPT to isIgnored
            KEY_LINK_TEXT to linkText
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
        }
        trackEvent(EVENT_ADDED_PROTECTION_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：follow_tab_filter_option_click
     * 事件名称：关注tab筛选项点击事件
     * 触发时机：点击关注页面下的筛选项时上报
     */
    fun trackFollowTabFilterOptionClick(filterName: String) {
        val json = json {
            KEY_FILTER_NAME to filterName
        }
        trackEvent(EVENT_FOLLOW_TAB_FILTER_OPTION_CLICK, json)
    }

    /**
     * 事件ID：follow_page_content_click
     * 事件名称：关注页面下内容点击事件
     * 触发时机：点击关注tab下的内容时上报
     */
    fun trackFollowPageContentClick(
        linkType: String,
        contentTitle: String,
    ) {
        val json = json {
            KEY_LINK_TYPE to linkType
            KEY_CONTENT_TITLE to contentTitle
        }
        trackEvent(EVENT_FOLLOW_PAGE_CONTENT_CLICK, json)
    }

    /**
     * 事件ID：recommended_user_follow_button_click
     * 事件名称：关注页面-推荐用户关注按钮点击事件
     * 触发时机：点击关注页面下-推荐用户卡片中的关注按钮时上报
     */
    fun trackRecommendedUserFollowButtonClick(
        userId: String,
        position: Int
    ) {
        val json = json {
            KEY_USER_ID_2 to userId
            KEY_POSITION to position
        }
        trackEvent(EVENT_RECOMMENDED_USER_FOLLOW_BUTTON_CLICK, json)
    }

    /**
     * 事件ID：follow_page_recommended_user_card_click
     * 事件名称：关注页面-推荐用户卡片点击事件
     * 触发时机：点击关注页面下-推荐用户卡片中时上报
     */
    fun trackFollowPageRecommendedUserCardClick(
        mongoldId: String,
        position: Int
    ) {
        val json = json {
            KEY_MONGOLD_ID to mongoldId
            KEY_POSITION to position
        }
        trackEvent(EVENT_FOLLOW_PAGE_RECOMMENDED_USER_CARD_CLICK, json)
    }

    /**
     * 事件ID：follow_tab_browse
     * 事件名称：关注tab浏览事件
     * 触发时机：进入关注tab 3秒后触发
     */
    fun trackFollowTabBrowse(
        isFirstTime: Boolean
    ) {
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
        }
        trackEvent(EVENT_FOLLOW_TAB_BROWSE, json)
    }

    /**
     * 事件ID：follow_tab_browse_duration
     * 事件名称：关注tab浏览时长事件
     * 触发时机：进入关注tab 3秒后开始计算，到离开关注tab时
     */
    fun trackFollowTabBrowseDuration(
        stayLength: String
    ) {
        val json = json {
            KEY_STAY_LENGTH to stayLength
        }
        trackEvent(EVENT_FOLLOW_TAB_BROWSE_DURATION, json)
    }

    /**
     * 事件ID：follow_page_user_and_forum_data_click
     * 事件名称：关注页面下用户及论坛数据点击事件
     * 触发时机：点击关注页面下-关注的用户及关注的论坛时
     */
    fun trackFollowPageUserAndForumDataClick(
        userId: String,
        bbsId: String,
        bbsName: String,
        bbsType: String
    ) {
        val json = json {
            KEY_USER_ID_2 to userId
            KEY_BBS_ID to bbsId
            KEY_BBS_NAME to bbsName
            KEY_BBS_TYPE to bbsType
        }
        trackEvent(EVENT_FOLLOW_PAGE_USER_AND_FORUM_DATA_CLICK, json)
    }

    /**
     * 事件ID：JumpLandPageAddressDialogShow
     * 事件名称：下载跳转第三方提示弹窗展示事件
     * 触发时机：触发下载跳转第三方提示弹窗时上报
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @see EVENT_JUMP_LAND_PAGE_ADDRESS_DIALOG_SHOW
     */
    fun trackJumpLandPageAddressDialogShow(gameId: String, gameName: String, gameType: String) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_JUMP_LAND_PAGE_ADDRESS_DIALOG_SHOW, json)
    }

    /**
     * 事件ID：JumpLandPageAddressDialogClick
     * 事件名称：下载跳转第三方提示弹窗展示事件
     * 触发时机：触发下载跳转第三方提示弹窗时上报
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameType 游戏的类型：单机、网游等
     * @see EVENT_JUMP_LAND_PAGE_ADDRESS_DIALOG_CLICK
     */
    fun trackJumpLandPageAddressDialogClick(buttonName: String, gameId: String, gameName: String, gameType: String) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_JUMP_LAND_PAGE_ADDRESS_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：DownloadSuspendedWindowGuideShow
     * 事件名称：下载悬浮窗引导图点击事件
     * 触发时机：当下载悬浮窗引导图展示时触发上报
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameSchemaType 游戏架构类型：64位/32位
     * @param downloadStatus 游戏下载状态
     * @param gameType 游戏的类型：单机、网游等
     * @param downloadType 实际下载方式：本地下载/畅玩下载
     * @see EVENT_DOWNLOAD_SUSPENDED_WINDOW_GUIDE_SHOW
     */
    fun trackDownloadSuspendedWindowGuideShow(
        gameId: String,
        gameName: String,
        gameSchemaType: String,
        downloadStatus: String,
        gameType: String,
        downloadType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_TYPE to gameType
            KEY_DOWNLOAD_TYPE to downloadType
        }
        trackEvent(EVENT_DOWNLOAD_SUSPENDED_WINDOW_GUIDE_SHOW, json)
    }

    /**
     * 事件ID：DownloadSuspendedWindowGuideClick
     * 事件名称：下载悬浮窗引导图点击事件
     * 触发时机：用户点击悬浮窗引导图中的【去开启悬浮窗】按钮时触发
     * @see EVENT_DOWNLOAD_SUSPENDED_WINDOW_GUIDE_CLICK
     */
    fun trackDownloadSuspendedWindowGuideClick() {
        val json = json {}
        trackEvent(EVENT_DOWNLOAD_SUSPENDED_WINDOW_GUIDE_CLICK, json)
    }

    /**
     * 事件ID：DownloadSuspendedWindowResultReturn
     * 事件名称：下载悬浮窗开启结果返回事件
     * 触发时机：当检测到APP获取到悬浮窗权限时触发上报
     * 来源：下载组件\悬浮窗引导图\其他
     * @see EVENT_DOWNLOAD_SUSPENDED_WINDOW_RESULT_RETURN
     */
    fun trackDownloadSuspendedWindowResultReturn(source: String) {
        val json = json {
            KEY_SOURCE to source
        }
        trackEvent(EVENT_DOWNLOAD_SUSPENDED_WINDOW_RESULT_RETURN, json)
    }

    /**
     * 事件ID：InstallationPromptBarShow
     * 事件名称：安装提示条展示事件
     * 触发时机：触发安装提示条展示时上报
     * @param source 来源：游戏下载\重启APP
     * @param downloadType 所上报游戏的实际下载方式：本地下载/畅玩下载
     * @param downloadStatus 所上报游戏下载状态
     * @param gameSchemaType 所上报游戏架构类型：64位/32位
     * @param gameType 游戏的类型：单机、网游等
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     */
    fun trackInstallationPromptBarShow(
        source: String,
        downloadType: String,
        downloadStatus: String,
        gameSchemaType: String,
        gameType: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_SOURCE to source
            KEY_DOWNLOAD_TYPE to downloadType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_GAME_TYPE to gameType
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_INSTALLATION_PROMPT_BAR_SHOW, json)
    }

    /**
     * 事件ID：InstallationPromptBarClick
     * 事件名称：安装提示条点击事件
     * 触发时机：触发安装提示条点击时上报
     * @param source 来源：游戏下载\重启APP
     * @param downloadType 所上报游戏的实际下载方式：本地下载/畅玩下载
     * @param downloadStatus 所上报游戏下载状态
     * @param gameSchemaType 所上报游戏架构类型：64位/32位
     * @param gameType 游戏的类型：单机、网游等
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     */
    fun trackInstallationPromptBarClick(
        source: String,
        downloadType: String,
        downloadStatus: String,
        gameSchemaType: String,
        gameType: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_SOURCE to source
            KEY_DOWNLOAD_TYPE to downloadType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_GAME_TYPE to gameType
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_INSTALLATION_PROMPT_BAR_CLICK, json)
    }

    /**
     * 事件ID：AutomaticDownloadPromptBarShow
     * 事件名称：自动下载提示条展示事件
     * 触发时机：触发自动下载提示条展示时上报
     * @param downloadType 所上报游戏的实际下载方式：本地下载/畅玩下载
     * @param downloadStatus 所上报游戏下载状态
     * @param gameSchemaType 所上报游戏架构类型：64位/32位
     * @param gameType 游戏的类型：单机、网游等
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     */
    fun trackAutomaticInstallationPromptBarShow(
        downloadType: String,
        downloadStatus: String,
        gameSchemaType: String,
        gameType: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_DOWNLOAD_TYPE to downloadType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_GAME_TYPE to gameType
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_AUTOMATIC_DOWNLOAD_PROMPT_BAR_SHOW, json)
    }

    /**
     * 事件ID：AutomaticDownloadPromptBarClick
     * 事件名称：自动下载提示条点击事件
     * 触发时机：触发自动下载提示条点击时上报
     * @param downloadType 所上报游戏的实际下载方式：本地下载/畅玩下载
     * @param downloadStatus 所上报游戏下载状态
     * @param gameSchemaType 所上报游戏架构类型：64位/32位
     * @param gameType 游戏的类型：单机、网游等
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     */
    fun trackAutomaticInstallationPromptBarClick(
        downloadType: String,
        downloadStatus: String,
        gameSchemaType: String,
        gameType: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_DOWNLOAD_TYPE to downloadType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_GAME_TYPE to gameType
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_AUTOMATIC_DOWNLOAD_PROMPT_BAR_CLICK, json)
    }

    /**
     * 事件ID：DownloadComponentsShow
     * 事件名称：下载组件展示事件
     * 触发时机：下载组件展示时上报
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameSchemaType 游戏架构类型：64位/32位
     * @param downloadStatus 所上报游戏下载状态
     * @param gameType 游戏的类型：单机、网游等
     * @param downloadType 所上报游戏的实际下载方式：本地下载/畅玩下载
     */
    fun trackDownloadComponentsShow(
        gameId: String,
        gameName: String,
        gameSchemaType: String,
        downloadStatus: String,
        gameType: String,
        downloadType: String,
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_TYPE to gameType
            KEY_DOWNLOAD_TYPE to downloadType
        }
        trackEvent(EVENT_DOWNLOAD_COMPONENTS_SHOW, json)
    }

    /**
     * 事件ID：DownloadComponentsClick
     * 事件名称：下载组件点击事件
     * 触发时机：下载组件点击时上报
     * @param gameId 游戏ID
     * @param gameName 游戏名称
     * @param gameSchemaType 游戏架构类型：64位/32位
     * @param downloadStatus 所上报游戏下载状态
     * @param gameType 游戏的类型：单机、网游等
     * @param downloadType 所上报游戏的实际下载方式：本地下载/畅玩下载
     * @param contentType 内容类型：安装问题提示\游戏专区\游戏礼包\开服表\悬浮窗权限提示
     * @param downloadTaskStatus 下载任务状态：下载中\暂停中\待安装\已安装
     */
    fun trackDownloadComponentsContentClick(
        gameId: String,
        gameName: String,
        gameSchemaType: String,
        downloadStatus: String,
        gameType: String,
        downloadType: String,
        contentType: String,
        downloadTaskStatus: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_SCHEMA_TYPE to gameSchemaType
            KEY_DOWNLOAD_STATUS to downloadStatus
            KEY_GAME_TYPE to gameType
            KEY_DOWNLOAD_TYPE to downloadType
            KEY_CONTENT_TYPE to contentType
            KEY_DOWNLOAD_TASK_STATUS to downloadTaskStatus
        }
        trackEvent(EVENT_DOWNLOAD_COMPONENTS_CONTENT_CLICK, json)
    }

    /**
     * 事件ID：ColumnTestClick
     * 事件名称：新游开测点击事件
     */
    fun trackColumnTestClick(
        location: String = "",
        recommendType: String = "",
        text: String = "",
        bottomTab: String? = "",
        multiTabId: String? = "",
        multiTabName: String? = "",
        position: Int? = -1,
        tabContent: String? = "",
        customPageId: String? = "",
        customPageName: String? = "",
        linkId: String? = "",
        linkType: String? = "",
        linkText: String? = "",
        gameId: String = "",
        gameName: String = "",
        buttonType: String = ""
    ) {
        val json = json {
            KEY_LOCATION to location
            "recommend_type" to recommendType
            KEY_TEXT to text
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_MULTI_TAB_ID to multiTabId
            if (position != -1) {
                KEY_POSITION to position
            }
            KEY_TAB_CONTENT to tabContent
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_LINK_TEXT to linkText
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_BUTTON_TYPE to buttonType
        }
        trackEvent(EVENT_COLUMN_TEST_CLICK, json)
    }

    /**
     * 事件ID：HaloSelfClick
     * 事件名称：我的光环点击事件
     * 触发时机：我的光环点击内容时上报
     * @param profile 点击内容的分组，包括：
     * ①顶部区域：右上角及用户信息区域
     * ②常用功能：“我的游戏、我的发布、我的游戏单、浏览记录、我的收藏”区域
     * ③推荐位：-
     * ④活动位：-
     * ⑤更多功能 ：-
     * ⑥其他：更多功能下方固定展示的区域
     * @param text 点击内容的文案，包括：
     * ①顶部区域：开启深色模式、关闭深色模式、签到、消息中心、立即登录、个人主页、我的徽章
     * ②常用功能：“我的游戏、我的发布、我的游戏单、浏览记录、我的收藏”区域
     * ③推荐位：上报点击内容标题，例如“我的游戏”
     * ④活动位：固定上报为“轮播图”
     * ⑤更多功能 ：上报点击内容标题，例如“游戏动态”
     * ⑥其他：更上报点击内容标题，例如“设置”
     * @param linkType 上报链接的类型，分组名称为“推荐位、活动位、更多内容”时上报
     * @param linkId 上报链接的ID，分组名称为“推荐位、活动位、更多内容”时上报
     * @param linkText 上报链接的标题，分组名称为“推荐位、活动位、更多内容”时上报
     */
    fun trackHaloSelfClick(
        profile: String,
        text: String,
        linkType: String,
        linkId: String,
        linkText: String
    ) {
        val json = json {
            KEY_PROFILE to profile
            KEY_TEXT to text
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
        }
        trackEvent(EVENT_HALO_SELF_CLICK, json)
    }

    /**
     * 事件ID：BypassBrowsing
     * 事件名称：分流器访问事件
     */
    fun trackByPassBrowsing(
        source: String,
        bypassName: String,
        bypassId: String,
        branchId: String,
        branchName: String,
        inProcessTime: Int,
        bypassVisitTime: Int,
        linkType: String,
        linkId: String,
        linkText: String,
        bypassStatus: Int
    ) {
        val json = json {
            "source" to source
            "bypass_name" to bypassName
            "bypass_id" to bypassId
            "branch_id" to branchId
            "branch_name" to branchName
            "inprocess_time" to inProcessTime
            "bypass_visit_time" to bypassVisitTime
            "link_type" to linkType
            "link_id" to linkId
            "link_text" to linkText
            "bypass_status" to bypassStatus
        }
        trackEvent(EVENT_BYPASS_BROWSING, json)
    }

    /**
     * 事件ID：FailBypass
     * 事件名称：分流失败
     */
    fun trackFailByPass(
        source: String,
        bypassName: String,
        bypassId: String,
        defeatedReason: String
    ) {
        val json = json {
            "source" to source
            "bypass_name" to bypassName
            "bypass_id" to bypassId
            "defeated_reason" to defeatedReason
        }
        trackEvent(EVENT_FAIL_BYPASS, json)
    }

    /**
     * 事件ID:GameSearchPageShow
     * 事件名称:游戏搜索页面访问事件
     * 触发时机:游戏搜索页面点击搜索框时触发
     */
    fun trackGameSearchPageShow(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        bottomTab: String,
        multiTabId: String,
        multiTabName: String,
        customPageId: String,
        customPageName: String,
        searchBoxPattern: String
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_BOTTOM_TAB to bottomTab
            KEY_MULTI_TAB_ID to multiTabId
            KEY_MULTI_TAB_NAME to multiTabName
            KEY_CUSTOM_PAGE_ID to customPageId
            KEY_CUSTOM_PAGE_NAME to customPageName
            KEY_SEARCH_BOX_PATTERN to searchBoxPattern

        }
        trackEvent(EVENT_GAME_SEARCH_PAGE_SHOW, json)
    }

    /**
     * 事件ID:GameSearchPageTabClick
     * 事件名称:游戏搜索页面tab选中事件
     * 触发时机:游戏搜索页面的导航tab被选中时触发
     */
    fun trackGameSearchPageTabClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        tabContent: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_TAB_CONTENT to tabContent
            KEY_POSITION to position
        }
        trackEvent(EVENT_GAME_SEARCH_PAGE_TAB_CLICK, json)
    }

    /**
     *  事件ID:GameSearchPageButtonClick
     *  事件名称:游戏搜索页面搜索按钮点击事件
     *  触发时机:点击搜索按钮（搜索历史）时触发
     */
    fun trackGameSearchPageButtonClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
        }
        trackEvent(EVENT_GAME_SEARCH_PAGE_BUTTON_CLICK, json)
    }

    /**
     * 事件ID:GameSearchResultReturn
     * 事件名称:游戏搜索结果返回事件
     * 触发时机:返回游戏搜索结果时触发
     */
    fun trackGameSearchResultReturn(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_GAME_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:GameSearchResultClick
     * 事件名称:游戏搜索结果点击事件
     * 触发时机:点击游戏搜索结果时触发
     */
    fun trackGameSearchResultClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        gameId: String,
        gameName: String,
        gameType: String,
        position: Int,
        adGroupId: String
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_POSITION to position
            KEY_IS_AD to adGroupId.isNotEmpty()
            KEY_AD_GROUP_ID to adGroupId
        }
        trackEvent(EVENT_GAME_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID:ArticleSearchResultReturn
     * 事件名称:内容搜索结果返回事件
     * 触发时机:返回内容搜索结果时触发
     */
    fun trackArticleSearchResultReturn(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_ARTICLE_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:ArticleSearchResultClick
     * 事件名称:内容搜索结果点击事件
     * 触发时机:点击内容搜索结果时触发
     */
    fun trackArticleSearchResultClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        contentId: String,
        contentName: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_CONTENT_ID to contentId
            KEY_CONTENT_NAME to contentName
            KEY_POSITION to position
        }
        trackEvent(EVENT_ARTICLE_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID:QASearchResultReturn
     * 事件名称:Q&A搜索结果返回事件
     * 触发时机:返回Q&A搜索结果时触发
     */
    fun trackQASearchResultReturn(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_QA_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:QASearchResultClick
     * 事件名称:Q&A搜索结果点击事件
     * 触发时机:点击Q&A搜索结果时触发
     */
    fun trackQASearchResultClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        contentId: String,
        contentName: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_CONTENT_ID to contentId
            KEY_CONTENT_NAME to contentName
            KEY_POSITION to position
        }
        trackEvent(EVENT_QA_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID:MiniGameSearchResultReturn
     * 事件名称:小游戏搜索结果返回事件
     * 触发时机:返回小游戏搜索结果时触发
     */
    fun trackMiniGameSearchResultReturn(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_MINI_GAME_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:MiniGameSearchResultClick
     * 事件名称:小游戏搜索结果点击事件
     * 触发时机:点击小游戏搜索结果时触发
     */
    fun trackMiniGameSearchResultClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        gameId: String,
        gameName: String,
        gameType: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_POSITION to position
        }
        trackEvent(EVENT_MINI_GAME_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID:UserSearchResultReturn
     * 事件名称:用户搜索结果返回事件
     * 触发时机:返回用户搜索结果时触发
     */
    fun trackUserSearchResultReturn(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_USER_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:UserSearchResultClick
     * 事件名称:用户搜索结果点击事件
     * 触发时机:点击用户搜索结果时触发
     */
    fun trackUserSearchResultClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        mongold_id: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_MONGOLD_ID to mongold_id
            KEY_POSITION to position
        }
        trackEvent(EVENT_USER_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID:ForumSearchResultReturn
     * 事件名称:论坛搜索结果返回事件
     * 触发时机:返回论坛搜索结果时触发
     */
    fun trackForumSearchResultReturn(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_FORUM_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:ForumSearchResultClick
     * 事件名称:论坛搜索结果点击事件
     * 触发时机:点击论坛搜索结果时触发
     */
    fun trackForumSearchResultClick(
        pageId: String,
        pageName: String,
        sourceEntrance: String,
        searchContent: String,
        searchType: String,
        bbsId: String,
        forumName: String,
        bbsType: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_BBS_ID to bbsId
            KEY_FORUM_NAME to forumName
            KEY_BBS_TYPE to bbsType
            KEY_POSITION to position
        }
        trackEvent(EVENT_FORUM_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID:GameCollectSearchResultReturn
     * 事件名称:游戏单搜索结果返回事件
     * 触发时机:游戏单搜索返回搜索结果时触发
     */
    fun trackGameCollectSearchResultReturn(
        pageId: String,
        pageName: String,
        location: String,
        searchContent: String,
        searchType: String,
        searchResult: Boolean
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_LOCATION to location
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_TRACK_GAME_COLLECT_SEARCH_RESULT_RETURN, json)
    }

    /**
     * 事件ID:GameCollectSearchResultClick
     * 事件名称:游戏单搜索结果点击事件
     * 触发时机:点击游戏单搜索结果时触发
     */
    fun trackGameCollectSearchResultClick(
        pageId: String,
        pageName: String,
        searchContent: String,
        searchType: String,
        location: String,
        gameCollectId: String,
        gameCollectTitle: String,
        position: Int
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_TYPE to searchType
            KEY_LOCATION to location
            KEY_GAME_COLLECT_ID to gameCollectId
            KEY_GAME_COLLECT_TITLE to gameCollectTitle
            KEY_POSITION to position
        }
        trackEvent(EVENT_GAME_COLLECT_SEARCH_RESULT_CLICK, json)
    }

    /**
     * 事件ID：CancelAppointmentDialogShow
     * 事件名称：游戏取消预约弹窗展示事件
     * 触发时机：触发游戏取消弹窗时上报
     */
    fun trackCancelAppointmentDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_CANCEL_APPOINTMENT_DIALOG_SHOW, json)
    }

    /**
     * 事件ID：CancelAppointmentDialogClick
     * 事件名称：游戏取消预约弹窗点击事件
     * 触发时机：点击游戏取消弹窗时上报
     */
    fun trackCancelAppointmentDialogClick(
        gameId: String,
        gameName: String,
        gameType: String,
        buttonName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_CANCEL_APPOINTMENT_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：AppointmentSuccessDialogShow
     * 事件名称：预约成功弹窗展示事件
     * 触发时机：触发游戏预约成功提示弹窗时上报
     */
    fun trackAppointmentSuccessDialogShow(
        gameId: String,
        gameName: String,
        gameType: String,
        wechatRemind: Boolean,
        messageRemind: Boolean?,
        automaticDownload: Boolean?,
        calendarRemind: Boolean?
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_WECHAT_REMIND to wechatRemind
            KEY_MESSAGE_REMIND to messageRemind
            KEY_AUTOMATIC_DOWNLOAD to automaticDownload
            KEY_CALENDAR_REMIND to calendarRemind
        }
        trackEvent(EVENT_APPOINTMENT_SUCCESS_DIALOG_SHOW, json)
    }

    /**
     * 事件ID：AppointmentSuccessDialogClick
     * 事件名称：预约成功弹窗点击事件
     * 触发时机：游戏预约成功提示弹窗点击时上报
     */
    fun trackAppointmentSuccessDialogClick(
        gameId: String,
        gameName: String,
        gameType: String,
        buttonName: String,
        wechatRemind: Boolean? = null,
        messageRemind: Boolean? = null,
        automaticDownload: Boolean? = null,
        calendarRemind: Boolean? = null
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_BUTTON_NAME to buttonName
            KEY_WECHAT_REMIND to wechatRemind
            KEY_MESSAGE_REMIND to messageRemind
            KEY_AUTOMATIC_DOWNLOAD to automaticDownload
            KEY_CALENDAR_REMIND to calendarRemind
        }
        trackEvent(EVENT_APPOINTMENT_SUCCESS_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：OpenAppointmentAutomaticDownload
     * 事件名称：预约开启自动下载事件
     * 触发时机：我的游戏-预约tab 开启自动下载时上报
     */
    fun trackOpenAppointmentAutomaticDownload(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_OPEN_APPOINTMENT_AUTOMATIC_DOWNLOAD, json)
    }

    /**
     * 事件ID：CancelAppointmentAutomaticDownload
     * 事件名称：预约取消自动下载事件
     * 触发时机：我的游戏-预约tab 取消自动下载时上报
     */
    fun trackCancelAppointmentAutomaticDownload(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_CANCEL_APPOINTMENT_AUTOMATIC_DOWNLOAD, json)
    }

    /**
     * 事件ID：AppointmentGameOnlineDialogShow
     * 事件名称：预约游戏上线弹窗展示事件
     * 触发时机：触发预约游戏上线提示弹窗时上报
     */
    fun trackAppointmentGameOnlineDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_APPOINTMENT_GAME_ONLINE_DIALOG_SHOW, json)

    }

    /**
     * 事件ID：AppointmentGameOnlineDialogClick
     * 事件名称：预约游戏上线弹窗点击事件
     * 触发时机：触发预约游戏上线提示弹窗点击时上报
     */
    fun trackAppointmentGameOnlineDialogClick(
        buttonName: String,
        gameId: String? = null,
        gameName: String? = null,
        gameType: String? = null,
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_APPOINTMENT_GAME_ONLINE_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：SearchDiscoveryClick
     * 事件名称：搜索发现点击事件
     * 触发时机：点击搜索发现时触发
     * @param labelName 标签名称
     * @param labelId 标签ID
     * @param searchContent 搜索内容
     * @param position 序号
     * @see EVENT_SEARCH_DISCOVERY_CLICK
     */
    fun trackSearchDiscoveryClick(
        labelName: String,
        labelId: String,
        searchContent: String,
        position: Int
    ) {
        val json = json {
            KEY_LABEL_NAME to labelName
            KEY_LABEL_ID to labelId
            KEY_SEARCH_CONTENT to searchContent
            KEY_POSITION to position
        }
        trackEvent(EVENT_SEARCH_DISCOVERY_CLICK, json)
    }


    /**
     * 事件ID：JiGuangPushClick
     * 事件名称：极光推送点击事件
     * 触发时机：点击极光推送时触发
     */
    @JvmStatic
    fun trackJiGuangPushClick(
        id: String,
        title: String,
        content: String,
        linkType: String,
        linkId: String,
    ) {
        val json = json {
            "message_id" to id
            KEY_LINK_TEXT to title
            "link_content" to content
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
        }
        trackEvent(EVENT_JIGUANG_PUSH_CLICK, json)
    }

    /**
     * 事件ID:PkClick
     * 事件名称:PK组件点击事件
     * 触发时机:点击PK组件时上报
     */
    fun trackPKClick(
        pageId: String,
        pageName: String,
        pageBusinessId: String,
        pkId: String,
        pkName: String,
        option: String = "",
        linkType: String = "",
        linkId: String = "",
        linkText: String = "",
        clickSite: String
    ) {
        val json = json {
            KEY_PAGE_ID to pageId
            KEY_PAGE_NAME to pageName
            KEY_PAGE_BUSINESS_ID to pageBusinessId
            "pk_id" to pkId
            "pk_name" to pkName
            "option" to option
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
            "click_site" to clickSite
        }
        trackEvent(EVENT_PK_CLICK, json)
    }

    /**
     * 事件ID:GameDetailModuleClick
     * 事件名称:游戏详情详情tab内组件点击
     * 触发时机:在游戏详情的详情tab点击触发跳转/打开弹窗时上报
     */
    fun trackGameDetailModuleClick(
        gameId: String?,
        gameName: String?,
        gameType: String?,
        contentType: String?,
        moduleType: String?,
        moduleName: String?,
        sequence: Int?,
        subModuleName: String? = null,
        supSequence: Int? = null,
        linkType: String? = null,
        linkId: String? = null,
        linkText: String? = null,
        gameStatus: String?
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_CONTENT_TYPE to contentType
            KEY_MODULE_TYPE to moduleType
            KEY_MODULE_NAME to moduleName
            KEY_SEQUENCE to sequence
            "sub_module_name" to subModuleName
            "sup_sequence" to supSequence
            KEY_LINK_TYPE to linkType
            KEY_LINK_ID to linkId
            KEY_LINK_TEXT to linkText
            "game_status" to gameStatus
        }
        trackEvent(EVENT_GAME_DETAIL_MODULE_CLICK, json)
    }

    /**
     * 事件ID：NetworkAccelerationGuidanceDiagramShow
     * 事件名称：网络加速引导图展示事件
     * 触发时机：网络加速引导图展示触发
     */
    fun trackNetworkAccelerationGuidanceDiagramShow(
        packageName: String,
        gameId: String,
        gameName: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_GUIDANCE_DIAGRAM_SHOW, json)
    }

    /**
     * 事件ID：NetworkAccelerationButtonClick
     * 事件名称：网络加速按钮点击事件
     * 触发时机：用户点击网络加速按钮时触发上报以及点击时的具体场景以及用户的相关属性
     */
    fun trackNetworkAccelerationButtonClick(
        packageName: String,
        gameId: String,
        gameName: String,
        memberType: String,
        districtServer: String,
        sceneType: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_MEMBER_TYPE to memberType
            KEY_DISTRICT_SERVER to districtServer
            KEY_SCENE_TYPE to sceneType
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_BUTTON_CLICK, json)
    }

    /**
     * 事件ID：NetworkAccelerationStartup
     * 事件名称：网络加速启动事件
     * 触发时机：调用奇游SDK进行加速时进行上报
     */
    fun trackNetworkAccelerationStartup(
        packageName: String,
        gameId: String,
        gameName: String,
        memberType: String,
        districtServer: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_MEMBER_TYPE to memberType
            KEY_DISTRICT_SERVER to districtServer
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_START_UP, json)
    }

    /**
     * 事件ID：NetworkAccelerationStartupResult
     * 事件名称：网络加速启动结果事件
     * 触发时机：调用奇游SDK进行加速时成功\失败时触发上报，失败是需上报具体的code码
     */
    fun trackNetworkAccelerationStartupResult(
        packageName: String,
        gameId: String,
        gameName: String,
        memberType: String,
        districtServer: String,
        result: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_MEMBER_TYPE to memberType
            KEY_DISTRICT_SERVER to districtServer
            KEY_RESULT to result
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_START_UP_RESULT, json)
    }

    /**
     * 事件ID：NetworkAccelerationOtherButtonClick
     * 事件名称：网络加速其他按钮点击事件
     * 触发时机：点击【进入游戏\停止加速】时，触发上报
     */
    fun trackNetworkAccelerationOtherButtonClick(
        packageName: String,
        gameId: String,
        gameName: String,
        memberType: String,
        buttonName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_MEMBER_TYPE to memberType
            KEY_BUTTON_NAME to buttonName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_OTHER_BUTTON_CLICK, json)
    }

    /**
     * 事件ID：MembershipActivationDialogShow
     * 事件名称：会员开通提示弹窗展示事件
     * 触发时机：会员提示弹窗展示时触发上报
     */
    fun trackMembershipActivationDialogShow(
        packageName: String,
        gameId: String,
        gameName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_MEMBERSHIP_ACTIVATION_DIALOG_SHOW, json)
    }

    /**
     * 事件ID：MembershipActivationDialogClick
     * 事件名称：会员开通提示弹窗点击事件
     * 触发时机：用户点击会员提示弹窗的按钮【去开通】时触发上报
     */
    fun trackMembershipActivationDialogClick(
        packageName: String,
        gameId: String,
        gameName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_MEMBERSHIP_ACTIVATION_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：NetworkAccelerationFailureDialogShow
     * 事件名称：加速失败提示弹窗展示事件
     * 触发时机：加速失败提示弹窗展示时触发上报
     */
    fun trackNetworkAccelerationFailureDialogShow(
        packageName: String,
        gameId: String,
        gameName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_FAILURE_DIALOG_SHOW, json)
    }

    /**
     * 事件ID：NetworkAccelerationFailureDialogClick
     * 事件名称：加速失败提示弹窗点击事件
     * 触发时机：用户点击加速失败提示弹窗的按钮【联系客服】时触发上报
     */
    fun trackNetworkAccelerationFailureDialogClick(
        packageName: String,
        gameId: String,
        gameName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_FAILURE_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：NetworkAccelerationConflictDialogShow
     * 事件名称：加速冲突提示弹窗展示事件
     * 触发时机：加速冲突提示弹窗展示时触发上报
     */
    fun trackNetworkAccelerationConflictDialogShow(
        packageName: String,
        gameId: String,
        gameName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_CONFLICT_DIALOG_SHOW, json)
    }

    /**
     * 事件ID：NetworkAccelerationConflictDialogClick
     * 事件名称：加速冲突提示弹窗点击事件
     * 触发时机：用户点击加速冲突提示弹窗的按钮【暂不启动】\【继续启动】时触发上报
     */
    fun trackNetworkAccelerationConflictDialogClick(
        packageName: String,
        gameId: String,
        gameName: String,
        buttonName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_BUTTON_NAME to buttonName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_NETWORK_ACCELERATION_CONFLICT_DIALOG_CLICK, json)
    }

    /**
     * 事件ID：MyAssetsPageShow
     * 事件名称：我的资产页面展示事件
     * 触发时机：进入我的资产页面时触发上报
     */
    fun trackMyAssetsPageShow(
        packageName: String,
        gameId: String,
        gameName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_PACKAGE_NAME to packageName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_MY_ASSETS_PAGE_SHOW, json)
    }

    /**
     * 事件ID：MemberRechargeButtonClick
     * 事件名称：会员充值按钮点击事件
     * 触发时机：用户点击立即支付按钮时触发上报
     * note:这个事件目前有 web 调用调用原生方法上报
     */
    fun trackMemberRechargeButtonClick(
        isFirstTime: Boolean,
        setMenuName: String,
        paymentAmount: String
    ) {
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_SET_MENU_NAME to setMenuName
            KEY_PAYMENT_AMOUNT to paymentAmount
        }
        trackEvent(EVENT_MEMBER_RECHARGE_BUTTON_CLICK, json)
    }

    /**
     * 事件ID：MemberPaymentButtonClick
     * 事件名称：会员充值按钮点击事件
     * 触发时机：用户点击立即支付按钮时触发上报
     */
    fun trackMemberPaymentButtonClick(
        isFirstTime: Boolean,
        paymentType: String,
        setMenuName: String,
        paymentAmount: String
    ) {
        val json = json {
            KEY_IS_FIRST_TIME to isFirstTime
            KEY_SET_MENU_NAME to setMenuName
            KEY_PAYMENT_AMOUNT to paymentAmount
            KEY_PAYMENT_TYPE to paymentType
        }
        trackEvent(EVENT_MEMBER_PAYMENT_BUTTON_CLICK, json)
    }

    /**
     * 事件ID：MemberRechargeResult
     * 事件名称：会员充值结果返回事件
     * 触发时机：支付的回调结果返回时触发上报
     */
    fun trackMemberRechargeResult(
        paymentType: String,
        setMenuName: String,
        paymentAmount: String,
        result: String
    ) {
        val json = json {
            KEY_PAYMENT_TYPE to paymentType
            KEY_SET_MENU_NAME to setMenuName
            KEY_PAYMENT_AMOUNT to paymentAmount
            KEY_RESULT to result
        }
        trackEvent(EVENT_MEMBER_RECHARGE_RESULT, json)
    }

    /**
     * 事件ID：MyAssetsPageContactCustomerServiceClick
     * 事件名称：我的资产联系客服点击事件
     * 触发时机：用户在【我的资产】点击联系客服时触发上报
     */
    fun trackMyAssetsPageContactCustomerServiceClick() {
        trackEvent(EVENT_MY_ASSETS_PAGE_CONTACT_CUSTOMER_SERVICE_CLICK)
    }

    fun trackSensorsAnalyticsFromWeb(eventName: String, hashmap: HashMap<String, Any>) {
        val json = json {
            hashmap.iterator().forEach { (key, value) ->
                key to value
            }
        }
        trackEvent(eventName, json)
    }

    /**
     * 事件ID：MyAssetsPageContactCustomerServiceClick
     * 事件名称：我的资产联系客服点击事件
     * 触发时机：用户在【我的资产】点击联系客服时触发上报
     */
    fun trackStopAcceleratingDialogShow(
        gameId: String,
        gameName: String,
        packageName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
        }
        trackEvent(EVENT_STOP_ACCELERATING_DIALOG_SHOW, json)
    }

    /**
     * 事件ID:CalendarPermissionsDialogShow
     * 事件名称:获取日历权限弹窗展示事件
     */
    fun trackCalendarPermissionsDialogShow(
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_CALENDAR_PERMISSIONS_DIALOG_SHOW, json)
    }

    /**
     * 事件ID:CalendarPermissionsDialogClick
     * 事件名称:获取日历权限弹窗点击事件
     */
    fun trackCalendarPermissionsDialogClick(
        buttonName: String,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(EVENT_CALENDAR_PERMISSIONS_DIALOG_CLICK, json)
    }

    /**
     * 事件ID:CalendarPermissionsDialogResult
     * 事件名称:获取日历权限结果
     */
    fun trackCalendarPermissionsDialogResult(
        result: Boolean,
        gameId: String,
        gameName: String,
        gameType: String
    ) {
        val json = json {
            KEY_RESULT to if (result) "授权" else "未授权"
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
        }
        trackEvent(CALENDAR_PERMISSIONS_DIALOG_RESULT, json)
    }

    /**
     * 事件ID:ClassificationSearch
     * 事件名称:分类搜索事件
     * 触发时机:分类详情页/分类标签筛选弹窗 点击搜索框时上报
     */
    fun logClassificationSearch(pageId: String, pageName: String) {
        val json = json {
            KEY_CLASSIFICATION_ID to pageId
            KEY_CLASSIFICATION_NAME to pageName
        }
        trackEvent(EVENT_CLASSIFICATION_SEARCH, json)
    }

    /**
     * 事件ID:ClassificationSearchReturn
     * 事件名称:分类搜索结果事件
     * 触发时机:分类标签搜索返回搜索结果时上报
     */
    fun logClassificationSearchReturn(pageId: String, pageName: String, searchContent: String, searchResult: Boolean) {
        val json = json {
            KEY_CLASSIFICATION_ID to pageId
            KEY_CLASSIFICATION_NAME to pageName
            KEY_SEARCH_CONTENT to searchContent
            KEY_SEARCH_RESULT to searchResult
        }
        trackEvent(EVENT_CLASSIFICATION_SEARCH_RETURN, json)
    }

    /**
     * 事件ID:ClassificationSearchReturnClick
     * 事件名称:分类搜索结果点击事件
     * 触发时机:分类标签搜索的搜索结果列表点击时上报
     */
    fun logClassificationSearchReturnClick(pageId: String, pageName: String, searchContent: String, gameTag: String) {
        val json = json {
            KEY_CLASSIFICATION_ID to pageId
            KEY_CLASSIFICATION_NAME to pageName
            KEY_SEARCH_CONTENT to searchContent
            KEY_GAME_TAG to listOf(gameTag)
        }
        trackEvent(EVENT_CLASSIFICATION_SEARCH_RETURN_CLICK, json)
    }

    /**
     * 事件ID:GameDetailVideoClick
     * 事件名称:游戏详情视频点击事件
     */
    fun trackGameDetailVideoClick(
        gameName: String,
        gameId: String,
        gameType: String,
        lastPageName: String,
        lastPageId: String,
        action: String,
        playType: String,
        isFullScreen: Boolean,
        sequence: Int,
        tabName: String,
        playLength: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_GAME_TYPE to gameType
            KEY_LAST_PAGE_ID to lastPageId
            KEY_LAST_PAGE_NAME to lastPageName
            KEY_ACTION to action
            KEY_PLAY_TYPE to playType
            "is_full_screen" to isFullScreen
            KEY_SEQUENCE to sequence
            "tab_name" to tabName
            "play_length" to playLength
        }
        trackEvent(EVENT_GAME_DETAIL_VIDEO_CLICK, json)
    }

    /**
     * 事件ID:GetAdTag
     * 事件名称:获取广告标识
     */
    fun trackGetAdTag(
        adTag: String
    ) {
        val json = json {
            "ad_tag" to adTag
        }
        trackEvent(EVENT_GET_AD_TAG, json)
    }


    /**
     * 事件ID：DspAdClick
     * 事件名称：dsp广告点击事件
     * 触发时机：点击dsp广告时上报
     * @param pageId 页面ID
     * @param pageBusinessId 页面业务ID
     * @param lastPageName 上一页页面名称
     * @param lastPageId 上一页页面ID
     * @param lastPageBusinessId 上一页页面业务ID
     * @param location 位置
     * @param bottomTab 底部tab
     * @param severalTabPageName 多tab导航页名称
     * @param severalTabPageId 多tab导航页ID
     * @param position 序号
     * @param tabContent 选中tab的名称
     * @param customPageName 自定义页面名称
     * @param customPageId 自定义页面ID
     * @param gameColumnName 游戏专题名称
     * @param gameColumnId 游戏专题ID
     * @param searchContent 搜索内容
     * @param adId 广告id
     * @param interactionType 交互类型
     * @param wechatAppid 微信小游戏id
     * @param gameName 游戏名称
     * @param text 点击内容
     */
    fun trackDspAdClick(
        pageId: String = "",
        pageBusinessId: String = "",
        lastPageName: String = "",
        lastPageId: String = "",
        lastPageBusinessId: String = "",
        location: String = "",
        bottomTab: String = "",
        severalTabPageName: String = "",
        severalTabPageId: String = "",
        position: Int = -1,
        tabContent: String = "",
        customPageName: String = "",
        customPageId: String = "",
        gameColumnName: String = "",
        gameColumnId: String = "",
        searchContent: String = "",
        adId: String = "",
        interactionType: String = "",
        wechatAppid: String = "",
        gameName: String = "",
        text: String = ""
    ): JSONObject {
        val json = JSONObject().apply {
            put(KEY_PAGE_ID, pageId)
            put(KEY_PAGE_BUSINESS_ID, pageBusinessId)
            put(KEY_LAST_PAGE_NAME, lastPageName)
            put(KEY_LAST_PAGE_ID, lastPageId)
            put(KEY_LAST_PAGE_BUSINESS_ID, lastPageBusinessId)
            put(KEY_LOCATION, location)
            put(KEY_BOTTOM_TAB, bottomTab)
            put(KEY_MULTI_TAB_NAME, severalTabPageName)
            put(KEY_MULTI_TAB_ID, severalTabPageId)
            put(KEY_POSITION, position)
            put(KEY_TAB_CONTENT, tabContent)
            put(KEY_CUSTOM_PAGE_NAME, customPageName)
            put(KEY_CUSTOM_PAGE_ID, customPageId)
            put(KEY_GAME_COLUMN_NAME, gameColumnName)
            put(KEY_GAME_COLUMN_ID, gameColumnId)
            put(KEY_SEARCH_CONTENT, searchContent)
            put(KEY_AD_ID, adId)
            put(KEY_INTERACTION_TYPE, interactionType)
            put(KEY_WECHAT_APPID, wechatAppid)
            put(KEY_GAME_NAME, gameName)
            put(KEY_TEXT, text)
        }
        trackEvent(EVENT_DSP_AD_CLICK, json)
        return json
    }

    fun trackDspAdClick(json: JSONObject) {
        trackEvent(EVENT_DSP_AD_CLICK, json)
    }

    /**
     * 事件ID：InstallDspAdClick
     * 事件名称：dsp广告安装点击事件
     * 触发时机：dsp广告下载完成后点击安装或自动触发安装时上报
     * @param adId 广告id
     * @param gameName 游戏名称
     * @param action 触发行为
     */
    fun trackInstallDspAdClick(
        adId: String = "",
        gameName: String = "",
        action: String = ""
    ) {
        val json = JSONObject().apply {
            put(KEY_AD_ID, adId)
            put(KEY_GAME_NAME, gameName)
            put(KEY_ACTION, action)
        }
        trackEvent(EVENT_INSTALL_DSP_AD_CLICK, json)
    }

    /**
     * 事件ID：InstallDspAdCFinish
     * 事件名称：dsp广告安装完成事件
     * 触发时机：dsp广告完成安装时上报
     * @param adId 广告id
     * @param gameName 游戏名称
     */
    private fun trackInstallDspAdCFinish(
        adId: String = "",
        gameName: String = ""
    ) {
        val json = JSONObject().apply {
            put(KEY_AD_ID, adId)
            put(KEY_GAME_NAME, gameName)
        }
        trackEvent(EVENT_INSTALL_DSP_ADC_FINISH, json)
    }


    /**
     * 事件ID:InsufficientDurationDialogShow
     * 事件名称:时长不足提示弹窗展示事件
     */
    fun trackInsufficientDurationDialogShow(
        gameId: String,
        gameName: String,
        packageName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_INSUFFICIENT_DURATION_DIALOG_SHOW, json)
    }

    /**
     * 事件ID:InsufficientDurationDialogClick
     * 事件名称:时长不足提示弹窗点击事件
     */
    fun trackInsufficientDurationDialogClick(
        gameId: String,
        gameName: String,
        packageName: String,
        sourceEntrance: String,
        buttonName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_INSUFFICIENT_DURATION_DIALOG_CLICK, json)
    }

    /**
     * 事件ID:TimedPackageExpiresDialogShow
     * 事件名称:计时套餐临期提示弹窗展示事件
     */
    fun trackTimedPackageExpiresDialogShow(
        gameId: String,
        gameName: String,
        packageName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_TIMED_PACKAGE_EXPIRES_DIALOG_SHOW, json)
    }

    /**
     * 事件ID:TimedPackageExpiresDialogClick
     * 事件名称:计时套餐临期提示弹窗点击事件
     */
    fun trackTimedPackageExpiresDialogClick(
        gameId: String,
        gameName: String,
        packageName: String,
        sourceEntrance: String,
        buttonName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_TIMED_PACKAGE_EXPIRES_DIALOG_CLICK, json)
    }

    /**
     * 事件ID:MonthlyPackageExpiresDialogShow
     * 事件名称:包月套餐临期提示弹窗展示事件
     */
    fun trackMonthlyPackageExpiresDialogShow(
        gameId: String,
        gameName: String,
        packageName: String,
        sourceEntrance: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
        }
        trackEvent(EVENT_MONTHLY_PACKAGE_EXPIRES_DIALOG_SHOW, json)
    }

    /**
     * 事件ID:MonthlyPackageExpiresDialogClick
     * 事件名称:包月套餐临期提示弹窗点击事件
     */
    fun trackMonthlyPackageExpiresDialogClick(
        gameId: String,
        gameName: String,
        packageName: String,
        sourceEntrance: String,
        buttonName: String
    ) {
        val json = json {
            KEY_GAME_ID to gameId
            KEY_GAME_NAME to gameName
            KEY_PACKAGE_NAME to packageName
            KEY_SOURCE_ENTRANCE to sourceEntrance
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_MONTHLY_PACKAGE_EXPIRES_DIALOG_CLICK, json)
    }

    /**
     * 事件ID:DurationExhaustedDialogShow
     * 事件名称:时长耗尽提示弹窗展示事件
     */
    fun trackDurationExhaustedDialogShow() {
        trackEvent(EVENT_DURATION_EXHAUSTED_DIALOG_SHOW)
    }

    /**
     * 事件ID:DurationExhaustedDialogClick
     * 事件名称:时长耗尽提示弹窗展示事件
     */
    fun trackDurationExhaustedDialogClick(buttonName: String) {
        val json = json {
            KEY_BUTTON_NAME to buttonName
        }
        trackEvent(EVENT_DURATION_EXHAUSTED_DIALOG_CLICK, json)
    }

}