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

public class Personaly : MonoBehaviour {

	#region Callbacks
	public interface ConfigureCallback
	{
		void ConfigureSuccess ();

		void ConfigureFailure (string result);
	}

	public interface CampaignCallback
	{
		void PrecacheCampaignCallback (string result);

		void CloseCampaignCallback (string result);

		void FailureCampaignCallback (string result);

		void CanViewCampaignCallback (string result);

		void DidReceiveRewardCampaignCallback (string result);
	}

	public interface AppWallCallback
	{
		void CloseAppWallCallback (string result);

		void FailureAppWallCallback (string result);
	}

	public interface OfferWallCallback
	{
		void CloseOfferWallCallback (string result);

		void FailureOfferWallCallback (string result);
	}

	public interface PopupOfferCallback
	{
		void PrecachePopupOfferCallback ();

		void ClosePopupOfferCallback (string result);

		void FailurePopupOfferCallback (string result);
	}

	public interface NativeCallback
	{
		void PrecacheNativeCallback (string result);

		void FailureNativeCallback (string result);
	}
	#endregion

	#region SDK Initialization
	public static void Configure (string objectName, string appID) 
	{
		Configure (objectName, appID, null);
	}

	public static void Configure (string objectName, string appID, Config config) 
	{
		string parameters = null;
		if (config != null) {
			parameters = config.ToJson();
		}
		#if UNITY_IOS
		_configure (objectName, appID, parameters);
		#elif UNITY_ANDROID			
		GetAndroidBridgeClass().CallStatic("init", objectName, appID, parameters);
		#endif
	}

	public static void setAutoCaching(bool autoCaching) 
	{
		#if UNITY_IOS
		_setAutocaching (autoCaching);
		#elif UNITY_ANDROID			
		GetAndroidBridgeClass().CallStatic("setAutoCaching", autoCaching);
		#endif
	}

//	public static bool IsInitialized(){
//		bool isInitialized = false;
//		#if UNITY_IPHONE
//		// ...
//		#elif UNITY_ANDROID
//		isInitialized = GetAndroidBridgeClass().CallStatic<bool>("isInitialized");
//		#endif
//		return isInitialized;
//	}
	#endregion

	#region Campaign
	public static void PrecacheCampaign (string objectName, string placementID) 
	{
		#if UNITY_IOS
		_precacheCampaigns (objectName, placementID);
		#elif UNITY_ANDROID			
		GetAndroidBridgeClass().CallStatic("campaignLoad", objectName, placementID);
		#endif
	}

	public static void ShowCampaign (string objectName, string placementID) 
	{
		ShowCampaign (objectName, placementID, null);
	}

	public static void ShowCampaign (string objectName, string placementID, ServerParameter serverParameter) 
	{
		string serverParameterJSON = null;
		if (serverParameter != null) {
			serverParameterJSON = serverParameter.ToJson();
		}

		#if UNITY_IOS
		_showCampaign (objectName, placementID, serverParameterJSON);
		#elif UNITY_ANDROID			
		GetAndroidBridgeClass().CallStatic("campaignShow", placementID, serverParameterJSON);
		#endif
	}

	public static void CanViewCampaign(string objectName, string placementID)
	{
		#if UNITY_IOS
		_canView (objectName, placementID);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("campaignCanView", objectName, placementID);
		#endif
	}

//	public static bool IsShowingCampaign(string placementID)
//	{
//		bool isShowing = false;
//		#if UNITY_IOS
//		// ...
//		#elif UNITY_ANDROID
//		isShowing = GetAndroidBridgeClass().CallStatic<bool>("campaignIsShowing", placementID);
//		#endif
//		return isShowing;
//	}

	public static bool IsReadyCampaign(string placementID)
	{
		bool isShowing = false;
		#if UNITY_IOS
		// ...
		#elif UNITY_ANDROID
		isShowing = GetAndroidBridgeClass().CallStatic<bool>("campaignIsReady", placementID);
		#endif
		return isShowing;
	}
	#endregion

	#region App Wall
	public static void ShowAppWall(string objectName, string placementID, ServerParameter serverParameter)
	{
		string serverParameterJSON = null;
		if (serverParameter != null) {
			serverParameterJSON = serverParameter.ToJson();
		}
		#if UNITY_IOS

		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("appWallShow", objectName, placementID, serverParameterJSON);
		#endif
	}

//	public static bool IsShowingAppWall(string placementID)
//	{
//		bool isShowing = false;
//		#if UNITY_IOS
//		// ...
//		#elif UNITY_ANDROID
//		isShowing = GetAndroidBridgeClass().CallStatic<bool>("appWallIsShowing", placementID);
//		#endif
//		return isShowing;
//	}
	#endregion

	#region Offer Wall

	public static void ShowOfferWall(string objectName, string placementID)
	{
		ShowOfferWall (objectName, placementID, null);
	}

	public static void ShowOfferWall(string objectName, string placementID, ServerParameter serverParameter)
	{
		string serverParameterJSON = null;
		if (serverParameter != null) {
			serverParameterJSON = serverParameter.ToJson();
		}

		#if UNITY_IOS
		_showOfferWall (objectName, placementID, serverParameterJSON);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("offerWallShow", objectName, placementID, serverParameterJSON);
		#endif
	}

//	public static bool IsShowingOfferWall(string placementID)
//	{
//		bool isShowing = false;
//		#if UNITY_IOS
//		// ...
//		#elif UNITY_ANDROID
//		isShowing = GetAndroidBridgeClass().CallStatic<bool>("offerWallIsShowing", placementID);
//		#endif
//		return isShowing;
//	}
	#endregion

