using System.Collections.Generic;
using GameAnalyticsSDK;
using GameAnalyticsSDK.Events;
using UnityEngine;
using GameAnalyticsSDK.Wrapper;
using Touka.GameLogic;
namespace Touka
{
    /// 
    /// 数据统计类
    ///
    /// 包含Umeng、GA、Tenjin的初始化及打点;Umeng在线参数初始化;
    /// ** 需在 StaticStringKey 类里修改对应ID
    /// 
    public class ToukaAnalyticsManager : ToukaSingletonMonoBehaviour
    {
        /// 
        /// Init
        /// 
        public void Init()
        {
            Debug.Log("[ToukaAnalyticsManager] Init");
            StaticOnlineParams.Instance.InitData();     // 初始化在线参数列表
#if UNITY_EDITOR
            StaticOnlineParams.GetInstance().Init();        // 初始化在线参数
            return;
#else
#endif
            InitUmeng();        // 初始化umeng
            InitGA();           // 初始化ga
            InitTenjin();       // 初始化tenjin
            StaticOnlineParams.GetInstance().Init();        // 初始化在线参数
            ToukaUtilsInner.Instance.Check2DaysLogin();     // 检查次日登录
            ToukaUtilsInner.Instance.SaveFirstLoginTime();      // 记录首次登录游戏时间
        }
        #region Inits
        /// 
        /// 初始化Umeng
        /// 
        private void InitUmeng()
        {
#if UNITY_IOS
            TGTools.Instance.onRemoteConfigHandler = GetRemoteConfigOnline;
            TGTools.Instance.InitSdk(StaticStringsKey.UMENG_APPKEY, StaticStringsKey.UMENG_CHANNELID);
            Umeng.Analytics.SetLogEnabled(true);
#elif UNITY_ANDROID
        Umeng.Analytics.StartWithAppKeyAndChannelId (StaticStringsKey.UMENG_APPKEY, StaticStringsKey.UMENG_CHANNELID);
        Umeng.Analytics.SetLogEnabled (false);
#endif
        }
        /// 
        /// Umeng在线参数回调
        /// 
        public void GetRemoteConfigOnline()
        {
            Debug.Log("[ToukaAnalyticsManager] get remote config from online");
            StaticOnlineParams.Instance.parseGameOnlineConfig();
        }
        /// 
        /// 初始化GA
        /// 
        private void InitGA()
        {
            if (UnityEngine.Object.FindObjectOfType(typeof(GameAnalytics)) == null)
            {
                GameObject ga = new GameObject();
                ga.name = "GameAnalytics";
                ga.transform.parent = transform;
                ga.AddComponent();
                ga.AddComponent();
            }
            else
            {
                Debug.LogWarning("A GameAnalytics object already exists in this scene - you should never have more than one per scene!");
            }
            GameAnalytics.Initialize();
            GA_Wrapper.SetBuild(Application.version);
            GA_Wrapper.Initialize(StaticStringsKey.GA_gameKey, StaticStringsKey.GA_secretKey);
            Debug.Log("[ToukaAnalyticsManager] GA: init :GA_gameKey=" + StaticStringsKey.GA_gameKey + "GA_secretKey=" + StaticStringsKey.GA_secretKey + " Application.version=" + Application.version);
        }
        /// 
        /// 初始化Tenjin
        /// 
        private void InitTenjin()
        {
#if IOS_CN
        if (!StaticOtherConfig.InitTenjinLater_Switch)      // 启动就初始化tenjin
        {
            InitTenjinInner();
        }
        else        // 延时初始化tenjin
        {
            if (ToukaUtils.GetPlayerPrefsIntByKey(StaticStringsPlayerPrefs.HasInitTenjinFirst, 0) == 1)
            {
                Debug.Log("首次初始化过tenjin了,之后都可以正常初始了");
                InitTenjinInner();
            }
            else
            {
                Debug.Log("需要延迟,启动处不能初始化tenjin");
            }
        }
#else
            InitTenjinInner();
#endif
        }
        /// 
        /// 实际调用初始化Tenjin
        /// 
        public void InitTenjinInner()
        {
#if !ANDROID_TW
            Debug.Log("[ToukaAnalyticsManager] init tenjin inner");
            BaseTenjin instance = Tenjin.getInstance(StaticStringsKey.TENJIN_KEY);
            // Sends install/open event to Tenjin
            instance.Connect();
#endif
        }
        #endregion
        #region Events
        /// 
        /// 打点事件 Tenjin / GA
        /// 
        ///  Tenjin / GA 
        ///  事件名称 
        ///  事件属性(可选) 
        public void LogEvent(ToukaLogType _logType, string _eventName, string _label = null)
        {
            Debug.Log("[ToukaAnalyticsManager] LogEvent, logType : " + _logType.ToString() + " , eventName " + _eventName + " label:" + _label);
#if UNITY_EDITOR
            return;
#endif
            if (string.IsNullOrEmpty(_eventName)) return;
            // ga
            if ((_logType & ToukaLogType.GA) > 0)
            {
                if (string.IsNullOrEmpty(_label))
                {
                    GameAnalytics.NewDesignEvent("event:" + _eventName);
                }
                else
                {
                    GameAnalytics.NewDesignEvent("event:" + _eventName + "_" + _label);
                }
            }
            // tenjin
            if ((_logType & ToukaLogType.Tenjin) > 0)
            {
                if (string.IsNullOrEmpty(_label))
                {
#if ANDROID_TW
                    TGAndroidAnalytics.Instance.onEvent(_eventName);
#else
                    Tenjin.getInstance(StaticStringsKey.TENJIN_KEY).SendEvent(_eventName);
#endif
                }
                else
                {
#if ANDROID_TW
                    TGAndroidAnalytics.Instance.onEvent(_eventName + _label);
#else
                    Tenjin.getInstance(StaticStringsKey.TENJIN_KEY).SendEvent(_eventName + _label);
#endif
                }
                Debug.Log("Touka LogEventWithLabel Tenjin: " + _eventName + " label:" + _label);
            }
        }
        /// 
        /// umeng打点 - 事件名字
        /// 
        /// 事件名字
        public void LogEventByUmeng(string _eventSort)
        {
#if !NO_SDK
            Debug.Log("Touka LogEventByUmeng _eventSort : " + _eventSort);
#if UNITY_EDITOR
            return;
#endif
            Umeng.Analytics.Event(_eventSort);
#endif
        }
        /// 
        /// umeng 打点 - 事件名字 + 一个事件属性(key:value)
        /// 
        /// 事件名字
        /// 属性key
        /// 属性value
        public void LogEventByUmeng(string _eventSort, string _key, string _value)
        {
            if (!string.IsNullOrEmpty(_eventSort) && !string.IsNullOrEmpty(_key) && !string.IsNullOrEmpty(_value))
            {
                LogEventByUmeng(_eventSort, new Dictionary() { { _key, _value } });
            }
        }
        /// 
        /// umeng 打点 - 事件名字 + 两个事件属性(key:value)
        /// 
        /// 事件名字
        ///  属性1-key 
        ///  属性1-value 
        ///  属性2-key  
        ///  属性2-value 
        public void LogEventByUmeng(string _eventSort, string _key01, string _value01, string _key02, string _value02)
        {
            if (!string.IsNullOrEmpty(_eventSort) && !string.IsNullOrEmpty(_key01) && !string.IsNullOrEmpty(_value01) && !string.IsNullOrEmpty(_key02) && !string.IsNullOrEmpty(_value02))
            {
                LogEventByUmeng(_eventSort, new Dictionary() { { _key01, _value01 }, { _key02, _value02 } });
            }
        }
        /// 
        /// umeng 打点 - 事件名字 + 事件属性字典
        /// 
        ///  事件名字 
        ///  事件属性字典 
        public void LogEventByUmeng(string _eventSort, Dictionary _eventDic = null)
        {
            string eventStr = "UMENG LOG _eventSort : " + _eventSort + " -> ";
            if (_eventDic != null)
            {
                foreach (var kvp in _eventDic)
                {
                    eventStr += string.Format(" (Key = {0}, Value = {1} ) , ", kvp.Key, kvp.Value);
                }
            }
            Debug.Log(eventStr);
#if !NO_SDK
#if UNITY_EDITOR
            return;
#endif
            if (!string.IsNullOrEmpty(_eventSort))
            {
                if (_eventDic != null && _eventDic.Count == 0)
                {
                    Umeng.Analytics.Event(_eventSort);
                }
                else if (_eventDic != null && _eventDic.Count > 0)
                {
                    Umeng.Analytics.Event(_eventSort, _eventDic);
                }
                else if (_eventDic == null)
                {
                    Umeng.Analytics.Event(_eventSort);
                }
            }
            else
            {
                Debug.LogError("UMENG Event Sort is Empty!");
            }
#endif
        }
        /// 
        /// Umeng 打点广告按钮展示
        /// 
        /// 
        public void LogEventByUmengAdShow(string _adShow)
        {
            if (!string.IsNullOrEmpty(_adShow))
            {
                LogEventByUmeng(StaticStringsEvent.Event_Sort_TKInner_ad_button_show, new System.Collections.Generic.Dictionary() { { StaticStringsEvent.Event_Type_TKInner_ad_position, _adShow } });
            }
        }
#endregion
    }
    public enum ToukaLogType
    {
        GA = 1,
        Tenjin = 1 << 6,
    }
}