using System;
using System.Collections.Generic;
using UnityEngine;
namespace Touka
{
    /// 
    /// TKG Native SDK interface call
    /// 
    public abstract class TKGNativeInterface
    {
        private static TKGNativeInterface _instance;
        private string UnitySDKVersion = "3.1.3";
        public static TKGNativeInterface Instance
        {
            get
            {
                if (_instance == null)
                {
#if UNITY_EDITOR || UNITY_STANDLONE
                    _instance = new TKGNativeInterfaceDefault();
#elif UNITY_ANDROID
                _instance = new TKGNativeInterfaceAndroid();
#elif UNITY_IOS
                _instance = new TKGNativeInterfaceIOS();
#endif
                }
                return _instance;
            }
        }
        /// 
        /// init
        /// 
        public virtual void Init(Action _initCallback = null)
        {
            TKGSDKCallback.SetInitCallback(_initCallback);
            SetUnitySDKVersion(UnitySDKVersion);
        }
        /// 
        /// Set game focus
        /// 
        /// 
        public virtual void SetGameFocusListener(Action _gameFocusAction)
        {
            TKGSDKCallback.SetGameFocusCallback(_gameFocusAction);
        }
        public virtual void SetRewardClickListener(Action _rewardClickAction)
        {
            TKGSDKCallback.SetRewardClickCallback(_rewardClickAction);
        }
        /// 
        /// Get Channel
        /// 
        /// 
        public abstract string GetChannel();
        #region Ads
        public abstract void PurchasedRemoveAds();
        public abstract void SetUnitySDKVersion(string sdkVersion);
        #region Ads Show
        public abstract void RemoveNativeAd();
        public abstract bool IsReadyNativeAd();
        public abstract void ShowNativeAd(RectTransform pRect, Camera pCam = null, string pAdPos = "");
        /// 
        /// Show banner Ad
        /// 
        /// bannerAlign
        public abstract void showBannerAd(TKGBannerAlign _pos);
        /// 
        /// Hide Banner Ad
        /// 
        public abstract void hideBannerAd();
        /// 
        /// Show Interstitial Ad
        ///
        /// auto log event : iv_ad_show
        /// 
        public abstract void showInterstitialAd();
        /// 
        /// Show Interstitial Ad
        ///
        /// auto log event : iv_ad_show & _adPos(eg.stage_end)
        /// 
        /// 
        public abstract void showInterstitialAd(string _adPos, IVADType _IvType = IVADType.IV1);
        /// 
        /// Show Reward Ad
        /// 
        /// 
        /// 
        public abstract void showRewardAd(string _adPos, int _itemCount = -1);
        public abstract void SetShowSDKToast(bool _useSDKToast);
        /// 
        /// Show Reward Ad
        /// 
        /// 
        /// 
        /// 
        public abstract void showRewardAd(string _adPos, int _itemCount, Dictionary _extraEvent);
        /// 
        /// Show Video Ad
        /// 
        /// 
        /// 
        public abstract void showVideoAd(string _adPos, int _itemCount = -1);
        #endregion
        #region Ads isready
        /// 
        /// banner isReady
        /// 
        /// 
        public abstract bool isBannerAdReady();
        /// 
        /// Interstitial isReady
        /// 
        /// 
        public abstract bool isInterstitialAdReady();
        /// 
        /// Reward isReady
        /// 
        /// 
        public abstract bool isRewardAdReady();
        /// 
        /// FullScreen isReady
        /// 
        /// 
        public abstract bool isVideoAdReady();
        #endregion
        #region Set Ads callback
        /// 
        /// Set Banner Ad Callback
        /// 
        /// 
        public abstract void SetBannerAdCallback(AndroidBannerADTKGAdCallback _bannerCallback);
        /// 
        /// Set Interstital Ad Callback
        /// 
        /// 
        public abstract void setInterstitalAdCallback(AndroidInterADTKGAdCallback _interCallback);
        /// 
        /// Set reward Ad Callback
        /// 
        /// 
        public abstract void SetRewardAdCallback(AndroidRewardADTKGAdCallback _rewardCallback);
        /// 
        /// Set video Ad Callback(full screen ad, reward ad with no reward callback)
        /// 
        /// 
        public abstract void setVideoAdCallback(AndroidInterADTKGAdCallback _videoCallback);
        #endregion
        #region load ads
        /// 
        /// load interstitial ad
        /// (retry 3 times, per time interval 10s)
        /// 
        public abstract void loadInterstitialAD();
        /// 
        /// load reward ad
        /// (retry 3 times, per time interval 10s)
        /// 
        public abstract void loadRewardAD();
        /// 
        /// load video ad
        /// (retry 3 times, per time interval 10s)
        /// 
        public abstract void loadVideoAD();
        #endregion
        #endregion
        #region Log Event
        #region Normal
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        public abstract void onEvent(string _eventName);
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        /// 
        /// 
        public abstract void onEvent(string _eventName, string _key01, string _value01);
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public abstract void onEvent(string _eventName, string _key01, string _value01, string _key02, string _value02);
        /// 
        /// onEvent
        /// 
        /// 
        /// 
        public abstract void onEvent(string _eventName, Dictionary _keyValues);
        #endregion
        #region Level Event
        /// 
        /// Level Start
        /// 
        /// 
        public abstract void LevelStart(string _levelId);
        /// 
        /// Level end
        /// 
        /// 
        /// 
        public abstract void LevelEnd(string _levelId, StageResult _stageResult);
        #endregion
        #region Tracking Event
        /// 
        /// Log Tracking Event
        /// 
        /// 
        public abstract void LogTrackingEvent(TrackingEventType _eventType);
        #endregion
        #endregion
        #region Online Config
        /// 
        /// get config - int
        /// 
        /// 
        /// 
        public abstract int GetConfigInt(string _key, int _default);
        /// 
        /// get config - string
        /// 
        /// 
        /// 
        /// 
        public abstract string GetConfigString(string _key, string _default);
        /// 
        /// get config - bool
        /// 
        /// 
        /// 
        /// 
        public abstract bool GetConfigBool(string _key, bool _default);
        #endregion
        #region Others (Common)
        /// 
        /// review
        /// 
        public abstract void Review();
        /// 
        /// open Privacy url
        /// 
        public abstract void OpenPrivacyURL();
        /// 
        /// open user term url
        /// 
        public abstract void OpenUserTermURL();
        /// 
        /// open policy pop
        /// 
        public abstract void OpenPolicyPop();
        /// 
        /// More Games
        /// 
        public abstract void OpenMoreGame();
        /// 
        /// if is debug mode
        /// 
        public abstract bool IsDebugMode();
        /// 
        /// get user name and user id card
        /// 
        public abstract string GetUserNameAndUserIDCard();
        /// 
        /// set segment type to sdk
        /// 
        /// segment type
        public abstract void SetSegment(SegmentType type);
        /// 
        /// get a iap product list for sdk config file
        /// 
        public abstract Dictionary GetIAPProductList();
        #endregion
        #region Others (Uncommon)
        /// 
        /// shake(no repeat)
        /// 
        ///  shake time 
        public abstract void shake(int _shakeType, float _intensity = 1);
        /// 
        /// shake(can repeat)
        /// 
        ///  repeat times : -1 
        ///  wait time,shake time(100,1000,100,111)
        //public abstract void shake(int _repeatTimes, params int[] _shakeTime);
        /// 
        /// cancel shake
        /// 
        public abstract void 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 abstract void dialogTips(string _titleStr, string _contentStr);
        /// 
        /// Open ULR by Browser
        /// 
        /// 
        public abstract void openUrlBrowser(string _url);
        /// 
        /// Open ULR By WEB POP
        /// 
        /// 
        public abstract void openWebUrl(string _url);
        /// 
        /// show Toast
        /// 
        /// 
        public abstract void toast(string _content);
        /// 
        /// push message
        /// 
        public abstract void pushMsg();
        /// 
        /// set log enable
        /// 
        /// 
        public abstract void SetLogEnable(bool _enable);
        /// 
        /// share txt
        /// 
        /// 
        public abstract void ShareTxt(string _shareTxt);
        /// 
        /// regist APNS
        /// 
        public abstract void RegistAPNS();
        /// 
        /// show picture cross
        /// 
        public abstract bool showPictureCross();
        /// 
        /// remove picture cross
        /// 
        public abstract void removePictureCross();
        /// 
        /// show more game icon
        /// 
        public abstract bool showMoreGameIcon();
        /// 
        /// remove more game icon
        /// 
        public abstract void removeMoreGameIcon();
        /// 
        /// shake
        /// 
        /// notification identifier
        /// The body of the notification.
        /// notify after the time interval. format: yyyy-MM-dd HH:mm:ss 
        /// The application badge number.
        /// The title of the notification.
        /// The subtitle of the notification.
        public abstract void RegistNotification(string notiId, string body, string fireDate, int badge, string title, string subTitle);
        /// 
        /// remove all notification
        /// 
        public abstract void RemoveAllNotifications();
        /// 
        /// remove notification by notification identifier
        /// 
        /// notification identifier
        public abstract void RemoveNotification(string notiId);
        #endregion
        #region other callback
        /// 
        /// set tkg common callback
        /// 
        public abstract void SetSDKCommonCallback(AndroidTKGCommonCalllback _commonCallback);
        /// 
        /// set user source callback
        /// 
        public abstract void SetUserSourceCallback(AndroidTKGUserSourceCalllback _userSourceCallback);
        /// 
        /// set user source callback with CampaignName
        /// 
        public abstract void SetUserSourceCallback(AndroidTKGUserSourceCalllbackWithCampaignName _userSourceCallback);
        /// 
        /// Set Function Switch Calllback
        /// 
        public abstract void SetFunctionSwitchCalllback(List _functionKeys ,AndroidFunctionSwitchCalllback _functionSwitchCalllback);
        #endregion
        #region 数据中台
        public abstract void LogPurchasePrice(string price,string currency);
        public abstract void LogRobuxCashOut();
        public abstract void LogNoviceGuideFinish();
        #endregion
        #region GooglePlay评论引导
        /// 
        /// Pop up GooglePlay Rate guid
        /// 
        public abstract bool GuidGpComment();
        #endregion
        #region 用户登录
        /// 
        /// User Login
        /// 
        public abstract void Login(LoginType loginType, Action _loginResultCallback = null);
        /// 
        /// Logout
        /// 
        public abstract void Logout(Action _logoutCallback = null);
        public abstract List AvailableLoginChannelList();
        public abstract void DeleteAccount(Action _deleteAccountCallback = null);
        
