#if UNITY_IPHONE || UNITY_IOS
using UnityEngine;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System;
using System.Globalization;


public class iOSAgent : IronSourceIAgent
{
	
	struct IOSWaterfallConfiguration 
	{
		public double Floor;
		public double Ceiling;
	}
	
	[DllImport("__Internal")]
	private static extern void LPPSetWaterfallConfiguration(IOSWaterfallConfiguration configurationParams, AdFormat adFormat);
	
	[DllImport("__Internal")]
	private static extern void CFSetPluginData(string pluginType, string pluginVersion, string pluginFrameworkVersion);

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

	[DllImport("__Internal")]
	private static extern void CFValidateIntegration();

	[DllImport("__Internal")]
	private static extern void CFShouldTrackNetworkState(bool track);

	[DllImport("__Internal")]
	private static extern bool CFSetDynamicUserId(string dynamicUserId);

	[DllImport("__Internal")]
	private static extern void CFSetAdaptersDebug(bool enabled);

	[DllImport("__Internal")]
	private static extern void CFSetMetaData(string key, string value);

	[DllImport("__Internal")]
	private static extern void CFSetMetaDataWithValues(string key, params string[] values);

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

	[DllImport("__Internal")]
	private static extern void CFSetManualLoadRewardedVideo(bool isOn);

	[DllImport("__Internal")]
	private static extern void CFSetNetworkData(string networkKey, string networkData);

	delegate void ISUnityPauseGame(bool pause);
	[DllImport("__Internal")]
	private static extern void RegisterPauseGameFunction(bool pasue);


	//******************* SDK Init *******************//

	[DllImport("__Internal")]
	private static extern void CFSetUserId(string userId);

	[DllImport("__Internal")]
	private static extern void CFInit(string appKey);

	[DllImport("__Internal")]
	private static extern void CFInitWithAdUnits(string appKey, params string[] adUnits);

	[DllImport("__Internal")]
	private static extern void CFInitISDemandOnly(string appKey, params string[] adUnits);

	//******************* RewardedVideo API *******************//

	[DllImport("__Internal")]
	private static extern void CFLoadRewardedVideo();


	[DllImport("__Internal")]
	private static extern void CFShowRewardedVideo();

	[DllImport("__Internal")]
	private static extern void CFShowRewardedVideoWithPlacementName(string placementName);

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

	[DllImport("__Internal")]
	private static extern bool CFIsRewardedVideoPlacementCapped(string placementName);

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

	[DllImport("__Internal")]
	private static extern void CFSetRewardedVideoServerParameters(string jsonString);

	[DllImport("__Internal")]
	private static extern void CFClearRewardedVideoServerParameters();

	//******************* RewardedVideo DemandOnly API *******************//

	[DllImport("__Internal")]
	private static extern void CFShowISDemandOnlyRewardedVideo(string instanceId);

	[DllImport("__Internal")]
	private static extern void CFLoadISDemandOnlyRewardedVideo(string instanceId);

	[DllImport("__Internal")]
	private static extern bool CFIsDemandOnlyRewardedVideoAvailable(string instanceId);

	//******************* Interstitial API *******************//

	[DllImport("__Internal")]
	private static extern void CFLoadInterstitial();

	[DllImport("__Internal")]
	private static extern void CFShowInterstitial();

	[DllImport("__Internal")]
	private static extern void CFShowInterstitialWithPlacementName(string placementName);

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

	[DllImport("__Internal")]
	private static extern bool CFIsInterstitialPlacementCapped(string placementName);

	//******************* Interstitial DemandOnly API *******************//

	[DllImport("__Internal")]
	private static extern void CFLoadISDemandOnlyInterstitial(string instanceId);

	[DllImport("__Internal")]
	private static extern void CFShowISDemandOnlyInterstitial(string instanceId);

	[DllImport("__Internal")]
	private static extern bool CFIsDemandOnlyInterstitialReady(string instanceId);


	//******************* Offerwall API *******************//

	[DllImport("__Internal")]
	private static extern void CFShowOfferwall();

	[DllImport("__Internal")]
	private static extern void CFShowOfferwallWithPlacementName(string placementName);

	[DllImport("__Internal")]
	private static extern void CFGetOfferwallCredits();

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

	//******************* Banner API *******************//

	[DllImport("__Internal")]
	private static extern void CFLoadBanner(string description, int width, int height, int position, string placementName, bool isAdaptive);

	[DllImport("__Internal")]
	private static extern void CFDestroyBanner();

	[DllImport("__Internal")]
	private static extern void CFDisplayBanner();

	[DllImport("__Internal")]
	private static extern void CFHideBanner();

	[DllImport("__Internal")]
	private static extern bool CFIsBannerPlacementCapped(string placementName);

	[DllImport("__Internal")]
	private static extern void CFSetSegment(string json);

