﻿using System;
using System.Collections.Generic;

using InMobiAds;
using InMobiAds.Common;

namespace InMobiAds.Api
{
	public class InterstitialAd
	{
		private IInterstitialClient IInterstitialClient;

		public event EventHandler<AdLoadSuccessEventArgs> OnAdLoadSucceeded = delegate{};
		public event EventHandler<AdLoadFailedEventArgs> OnAdLoadFailed = delegate{};
		public event EventHandler<AdFetchSuccessEventArgs> OnAdFetchSuccessful = delegate{};
		public event EventHandler<AdFetchFailedEventArgs> OnAdFetchFailed = delegate{};
		public event EventHandler<EventArgs> OnAdImpression = delegate{};
		public event EventHandler<EventArgs> OnAdDisplayFailed = delegate{};
		public event EventHandler<EventArgs> OnAdWillDisplay = delegate{};
		public event EventHandler<EventArgs> OnAdDisplayed = delegate{};
		public event EventHandler<EventArgs> OnAdDismissed = delegate{};
		public event EventHandler<AdInteractionEventArgs> OnAdInteraction = delegate{};
		public event EventHandler<EventArgs> OnUserLeftApplication = delegate{};
		public event EventHandler<AdRewardActionCompletedEventArgs> OnAdRewardActionCompleted = delegate{};

		public InterstitialAd(string placementId)
		{
			IInterstitialClient = InMobiAdsClientFactory.BuildInterstitialClient ();
			IInterstitialClient.CreateInterstitialAd (placementId);
			
			IInterstitialClient.OnAdLoadSucceeded += delegate(object sender, AdLoadSuccessEventArgs e) {
				OnAdLoadSucceeded (this, e);
			};

			IInterstitialClient.OnAdLoadFailed += delegate(object sender, AdLoadFailedEventArgs e) {
				OnAdLoadFailed (this, e);
			};

			IInterstitialClient.OnAdFetchSuccessful += delegate(object sender, AdFetchSuccessEventArgs e) {
				OnAdFetchSuccessful (this, e);
			};

			IInterstitialClient.OnAdFetchFailed += delegate(object sender, AdFetchFailedEventArgs e) {
				OnAdFetchFailed (this, e);
			};

			IInterstitialClient.OnAdImpression += delegate(object sender, EventArgs e) {
				OnAdImpression (this, e);
			};

			IInterstitialClient.OnAdDisplayFailed += delegate(object sender, EventArgs e) {
				OnAdDisplayFailed (this, e);
			};

			IInterstitialClient.OnAdWillDisplay += delegate(object sender, EventArgs e) {
				OnAdWillDisplay (this, e);
			};

			IInterstitialClient.OnAdDisplayed += delegate(object sender, EventArgs e) {
				OnAdDisplayed (this, e);
			};

			IInterstitialClient.OnAdDismissed += delegate(object sender, EventArgs e) {
				OnAdDismissed (this, e);
			};

			IInterstitialClient.OnAdInteraction += delegate(object sender, AdInteractionEventArgs e) {
				OnAdInteraction (this, e);
			};

			IInterstitialClient.OnUserLeftApplication += delegate(object sender, EventArgs e) {
				OnUserLeftApplication (this, e);
			};

			IInterstitialClient.OnAdRewardActionCompleted += delegate(object sender, AdRewardActionCompletedEventArgs e) {
				OnAdRewardActionCompleted (this, e);
			};
		}

		public void LoadAd ()
		{
			IInterstitialClient.LoadAd ();
		}

		public void SetKeywords (string keywords)
		{
			IInterstitialClient.SetKeywords (keywords);
		}

		public void SetExtras (Dictionary<string, string> extras)
		{
			IInterstitialClient.SetExtras (extras);
		}

		public bool isReady ()
		{
			return IInterstitialClient.IsReady ();
		}

		public void Show ()
		{
			IInterstitialClient.Show ();
		}
	}
}