        public abstract void BindAccount(LoginType type,BindType isForce, string userId,
            Action
                bindAccountCallback);
        public abstract void AutoLogin(
            Action loginResultCallback);
        public abstract LoginType GetAccountType();
        public abstract bool IsCanAutoLogin();
        
        #endregion
        #region IAP Event
        /// 
        /// Log IAP button show
        /// 
        /// Product name (customized on the game side) English name of the product cannot contain special characters ex: Gem100
        /// Product ID: The ID of a specific product type
        public abstract void LogIAPBtnShow(string _productName, string _productID);
        /// 
        /// Log IAP button Click
        /// 
        /// Product name (customized on the game side) English name of the product cannot contain special characters ex: Gem100
        /// Product ID: The ID of a specific product type
        public abstract void LogIAPBtnClick(string _productName, string _productID);
        /// 
        /// Log IAP First payment successful
        /// 
        /// Product name (customized on the game side) English name of the product cannot contain special characters ex: Gem100
        /// Product ID: The ID of a specific product type
        /// The order id returned by the payment channel
        /// Currency ex:USD
        /// Price
        public abstract void LogIAPFirstPurchase(string _iap, string _id, string _paymentChannelOrderid, string _currency, string _price);
        /// 
        /// Log IAP payment successful
        /// 
        /// Product name (customized on the game side) English name of the product cannot contain special characters ex: Gem100
        /// Product ID: The ID of a specific product type
        /// The order id on the game side
        /// The order id returned by the payment channel
        /// Purchase token: When the purchase is successful on GP, a purchase token will be generated as a unique identifier
        /// Official payment channels: appstore, googleplay, other payment channels corresponding channel name
        /// Currency ex:USD
        /// Price
        public abstract void LogIAPSuccess(string _iap, string _id, string _gameOrderid, string _paymentChannelOrderid, string _productToken, string _paymentMethod, string _currency, string _price);
        #endregion
        #region MyRegion
        public abstract void SaveCloudArchiving(string content, Action callback);
        public abstract void DetailCloudArchiving(Action callback);
        #endregion
        #region serve for wz
        /// 
        /// Set userid and third account
        /// 
        ///  userID (Unique user id)
        /// third account 
        ///  third account type 
        public abstract void SetUserIDAndThirdAccount(string _userID, string _thirdAccount, ThirdAccountType _thirdAccountType);
        #endregion
        #region client iap pay result
        /// 
        /// Client IAP Success
        /// 
        public abstract void ClientIAPSuccess(string _productName, string _productID, string _purchaseOrderID, string _purchaseToken, string _currency, string _price, string _gameExtra);
        /// 
        /// Client IAP Failed
        /// 
        public abstract void ClientIAPFailed(string _productName, string _productID, string _purchaseOrderID, string _purchaseToken, string _currency, string _price, string _gameExtra, IAPClientFailReasonType _failType);
        #endregion
    }
}