	[DllImport("__Internal")]
	private static extern void CFSetConsent(bool consent);

	//******************* ConsentView API *******************//

	[DllImport("__Internal")]
	private static extern void CFLoadConsentViewWithType(string consentViewType);

	[DllImport("__Internal")]
	private static extern void CFShowConsentViewWithType(string consentViewType);

	//******************* ILRD API *******************//

	[DllImport("__Internal")]
	private static extern void CFSetAdRevenueData(string dataSource, string impressionData);

	//******************* TestSuite API *******************//

	[DllImport("__Internal")]
	private static extern void CFLaunchTestSuite();

	public iOSAgent()
	{
	}

	#region IronSourceIAgent implementation

	//******************* Base API *******************//

	/// <summary>
	/// Allows publishers to set configurations for a waterfall of a given ad type.
	/// </summary>
	/// <param name="adFormat">The AdFormat for which to configure the waterfall.</param>
	/// <param name="waterfallConfiguration">The configuration for the given ad types waterfall. </param>
	public void SetWaterfallConfiguration(WaterfallConfiguration waterfallConfiguration, AdFormat adFormat)
	{
		var config = new IOSWaterfallConfiguration
		{
			Floor = waterfallConfiguration.Floor ?? 0.0,
			Ceiling = waterfallConfiguration.Ceiling ?? 0.0
		};
		
		LPPSetWaterfallConfiguration(config, adFormat);
	}

	public void onApplicationPause(bool pause)
	{

	}

	public string getAdvertiserId()
	{
		return CFGetAdvertiserId();
	}

	public void validateIntegration()
	{
		CFValidateIntegration();
	}

	public void shouldTrackNetworkState(bool track)
	{
		CFShouldTrackNetworkState(track);
	}

	public bool setDynamicUserId(string dynamicUserId)
	{
		return CFSetDynamicUserId(dynamicUserId);
	}

	public void setAdaptersDebug(bool enabled)
	{
		CFSetAdaptersDebug(enabled);
	}

	public void setMetaData(string key, params string[] values)
	{
		CFSetMetaDataWithValues(key, values);
	}

	public void setMetaData(string key, string value)
	{
		CFSetMetaData(key, value);
	}

	public int? getConversionValue()
	{
		CultureInfo invCulture = CultureInfo.InvariantCulture;
		int parsedInt;
		if (int.TryParse(string.Format(invCulture, "{0}", CFGetConversionValue()), NumberStyles.Any, invCulture, out parsedInt))
		{
			return parsedInt;
		}

		return null;
	}

	public void setManualLoadRewardedVideo(bool isOn)
	{
		CFSetManualLoadRewardedVideo(isOn);
	}

	public void setNetworkData(string networkKey, string networkData)
	{
		CFSetNetworkData(networkKey, networkData);
	}

	[AOT.MonoPInvokeCallback(typeof(ISUnityPauseGame))]
	public void SetPauseGame(bool pause)
	{
		RegisterPauseGameFunction(pause);
		if (pause)
		{
			setMetaData("IS_PAUSE_GAME_FLAG", "true");
		}
		else
		{
			setMetaData("IS_PAUSE_GAME_FLAG", "false");
		}
	}

	//******************* SDK Init *******************//

	public void setUserId(string userId)
	{
		CFSetUserId(userId);
	}

	public void init(string appKey)
	{
		CFSetPluginData("Unity", IronSource.pluginVersion(), IronSource.unityVersion());
		Debug.Log("IntegrationHelper pluginVersion: " + IronSource.pluginVersion());
		CFInit(appKey);
	}

	public void init(string appKey, params string[] adUnits)
	{
		CFSetPluginData("Unity", IronSource.pluginVersion(), IronSource.unityVersion());
		Debug.Log("IntegrationHelper pluginVersion: " + IronSource.pluginVersion());
		CFInitWithAdUnits(appKey, adUnits);
	}

	public void initISDemandOnly(string appKey, params string[] adUnits)
	{
		CFSetPluginData("Unity", IronSource.pluginVersion(), IronSource.unityVersion());
		Debug.Log("IntegrationHelper pluginVersion: " + IronSource.pluginVersion());
		CFInitISDemandOnly(appKey, adUnits);
	}

	//******************* RewardedVideo API *******************//

	public void loadRewardedVideo()
	{
		CFLoadRewardedVideo();
	}

	public void showRewardedVideo()
	{
		CFShowRewardedVideo();
	}

	public void showRewardedVideo(string placementName)
	{
		CFShowRewardedVideoWithPlacementName(placementName);
	}

	public bool isRewardedVideoAvailable()
	{
		return CFIsRewardedVideoAvailable();
	}

	public bool isRewardedVideoPlacementCapped(string placementName)
	{
		return CFIsRewardedVideoPlacementCapped(placementName);
	}

