
//  Created by ZhuCong on 1/1/14.
//  Copyright 2014 Umeng.com . All rights reserved.
//
//#undef UNITY_EDITOR

using UnityEngine;
using System;
using System.Runtime.InteropServices;
using System.Collections;
using System.Collections.Generic;
using System.Text;





namespace Umeng
{

    public partial class Analytics
    {



#if UNITY_ANDROID
		static bool hasInit = false;
        protected static AndroidJavaClass UMConfigure = new AndroidJavaClass("com.umeng.commonsdk.UMConfigure");
        //protected static  AndroidJavaClass Agent = new AndroidJavaClass("com.umeng.analytics.game.UMGameAgent");
        protected static  AndroidJavaClass Agent = new AndroidJavaClass("com.umeng.analytics.MobclickAgent");
        protected static  AndroidJavaObject Context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");

#endif

        private const string Version = "3.2";
	    public enum DeviceType
	    {
		    Phone = 0,
		    Box = 1
	    }


		
		


		




	
        //iOS Android Universal API



        // 
        /// <summary>
        /// 开始友盟统计 默认发送策略为启动时发送
        /// </summary>
        /// <param name="appKey">友盟appKey</param>
        /// <param name="channelId">渠道名称</param>
        ///
        ///
        public static void StartWithAppKeyAndChannelId(string appKey, string channelId)
        {
#if UNITY_EDITOR
            //Debug.LogWarning("友盟统计在iOS/Android 真机上才会向友盟后台服务器发送事件 请在真机上测试");

#elif UNITY_IPHONE

       
	        UMCommonSetAppkeyAndChannel(appKey,channelId);
            //iOS 必须设置 android 无此API
	        _SetScenarioType();


#elif UNITY_ANDROID




	        UMCommonSetAppkeyAndChannel(appKey,channelId);
            //2次init 第一次UMConfigureinit在UMCommonSetAppkeyAndChannel方法内,第二次在这里UMGameAgent.init()
            Agent.CallStatic("init",Context);


			if(!hasInit)
			{
				//Debug.LogWarning("onResume");
				onResume();

				AddUmengAndroidLifeCycleCallBack();
				hasInit = true;
			}


#endif
        }

        private static void UMCommonSetAppkeyAndChannel(string appkey, string channelId,DeviceType deviceType=DeviceType.Phone,string pushSecret=null)
	    {

#if UNITY_EDITOR


#elif UNITY_IPHONE


			_SetWrapperTypeAndVersion("Unity", Version);
			_UMCommonSetAppkeyAndChannel(appkey, channelId);

#elif UNITY_ANDROID
           
		    UMConfigure.CallStatic("setWraperType","Unity",Version);
		    UMConfigure.CallStatic("init",Context,appkey,channelId,(int)deviceType,pushSecret);
#endif
        }


        /// <summary>
        /// 设置是否打印sdk的信息,默认不开启
        /// </summary>
        /// <param name="value">设置为true,Umeng SDK 会输出日志信息,记得release产品时要设置回false.</param>
        /// 
        public static void SetLogEnabled(bool value)
        {
#if UNITY_EDITOR
        //Debug.Log("SetLogEnabled");  
#elif UNITY_IPHONE
        _SetLogEnabled(value);
#elif UNITY_ANDROID
            

	        UMConfigure.CallStatic("setLogEnabled",value);
#endif
        }

        //使用前，请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID，然后在工程中传入相应的事件ID
        //eventId、attributes中key和value都不能使用空格和特殊字符，且长度不能超过255个字符（否则将截取前255个字符）
        //id， ts， du是保留字段，不能作为eventId及key的名称


        /// <summary>
        /// 基本事件
        /// </summary>
        /// <param name="eventId">友盟后台设定的事件Id</param>
        public static void Event(string eventId)
        {
#if UNITY_EDITOR
        //Debug.Log("Event");  
#elif UNITY_IPHONE
        _Event(eventId);
#elif UNITY_ANDROID
            Agent.CallStatic("onEvent", Context, eventId);
#endif
        }
        //不同的标签会分别进行统计，方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签.


        /// <summary>
        /// 基本事件
        /// </summary>
        /// <param name="eventId">友盟后台设定的事件Id</param>
        /// <param name="label">分类标签</param>

