using UnityEngine;
using System.Collections;
#if !UNITY_STANDALONE_WIN
using com.xsj.Crasheye.U3D;
#endif
using System.Runtime.InteropServices;
using System;
public class CrasheyeForIOS : MonoBehaviour
{
#if UNITY_IOS && !UNITY_STANDALONE_WIN
    [DllImport("__Internal")]
	private static extern void crasheyeInit(string appkey);
	
	[DllImport("__Internal")]
	private static extern void crasheyeInitWithChannel(string appkey, string channel);
	
	[DllImport("__Internal")]
	private static extern void crasheyeAddExtraData(string key, string value);
	
	[DllImport("__Internal")]
	private static extern void crasheyeRemoveExtraData(string key);
	
	[DllImport("__Internal")]
	private static extern void crasheyeClearExtraData();
	
	[DllImport("__Internal")]
	private static extern void crasheyeLeaveBreadcrumb(string breadcrumb);
	
	[DllImport("__Internal")]
	private static extern void crasheyeSetUserid(string userid);
	[DllImport("__Internal")]
	private static extern void crasheyeSetAppVersion(string version);
	[DllImport("__Internal")]
	private static extern void crasheyeSetFlushOnlyOverWiFi (int enabled);
	[DllImport("__Internal")]
	private static extern void crasheyeAddLog(string log);
    [DllImport("__Internal")]
	private static extern void crasheyeSetURL(string url);
	[DllImport("__Internal")]
	private static extern void crasheyeRemoveLog();
	[DllImport("__Internal")]
	private static extern void crasheyeSetBeta (int enabled);
    /// 
    /// 最大保存log日志数量
    /// 
    private static int MAX_LOG_COUNT = 300;
    private static Queue m_saveLog = new Queue();
                
    /// 
    /// iOS系统的初始
    /// 
    /// 
    /// 
    public static void Init(string appKeyForIOS, string channIdForIOS)
    {
        if (string.IsNullOrEmpty(appKeyForIOS))
        {
            Debug.LogError("app key is null or empty!");
            return;
        }
        crasheyeInitWithChannel(appKeyForIOS, channIdForIOS);
        Crasheye.crasheyeLib.InitCrasheyeLib();        
        Crasheye.crasheyeLib.SetExceptionCallback();
    }
    
    /// 
    /// 设置是否打印调试日志
    /// 
    /// 默认为False为不打印日志;True为打印日志
    public static void SetDebugLog(bool debugLog)
    {
        // 暂时未实现
    }
    /// 
    /// 设置版本号信息
    /// 
    /// 
    public static void SetAppVersion(string appVersion)
    {
		if (string.IsNullOrEmpty(appVersion))
		{
			Debug.LogError("appVersion is null or empty!");
			return;
		}
		try
		{
			crasheyeSetAppVersion(appVersion);
		}
		catch (Exception ex)
		{
			Debug.LogError(ex.Message);
		}
    }
    public static void SetUserIdentifier(string userIdentifier)
    {
        if (string.IsNullOrEmpty(userIdentifier))
        {
            Debug.LogError("user identifier is null or empty!");
            return;
        }
        try
        {
            crasheyeSetUserid(userIdentifier);
        }
        catch (Exception ex)
        {
            Debug.LogError(ex.Message);
        }
    }
    private static int m_lines = -1;
    ///  指定获取应用程序log日志的行数
    /// 
    /// 设置获取行号
    public static void SetLogging(int lines)
    {
        if (lines < 0)
        {
            return;
        }
        if (lines > MAX_LOG_COUNT)
        {
            m_lines = MAX_LOG_COUNT;
        }
        else
        {
            m_lines = lines;
        }
    }
    /// 
    /// 返回设置log行数
    /// 
    /// 
    public static int GetLoggingLines()
    {
        return m_lines;
    }
    private static string m_filter = "";
    ///  获取应用程序log日志关键字过滤
    /// 
    /// 设置获取关键字
    public static void SetLogging(string filter)
    {
        if (string.IsNullOrEmpty(filter))
        {
            return;
        }
        m_filter = filter;
    }
    /// 
    /// 返回log过虑
    /// 
    /// 
    public static string GetLoggingFilter()
    {
        return m_filter;
    }
    ///  获取应用程序log日志(过滤条件:关键字过滤+行数)
    /// 
    /// 设置获取行数
    /// 设置获取关键字
    public static void SetLogging(int lines, string filter)
    {
        if (lines < 0 || string.IsNullOrEmpty(filter))
        {
            return;
        }
        SetLogging(lines);
        SetLogging(filter);
    }
    public static void SetFlushOnlyOverWiFi(bool enabled)
    {
		if(enabled)
			crasheyeSetFlushOnlyOverWiFi (1);
		else
			crasheyeSetFlushOnlyOverWiFi (0);
    }
	public static void SetBeta(bool enabled)
	{
		if(enabled)
			crasheyeSetBeta (1);
		else
			crasheyeSetBeta (0);
	}
    /// 
    /// 添加自定义数据
    /// 
    /// Key.
    /// Value.
    public static void AddExtraData(string key, string value)
    {
        if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
        {
            Debug.LogError("add extra data err: key or value IsNullOrEmpty!");
            return;
        }
        crasheyeAddExtraData(key, value);
    }
    /// 
    /// 获取自定义数据
    /// 
    /// Key
    public static string GetExtraData(string key)
    {
        // 暂时未实现
        return "";
    }
    /// 
    /// 移除自定义数据
    /// 
    /// Key.
    public static void RemoveExtraData(string key)
    {
        if (string.IsNullOrEmpty(key))
        {
            return;
        }
        crasheyeRemoveExtraData(key);
    }
    /// 
    /// 添除数据
    /// 
    public static void ClearExtraData()
    {
        crasheyeClearExtraData();
    }
    /// 
    /// 打点数据
    /// 
    /// Breadcrumb.
    public static void LeaveBreadcrumb(string breadcrumb)
    {
        if (string.IsNullOrEmpty(breadcrumb))
        {
            return;
        }
        crasheyeLeaveBreadcrumb(breadcrumb);
    }
    ///  获取SDK版本信息
    /// 
    /// 返回sdk版本号
    public static string GetAppVersion()
    {
        // 此功能暂未实现
        string sdkVersion = "NA";
        return sdkVersion;
    }
    
    public static void SaveLogger(string logMsg)
    {
        if (CrasheyeForIOS.GetLoggingLines() <= 0)
        {
            return;
        }
        if (logMsg.IndexOf(CrasheyeForIOS.GetLoggingFilter()) < 0)
        {
            return;
        }
        if (m_saveLog.Count >= CrasheyeForIOS.GetLoggingLines() && m_saveLog.Count > 0)
        {
            m_saveLog.Dequeue();
        }
        m_saveLog.Enqueue(logMsg);
    }
    public static string GetLogger()
    {
        string allLogger = "";
        foreach (string strTemp in m_saveLog)
        {
			allLogger += strTemp + "\n";
        }
        return allLogger;
    }
	public static void addLog(string log)
	{
		crasheyeAddLog(log);
	}
	public static void removeLog()
	{
		crasheyeRemoveLog();
	}
     ///  SetURL
    /// 
    /// 
    public static void SetURL(string url)
    {
        if (String.IsNullOrEmpty(url))
        {
            Debug.LogError("set url is null or empty!");
            return;
        }
        crasheyeSetURL(url);
    }
#endif
}