#if UNITY_ANDROID
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Touka
{
    /// 
    /// TKG Native SDK Android platform interface call
    /// 
    public class TKGNativeInterfaceAndroid : TKGNativeInterface
    {
        private AndroidJavaObject jo;
        public TKGNativeInterfaceAndroid()
        {
            // java interface class
            using (AndroidJavaClass jc = new AndroidJavaClass("com.touka.tkg.TKGProxyJava"))
            {
                jo = jc.CallStatic("getInstance");
            }
        }
        private T SDKCall(string _method, params object[] _param)
        {
            try
            {
                return jo.Call(_method, _param);
            }
            catch (Exception e)
            {
                Debug.LogError(e);
            }
            return default(T);
        }
        private void SDKCall(string _method, params object[] _param)
        {
            try
            {
                jo.Call(_method, _param);
            }
            catch (Exception e)
            {
                Debug.LogError(e);
            }
        }
#region init
        /// 
        /// init
        /// 
        /// 
        public override void Init(Action _initCallback = null)
        {
            TKGDebugger.LogDebug("init ----- 00");
            base.Init(_initCallback);
            TKGDebugger.LogDebug("init ----- 01");
            SetBannerAdCallback(new AndroidBannerADTKGAdCallback());
            TKGDebugger.LogDebug("init ----- 01 ------- a");
            setInterstitalAdCallback(new AndroidInterADTKGAdCallback());
            TKGDebugger.LogDebug("init ----- 01 ------- b");
            SetRewardAdCallback(new AndroidRewardADTKGAdCallback());
            TKGDebugger.LogDebug("init ----- 01 ------- c");
            SetSDKCommonCallback(new AndroidTKGCommonCalllback());
            TKGDebugger.LogDebug("init ----- 01 ------- d");
            
            SDKCall("init", new AndroidProxyCallback());
            TKGDebugger.LogDebug("init ----- 02");
        }
#endregion
        /// 
        /// Get Channel
        /// 
        /// 
        public override string GetChannel()
        {
#if UNITY_ANDROID
            return SDKCall("getChannel");
#endif
            return "AndroidRoot";
        }
#region Ads
        public override void PurchasedRemoveAds()
        {
#if UNITY_ANDROID
            SDKCall("purchasedRemoveAds");
#endif
        }
        public override void SetUnitySDKVersion(string sdkVersion)
        {
#if UNITY_ANDROID
            SDKCall("setUnitySDKVersion","UnitySDK",sdkVersion);
#endif
        }
#region Ads Show
        /// 
        /// Show banner Ad
        /// 
        /// bannerAlign
        public override void showBannerAd(TKGBannerAlign  _pos)
        {
            int _posIndex = 2;
            if(_pos == TKGBannerAlign.BannerCenterTopAlign)
            {
                _posIndex = 1;
            }
            else if(_pos == TKGBannerAlign.BannerCenterBottomAlign)
            {
                _posIndex = 2;
            }
#if UNITY_ANDROID
            SDKCall("showBannerAd", _posIndex);
#endif
        }
        /// 
        /// Hide Banner Ad
        /// 
        public override void hideBannerAd()
        {
#if UNITY_ANDROID
            SDKCall("hideBannerAd");
#endif
        }
        public override void RemoveNativeAd()
        {
#if UNITY_ANDROID
            SDKCall("hideNative");
#endif
        }
        /// 
        /// Show Interstitial Ad
        /// 
        public override void showInterstitialAd()
        {
#if UNITY_ANDROID
            SDKCall("showInterstitialAd");
#endif
        }
        /// 
        /// Show Interstitial Ad
        /// 
        /// 
        public override void showInterstitialAd(string _adPos, IVADType _IvType = IVADType.IV1)
        {
#if UNITY_ANDROID
            SDKCall("showInterstitialAd", _adPos, (int)_IvType);
#endif
        }
        /// 
        /// Show Reward Ad
        /// 
        /// 
        /// 
        public override void showRewardAd(string _adPos, int _itemCount = -1)
        {
#if UNITY_ANDROID
            SDKCall("showRewardAd", _adPos, _itemCount);
#endif
        }
        /// 
        /// Show Reward Ad
        /// 
        /// 
        /// 
        /// 
        public override void showRewardAd(string _adPos, int _itemCount, Dictionary _extraEvent)
        {
#if UNITY_ANDROID
            SDKCall("showRewardAd", _adPos, _itemCount, _extraEvent);
#endif
        }
        /// 
        /// Show Video Ad
        /// 
        /// 
        /// 
        public override void showVideoAd(string _adPos, int _itemCount = -1)
        {
#if UNITY_ANDROID
            SDKCall("showVideoAd", _adPos, _itemCount);
#endif
        }
        public override void SetShowSDKToast(bool _useSDKToast)
        {
#if UNITY_ANDROID
            SDKCall("setShowSDKRewardTips", _useSDKToast);
#endif
        }
        public override void ShowNativeAd(RectTransform pRect, Camera pCam = null, string pAdPos = "")
        {
#if UNITY_ANDROID
            Vector3[] tWorldCorners = new Vector3[4];
            pRect.GetWorldCorners(tWorldCorners);
            Vector2 tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]);
            Vector2 tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]);
            float tWidth = Mathf.Abs(tBottomRight.x - tTopLeft.x);
            float tHeight = Mathf.Abs(tBottomRight.y - tTopLeft.y);
            // x , y , width , height
            // ((tTopLeft.x, Screen.height - tTopLeft.y, tWidth, tHeight)
            SDKCall("showNative", pAdPos, tTopLeft.x, Screen.height - tTopLeft.y, tWidth, tHeight, pAdPos);