	public IronSourcePlacement getPlacementInfo(string placementName)
	{
		IronSourcePlacement sp = null;

		string spString = CFGetPlacementInfo(placementName);
		if (spString != null)
		{
			Dictionary<string, object> spDic = IronSourceJSON.Json.Deserialize(spString) as Dictionary<string, object>;
			string pName = spDic["placement_name"].ToString();
			string rewardName = spDic["reward_name"].ToString();
			int rewardAmount = Convert.ToInt32(spDic["reward_amount"].ToString());
			sp = new IronSourcePlacement(pName, rewardName, rewardAmount);
		}

		return sp;
	}

	public void setRewardedVideoServerParams(Dictionary<string, string> parameters)
	{
		string json = IronSourceJSON.Json.Serialize(parameters);
		CFSetRewardedVideoServerParameters(json);
	}

	public void clearRewardedVideoServerParams()
	{
		CFClearRewardedVideoServerParameters();
	}

	//******************* RewardedVideo DemandOnly API *******************//

	public void showISDemandOnlyRewardedVideo(string instanceId)
	{
		CFShowISDemandOnlyRewardedVideo(instanceId);
	}

	public void loadISDemandOnlyRewardedVideo(string instanceId)
	{
		CFLoadISDemandOnlyRewardedVideo(instanceId);
	}

	public bool isISDemandOnlyRewardedVideoAvailable(string instanceId)
	{
		return CFIsDemandOnlyRewardedVideoAvailable(instanceId);
	}

	//******************* Interstitial API *******************//

	public void loadInterstitial()
	{
		CFLoadInterstitial();
	}

	public void showInterstitial()
	{
		CFShowInterstitial();
	}

	public void showInterstitial(string placementName)
	{
		CFShowInterstitialWithPlacementName(placementName);
	}

	public bool isInterstitialReady()
	{
		return CFIsInterstitialReady();
	}

	public bool isInterstitialPlacementCapped(string placementName)
	{
		return CFIsInterstitialPlacementCapped(placementName);
	}

	//******************* Interstitial DemandOnly API *******************//

	public void loadISDemandOnlyInterstitial(string instanceId)
	{
		CFLoadISDemandOnlyInterstitial(instanceId);
	}

	public void showISDemandOnlyInterstitial(string instanceId)
	{
		CFShowISDemandOnlyInterstitial(instanceId);
	}

	public bool isISDemandOnlyInterstitialReady(string instanceId)
	{
		return CFIsDemandOnlyInterstitialReady(instanceId);
	}

	//******************* Offerwall API *******************//

	public void showOfferwall()
	{
		CFShowOfferwall();
	}

	public void showOfferwall(string placementName)
	{
		CFShowOfferwallWithPlacementName(placementName);
	}

	public void getOfferwallCredits()
	{
		CFGetOfferwallCredits();
	}

	public bool isOfferwallAvailable()
	{
		return CFIsOfferwallAvailable();
	}

	//******************* Banner API *******************//

	public void loadBanner(IronSourceBannerSize size, IronSourceBannerPosition position)
	{
		loadBanner(size, position, "");
	}

	public void loadBanner(IronSourceBannerSize size, IronSourceBannerPosition position, string placementName)
	{
		CFLoadBanner(size.Description, (int)size.Width, (int)size.Height, (int)position, placementName, (bool)size.IsAdaptiveEnabled());
	}

	public void destroyBanner()
	{
		CFDestroyBanner();
	}

	public void displayBanner()
	{
		CFDisplayBanner();
	}

	public void hideBanner()
	{
		CFHideBanner();
	}

	public bool isBannerPlacementCapped(string placementName)
	{
		return CFIsBannerPlacementCapped(placementName);
	}

	public void setSegment(IronSourceSegment segment)
	{
		Dictionary<string, string> dict = segment.getSegmentAsDict();
		string json = IronSourceJSON.Json.Serialize(dict);
		CFSetSegment(json);
	}

	public void setConsent(bool consent)
	{
		CFSetConsent(consent);
	}

	public void loadConsentViewWithType(string consentViewType)
	{
		CFLoadConsentViewWithType(consentViewType);
	}

	public void showConsentViewWithType(string consentViewType)
	{
		CFShowConsentViewWithType(consentViewType);
	}

	//******************* ILRD API *******************//

	public void setAdRevenueData(string dataSource, Dictionary<string, string> impressionData)
	{
		string json = IronSourceJSON.Json.Serialize(impressionData);
		CFSetAdRevenueData(dataSource, json);
	}

	//******************* TestSuite API *******************//

	public void launchTestSuite()
	{
		Debug.Log("iOSAgent: launching TestSuite");
		CFLaunchTestSuite();
	}

	#endregion
}
#endif