        public static void Event(string eventId, string label)
        {
#if UNITY_EDITOR 
        //Debug.Log("Event");  
#elif UNITY_IPHONE
        _EventWithLabel(eventId, label);
#elif UNITY_ANDROID
            Agent.CallStatic("onEvent", Context, eventId, label);
#endif
        }




        /// <summary>
        /// 属性事件
        /// </summary>
        /// <param name="eventId">友盟后台设定的事件Id</param>
        /// <param name="attributes"> 属性中的Key-Vaule Pair不能超过10个</param>
        public static void Event(string eventId, Dictionary<string, string> attributes)
        {
#if UNITY_EDITOR
        	//Debug.Log("Event");        
#elif UNITY_IPHONE
			_EventWithAttributes(eventId, DictionaryToJson(attributes));
#elif UNITY_ANDROID
            Agent.CallStatic("onEvent", Context, eventId, ToJavaHashMap(attributes));
#endif

        }


	    /// <summary>
	    /// 页面时长统计,记录某个页面被打开多长时间
	    /// </summary>
	    /// <param name="pageName">被统计view名称</param>
	    /// 
        public static void PageBegin(string pageName)
        {
#if UNITY_EDITOR
		    //Debug.Log("PageBegin");
#elif UNITY_IPHONE
            _BeginLogPageView(pageName);
#elif UNITY_ANDROID
            Agent.CallStatic("onPageStart", pageName);
#endif
        }

        /// <summary>
        /// 页面时长统计,记录某个页面被打开多长时间
        /// 与PageBegin配对使用
        /// </summary>
        /// <param name="pageName">被统计view名称</param>
        /// 
        public static void PageEnd(string pageName)
        {
#if UNITY_EDITOR
		    //Debug.Log("PageEnd"); 
#elif UNITY_IPHONE
            _EndLogPageView(pageName);
#elif UNITY_ANDROID
            Agent.CallStatic("onPageEnd", pageName);
#endif
        }

		/// <summary>
		/// 自定义事件 — 计算事件数
		/// </summary>
		public static void Event(string eventId, Dictionary<string, string> attributes, int value)
		{
			try
			{
				if (attributes == null)
					attributes = new System.Collections.Generic.Dictionary<string, string>();
				if (attributes.ContainsKey("__ct__"))
				{
					attributes["__ct__"] = value.ToString();
					Event(eventId, attributes);
				}
				else
				{
					attributes.Add("__ct__", value.ToString());
					Event(eventId, attributes);
					attributes.Remove("__ct__");
				}

			}
			catch (Exception)
			{
			}
		}








		public static string GetTestDeviceInfo()
		{
#if UNITY_EDITOR
			//Unity Editor 模式下 返回null 请在iOS/Anroid真机上测试
			//Debug.Log("GetDeviceInfo return null");
			return null;
#elif UNITY_IPHONE
			return _GetDeviceID();
#elif UNITY_ANDROID

            Debug.Log("GetDeviceInfo return ");
            return UMConfigure.CallStatic<String[]>("getTestDeviceInfo", Context)[0]; 

#else
			return null;

#endif

        }

		//设置是否对日志信息进行加密, 默认false(不加密).
		//value 设置为true, SDK会将日志信息做加密处理
		
		public static void  SetLogEncryptEnabled(bool value)
		{
			#if UNITY_EDITOR
			//Debug.Log("SetLogEncryptEnabled");
			#elif UNITY_IPHONE
			_SetEncryptEnabled(value);
			#elif UNITY_ANDROID
			UMConfigure.CallStatic("setEncryptEnabled",value);
			#endif


		}
		
		
		public static void SetLatency(int value)
		{
			#if UNITY_EDITOR
			//Debug.Log("SetLatency");
			#elif UNITY_IPHONE
			//_SetLatency(value);
			#elif UNITY_ANDROID
			Agent.CallStatic("setLatencyWindow", (long)value);
			#endif

		}
		




        //Android Only

#if  UNITY_ANDROID



        //设置Session时长
        public static void SetContinueSessionMillis(long milliseconds)
        {
#if UNITY_EDITOR
            //Debug.Log("setContinueSessionMillis"); 
#else
            Agent.CallStatic("setSessionContinueMillis", milliseconds);
#endif
        }