#endif
        }
#endregion
#region Ads isready
        /// 
        /// banner isReady
        /// 
        /// 
        public override bool isBannerAdReady()
        {
#if UNITY_ANDROID
            bool isReady = SDKCall("isBannerAdReady");
            return isReady;
#else
            return false;
#endif
        }
        /// 
        /// Interstitial isReady
        /// 
        /// 
        public override bool isInterstitialAdReady()
        {
#if UNITY_ANDROID
            bool isReady = SDKCall("isInterstitialAdReady");
            return isReady;
#else
            return false;
#endif
        }
        /// 
        /// Reward isReady
        /// 
        /// 
        public override bool isRewardAdReady()
        {
#if UNITY_ANDROID
            bool isReady = SDKCall("isRewardAdReady");
            return isReady;
#else
            return false;
#endif
        }
        /// 
        /// FullScreen isReady
        /// 
        /// 
        public override bool isVideoAdReady()
        {
#if UNITY_ANDROID
            bool isReady = SDKCall("isVideoAdReady");
            return isReady;
#else
            return false;
#endif
        }
        public override bool IsReadyNativeAd()
        {
#if UNITY_ANDROID
            bool isReady = SDKCall("isNativeReady");
            return isReady;
#else
            return false;
#endif
        }
#endregion
#region Set ads callback
        /// 
        /// Set Banner Ad Callback
        /// 
        /// 
        public override void SetBannerAdCallback(AndroidBannerADTKGAdCallback _bannerCallback)
        {
#if UNITY_ANDROID
            SDKCall("setBannerAdCallback", _bannerCallback);
#endif
        }
        /// 
        /// Set Interstital Ad Callback
        /// 
        /// 
        public override void setInterstitalAdCallback(AndroidInterADTKGAdCallback _interCallback)
        {
#if UNITY_ANDROID
            SDKCall("setInterstitalAdCallback", _interCallback);
#endif
        }
        /// 
        /// Set reward Ad Callback
        /// 
        /// 
        public override void SetRewardAdCallback(AndroidRewardADTKGAdCallback _rewardCallback)
        {
#if UNITY_ANDROID
            SDKCall("setRewardAdCallback", _rewardCallback);
#endif
        }
        /// 
        /// Set video Ad Callback(full screen ad, reward ad with no reward callback)
        /// 
        /// 
        public override void setVideoAdCallback(AndroidInterADTKGAdCallback _videoCallback)
        {
#if UNITY_ANDROID
            SDKCall("setVideoAdCallback", _videoCallback);
#endif
        }