	#region Popup Offer
	public static void PrecacheRewardedPopup(string objectName, string placementID){
		#if UNITY_IOS
		_precacheRewardablePopupTemplate (objectName);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("popupOfferLoad", objectName, placementID);
		#endif
	}

	public static void ShowRewardablePopup(string objectName, string placementID)
	{
		ShowRewardablePopup (objectName, placementID, null);
	}

	public static void ShowRewardablePopup(string objectName, string placementID, ServerParameter serverParameter){

		string serverParameterJSON = null;
		if (serverParameter != null) {
			serverParameterJSON = serverParameter.ToJson();
		}

		#if UNITY_IOS
		_showRewardablePopup (objectName, placementID, serverParameterJSON);
		#elif UNITY_ANDROID
				GetAndroidBridgeClass().CallStatic("popupOfferShow", placementID, serverParameterJSON);
		#endif
	}

//	public static bool IsShowingRewardablePopup(string placementID){
//		bool isShowing = false;
//		#if UNITY_IOS
//		// ...
//		#elif UNITY_ANDROID
//		isShowing = GetAndroidBridgeClass().CallStatic<bool>("popupOfferIsShowing", placementID);
//		#endif
//		return isShowing;
//	}
//
//	public static bool IsReadyRewardablePopup(string placementID){
//		bool isShowing = false;
//		#if UNITY_IOS
//		// ...
//		#elif UNITY_ANDROID
//		isShowing = GetAndroidBridgeClass().CallStatic<bool>("popupOfferIsReady", placementID);
//		#endif
//		return isShowing;
//	}
	#endregion

	#region Native
	public static void PrecacheNative(string objectName, string placementID){
		#if UNITY_IOS
        _precacheNativeAds (objectName, placementID, true, "both", 1);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("nativeLoad", objectName, placementID, null, null, 1);
		#endif
	}

	public static void PrecacheNative(string objectName, string placementID, int countOfAds){
		#if UNITY_IOS
        _precacheNativeAds (objectName, placementID, true, "both", countOfAds);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("nativeLoad", objectName, placementID, null, null, countOfAds);
		#endif
	}

	public static void PrecacheNative(string objectName, string placementID, bool preCaching, string creativeType, int countOfAds){
		#if UNITY_IOS
        _precacheNativeAds (objectName, placementID, preCaching, creativeType, countOfAds);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("nativeLoad", objectName, placementID, preCaching, creativeType, countOfAds);
		#endif
	}


	public static void reportNativeImpressionStarted(string placementID, string impressionID){
		#if UNITY_IOS
        _reportNativeAdImpression (impressionID);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("reportNativeAdImpressionStarted", placementID, impressionID);
		#endif
	}

	public static void reportNativeImpressionFinished(string placementID, string impressionID){
		#if UNITY_IOS
        _reportNativeAdVideoEnded (impressionID);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("reportNativeAdImpressionFinished", placementID, impressionID);
		#endif
	}

	public static void reportNativeClicked(string placementID, string impressionID){

		reportNativeClicked (placementID, impressionID);
	}

	public static void reportNativeClicked(string placementID, string impressionID, ServerParameter serverParameter){

		string serverParameterJSON = null;
		if (serverParameter != null) {
			serverParameterJSON = serverParameter.ToJson();
		}

		#if UNITY_IOS
		_reportNativeAdClick (impressionID, serverParameterJSON);
		#elif UNITY_ANDROID
		GetAndroidBridgeClass().CallStatic("reportNativeAdClicked", placementID, impressionID, serverParameterJSON);
		#endif
	}

	#if UNITY_ANDROID
	public static void openGooglePlayAndTrackClick(string placementID, string appId, string trackingUrl){
		GetAndroidBridgeClass().CallStatic("openGooglePlayById", placementID, appId, trackingUrl);
	}
	#endif

	#endregion

	#region Externals

	#if UNITY_IOS

	[DllImport ("__Internal")]
	private static extern void _configure(string objectName, string appID, string parameters);

	[DllImport ("__Internal")]
	private static extern void _precacheCampaigns(string objectName, string placementID);

	[DllImport ("__Internal")]
	private static extern void _showCampaign(string objectName, string placementID, string serverParameter);

	[DllImport ("__Internal")]
	private static extern void _showOfferWall(string objectName, string placementID, string serverParameter);

	[DllImport ("__Internal")]
	private static extern void _precacheRewardablePopupTemplate(string objectName);

	[DllImport ("__Internal")]
	private static extern void _showRewardablePopup(string objectName, string placementID, string serverParameter);

	[DllImport ("__Internal")]
	private static extern void _canView(string objectName, string placementID);

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

	[DllImport ("__Internal")]
	private static extern bool _isCampaignReady(bool placementID);

	[DllImport ("__Internal")]
	private static extern void _precacheNativeAds(string objectName, string placementID, bool shouldDownloadAssets, string creativeType, int numberOfAdsToPrecache);

	[DllImport ("__Internal")]
	private static extern void _reportNativeAdImpression(string impressionID);

	[DllImport ("__Internal")]
	private static extern void _reportNativeAdClick(string impressionID, string serverParameter);

	[DllImport ("__Internal")]
	private static extern void _reportNativeAdVideoStarted(string impressionID);

	[DllImport ("__Internal")]
	private static extern void _reportNativeAdVideoEnded(string impressionID);


	#endif

	#if UNITY_ANDROID
	private static AndroidJavaClass androidBridgeClass;
	private static AndroidJavaClass GetAndroidBridgeClass(){
		if (androidBridgeClass == null)
			androidBridgeClass = new AndroidJavaClass("ly.persona.sdk.UnityBridge");
		return androidBridgeClass;
	}
	#endif

	#endregion
}