		/*
			android6.0中采集mac方式变更，新增接口 public static void setCheckDevice(boolean enable) 该接口默认参数是true，即采集mac地址，
			但如果开发者需要在googleplay发布，考虑到审核风险，可以调用该接口，参数设置为 false 就不会采集mac地址。

		*/
		public static void SetCheckDevice(bool value)
		{
#if UNITY_EDITOR
		
#else
			Agent.CallStatic("setCheckDevice", value);
#endif

		}
		



		
		

		

#endif



        //iOS Only
#if UNITY_IPHONE



    /// <summary>
    /// 页面时长统计,记录某个view被打开多长时间,与调用PageBegin,PageEnd计时等价
    /// </summary>
    /// <param name="pageName">被统计view名称</param>
    /// <param name="seconds">时长单位为秒</param>
    /// 
    public static void LogPageViewWithSeconds(string pageName, int seconds)
    {
#if UNITY_EDITOR
        //Debug.Log("LogPageViewWithSeconds"); 
#else
        _LogPageViewWithSeconds(pageName, seconds);
#endif
    }



    /// <summary>
    /// 判断设备是否越狱，判断方法根据 apt和Cydia.app的path来判断
    /// </summary>
    /// <returns>是否越狱</returns>
    public static bool IsJailBroken()
    {
#if UNITY_EDITOR
        //always return false in UNITY_EDITOR mode
        //Debug.Log("IsJailBroken always return false in UNITY_EDITOR mode");
        return false;
#else
        return _IsJailBroken();
#endif
    }

    /// <summary>
    /// 判断你的App是否被破解
    /// </summary>
    /// <returns>是否破解</returns>
    public static bool IsPirated()
    {
#if UNITY_EDITOR
        //always return false in UNITY_EDITOR mode
        //Debug.Log("IsPirated always return false in UNITY_EDITOR mode");
        return false;
#else
        return _IsPirated();
#endif
    }







#endif



		





        #region Wrapper


	    private static void AddUmengAndroidLifeCycleCallBack()
        {
            GameObject go = new GameObject();
            go.AddComponent<UmengAndroidLifeCycleCallBack>();
            go.name = "UmengManager";
        }

#if UNITY_ANDROID

        public static void onResume()
        {
#if UNITY_EDITOR

#else
            Agent.CallStatic("onResume", Context);
#endif
        }



        public  static void onPause()
        {
#if UNITY_EDITOR

#else
            Agent.CallStatic("onPause", Context);
#endif
        }

	    public static void onKillProcess()
	    {
#if UNITY_EDITOR

#else
		    Agent.CallStatic("onKillProcess", Context);

#endif
	    }

	  







#endif


#if UNITY_IPHONE && !UNITY_EDITOR



     


        static string DictionaryToJson(Dictionary<string, string> dict)
        {

            var builder = new StringBuilder("{");
            foreach (KeyValuePair<string, string> kv in dict)
            {
                builder.AppendFormat("\"{0}\":\"{1}\",", kv.Key, kv.Value);
            }
            builder[builder.Length - 1] = '}';
            return builder.ToString();


        }





	    [DllImport("__Internal")]
	    private static extern void _SetWrapperTypeAndVersion(string wrapperType,string wrapperVersion);
		    
		[DllImport("__Internal")]
		private static extern void _SetLogEnabled(bool value);
	    
	    [DllImport("__Internal")]
	    private static extern void _SetScenarioType();
	    
	    [DllImport("__Internal")]
	    private static extern void _UMCommonSetAppkeyAndChannel(string appkey, string channelId);









    [DllImport("__Internal")]
    private static extern void _Event(string eventId);



    [DllImport("__Internal")]
    private static extern void _EventWithLabel(string eventId, string label);



    [DllImport("__Internal")]
    private static extern void _EventWithAttributes(string eventId, string jsonstring);





    [DllImport("__Internal")]
    private static extern void _LogPageViewWithSeconds(string pageName, int seconds);

    [DllImport("__Internal")]
    private static extern void _BeginLogPageView(string pageName);

    [DllImport("__Internal")]
    private static extern void _EndLogPageView(string pageName);

    [DllImport("__Internal")]
    private static extern bool _IsJailBroken();
	
    [DllImport("__Internal")]
    private static extern bool _IsPirated();
	

	[DllImport("__Internal")]
	private static extern string _GetDeviceID();


		
	[DllImport("__Internal")]
	private static extern  void _SetEncryptEnabled(bool value);
		


				
#endif
        #endregion
    }
}