#endregion
#region load ads
        /// 
        /// load interstitial ad
        /// (retry 3 times, per time interval 10s)
        /// 
        public override void loadInterstitialAD()
        {
#if UNITY_ANDROID
            SDKCall("loadInterstitialAD");
#endif
        }
        /// 
        /// load reward ad
        /// (retry 3 times, per time interval 10s)
        /// 
        public override void loadRewardAD()
        {
#if UNITY_ANDROID
            SDKCall("loadRewardAD");
#endif
        }
        /// 
        /// load video ad
        /// (retry 3 times, per time interval 10s)
        /// 
        public override void loadVideoAD()
        {
#if UNITY_ANDROID
            SDKCall("loadVideoAD");
#endif
        }
#endregion
#endregion
#region Log Event
#region Normal
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        public override void onEvent(string _eventName)
        {
#if UNITY_ANDROID
            SDKCall("onEvent", _eventName);
#endif
        }
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        /// 
        /// 
        public override void onEvent(string _eventName, string _key01, string _value01)
        {
#if UNITY_ANDROID
            SDKCall("onEvent", _eventName, _key01, _value01);
#endif
        }
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public override void onEvent(string _eventName, string _key01, string _value01, string _key02, string _value02)
        {
#if UNITY_ANDROID
            SDKCall("onEvent", _eventName, _key01, _value01, _key02, _value02);
#endif
        }
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        public override void onEvent(string _eventName, Dictionary _keyValues)
        {
#if UNITY_ANDROID
            SDKCall("onEvent", _eventName, Analytics.ToJavaHashMap(_keyValues));
#endif
        }
#endregion
#region Level Event
        /// 
        /// Level Start
        /// 
        /// 
        public override void LevelStart(string _levelId)
        {
#if UNITY_ANDROID
            SDKCall("levelStart", _levelId);
#endif
        }
        /// 
        /// Level end
        /// 
        /// 
        /// 
        public override void LevelEnd(string _levelId, StageResult _stageResult)
        {
#if UNITY_ANDROID
            SDKCall("levelEnd", _levelId, (int)_stageResult);
#endif
        }
#endregion
#region Tracking Event
        /// 
        /// Log Tracking Event
        /// 
        /// 
        public override void LogTrackingEvent(TrackingEventType _eventType)
        {
#if UNITY_ANDROID
            SDKCall("LogTrackingEvent", (int)_eventType);
#endif
        }
#endregion
#endregion
#region Online Config
        /// 
        /// get config - int
        /// 
        /// 
        /// 
        public override int GetConfigInt(string _key, int _default)
        {
            TKGDebugger.LogDebug("int _key : " + _key + " , _default : " + _default);
            int newValue = SDKCall("getConfigInt", _key, _default);
            return newValue;
        }
        /// 
        /// get config - string
        /// 
        /// 
        /// 
        public override string GetConfigString(string _key, string _default)
        {
            TKGDebugger.LogDebug("string _key : " + _key + " , _default : " + _default);
            string newValue = SDKCall("getConfigString", _key, _default);
            return newValue;
        }
        /// 
        /// get config - bool
        /// 
        /// 
        /// 
        public override bool GetConfigBool(string _key, bool _default)
        {
            TKGDebugger.LogDebug("bool _key : " + _key + " , _default : " + _default);
            bool newValue = SDKCall("getConfigBool", _key, _default);
            return newValue;
        }
#endregion
#region Others (Common)
        /// 
        /// review
        /// 
        public override void Review()
        {
            SDKCall("review");
        }
        /// 
        /// open Privacy
        /// 
        public override void OpenPrivacyURL()
        {
            SDKCall("openPrivacy");
        }
        /// 
        /// open agreement
        /// 
        public override void OpenUserTermURL()
        {
            SDKCall("openAgreement");
        }
        /// 
        /// open policy pop
        /// 
        public override void OpenPolicyPop()
        {
            SDKCall("openPrivacyDialog");
        }
        /// 
        /// More Games
        /// 
        public override void OpenMoreGame()
        {
            SDKCall("moreGames");
        }
        /// 
        /// Set Log Enable
        /// 
        /// 
        public override void SetLogEnable(bool _enable)
        {
            SDKCall("setEnableLog", _enable);
        }
#endregion
#region Others (Uncommon)
        /// 
        /// shake(no repeat)
        /// 
        ///  shake time 
        public override void shake(int _shakeType, float _intensity = 1)
        {
            long tShakeMS = _shakeType * _shakeType * 20 + (int)(_intensity * (_shakeType + 1) * 10);
            SDKCall("shake", tShakeMS);
        }
        /// 
        /// shake(can repeat)
        /// 
        ///  repeat times : -1 
        ///  wait time,shake time(100,1000,100,111)
        //public override void shake(int _repeatTimes, params int[] _shakeTime)
        //{
        //    SDKCall("shake", _repeatTimes, _shakeTime);
        //}
        /// 
        /// cancel shake
        /// 
        public override void cancelShake()
        {
            SDKCall("cancelShake");
        }
        /// 
        /// Show Tips
        /// Pop-up prompt (the one with black transparent background) unified style, Chinese, Japanese, Korean and English, support multi-language, multi-language text
        ///
        /// game judges different languages by itself and passes different strings
        /// 
        ///  title 
        ///  content 
        public override void dialogTips(string _titleStr, string _contentStr = "")
        {
            SDKCall("dialogTips", _titleStr);
        }
        /// 
        /// Open ULR by Browser
        /// 
        /// 
        public override void openUrlBrowser(string _url)
        {
            SDKCall("openUrlBrowser", _url);
        }
        /// 
        /// Open ULR By WEB POP
        /// 
        /// 
        public override void openWebUrl(string _url)
        {
            SDKCall("openWebUrl", _url);
        }
        /// 
        /// show Toast
        /// 
        /// 
        public override void toast(string _content)
        {
            SDKCall("dialogTips",_content);
        }
        /// 
        /// push message
        /// 
        public override void pushMsg()
        {
            SDKCall("pushMsg");
        }
        // 
        /// share txt
        /// 
        /// 
        public override void ShareTxt(string _shareTxt)
        {
            SDKCall("localShareTxt", _shareTxt);
        }
        public override void RegistAPNS()
        {
            
        }
        public override void RegistNotification(string notiId, string body, string fireDate, int badge, string title, string subTitle)
        {
           SDKCall("registNotification",notiId,body,fireDate,badge,title,subTitle);
        }
        public override void RemoveNotification(string notiId)
        {
            SDKCall("removeNotification", notiId);
        }
        public override void RemoveAllNotifications()
        {
            SDKCall("removeAllNotifications");
        }
#endregion
#region common callback
        public override void SetSDKCommonCallback(AndroidTKGCommonCalllback _commonCallback)
        {
            SDKCall("setTkgCallback", _commonCallback);
        }
        public override void SetUserSourceCallback(AndroidTKGUserSourceCalllback _userSourceCallback)
        {
            SDKCall("getUserSource", _userSourceCallback);
        }
        public override void SetUserSourceCallback(AndroidTKGUserSourceCalllbackWithCampaignName _userSourceCallback)
        {
            SDKCall("getUserSource", _userSourceCallback);
        }
        public override void SetFunctionSwitchCalllback(List _functionKeys, AndroidFunctionSwitchCalllback _functionSwitchCalllback)
        {
            string keys="";
            for (int i = 0; i < _functionKeys.Count; i++)
            {
                FunctionType enumType = _functionKeys[i];
                string enumTypeString = enumType.ToString();
                if(keys!=""){
                    keys=keys+"@";
                }
                 keys=keys+enumTypeString;
            }
            SDKCall("setGameSwitchListener", keys,_functionSwitchCalllback);
        }
#endregion
    }
}
#endif