package it.deagostini.plugins;

import android.view.WindowManager;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaWebView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.util.Log;
import android.net.Uri;
import android.text.Html;
import android.content.*;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;

import java.util.Random;
import com.ois.android.OIS;
import com.ois.android.controller.OISinstreamController;


public class SmartClip extends CordovaPlugin {

  public static final String ACTION_SMARTCLIP_INTERSTITIAL = "interstitial";

  private int orientation;
  private int displayHeight, displayWidth;
  private int previewHeight, previewWidth;
  private OISinstreamController instreamSDK;
  private View videoHolderContainer;
  private RelativeLayout videoHolder;
  private boolean prerollLoaded = false;

  private String APP_KEY = "";
  private String ITEM_ID = "";


  public void initialize(CordovaInterface cordova, CordovaWebView webView) {
    super.initialize(cordova, webView);
    this.cordova = cordova;
    this.webView = webView;
  }

  @Override
  public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
    try {


      if (ACTION_SMARTCLIP_INTERSTITIAL.equals(action)) {
        JSONObject arguments = args.getJSONObject(0);
        FrequencyCapManager.initializeWithAppKey( arguments.optString("AppKey"), this.cordova.getActivity().getApplicationContext() );
        
        APP_KEY = arguments.optString("AppKey");
        ITEM_ID = arguments.optString("ItemID");


        if( FrequencyCapManager.getInstance().canDisplayAdForItemWithId(arguments.optString("ItemID")) ){
	  int skipButtonDelay = FrequencyCapManager.getInstance().getSkipAfterSecsValueForItemWithId(arguments.optString("ItemID"));
 	  initSmartclipSDK(skipButtonDelay);
        }
        else{
          //android.widget.Toast.makeText(cordova.getActivity().getApplicationContext(), "Daily cap reached", android.widget.Toast.LENGTH_SHORT).show();
        }

        callbackContext.success();
        return true;

      } 
      else {
        callbackContext.error("smartclip." + action + " is not a supported function");
        return false;
      }
    } 
    catch (Exception e) {
      callbackContext.error(Log.getStackTraceString(e));
      //callbackContext.error(e.getMessage());
      return false;
    }
  }
  
  

	private void initSmartclipSDK(int closeButtonDelay) {
		videoHolderContainer = this.cordova.getActivity().findViewById(R.id.videoHolderContainer);
		videoHolder = (RelativeLayout) this.cordova.getActivity().findViewById(R.id.videoHolder);

		// insert sdk
		
		Context context=this.cordova.getActivity().getApplicationContext();

		instreamSDK = new OIS((Activity) context).instreamController(videoHolder);
		instreamSDK.setResponseListener(new OISinstreamController.ResponseListener() {

			public void linearPreparedToPlay() {
				cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
		                cordova.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		        
				videoHolderContainer.setVisibility(View.VISIBLE);
				instreamSDK.startLinearAd();
				
				prerollLoaded = true;
			}
			
			public void proceedStart() {
				instreamSDK = null;
				
				if(prerollLoaded){
					cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
	                cordova.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
	                
					videoHolderContainer.setVisibility(View.GONE);
					
					// set the preroll was consumed
					FrequencyCapManager.getInstance().setDisplayConsumedForItemWithId(ITEM_ID);
				}
				else{
					//Toast.makeText(SmartClip.this, "No preroll to display", Toast.LENGTH_SHORT).show();
				}
				
				videoHolder.removeAllViews();
			}
			
			public void didFailLoad() {
				//Toast.makeText(SmartClip.this, "Error loading preroll", Toast.LENGTH_SHORT).show();
				
				instreamSDK = null;
				videoHolder.removeAllViews();
			}
			
			public int[] updateDimensions(int adWidth, int adHeight) {
				int[] dim = null;
				if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
					dim = new int[] {displayWidth, displayHeight};
				} else {
					dim = new int[] {previewWidth, previewHeight};
				}
				return dim;
			}

			public void proceedEnd() {
			}

			public void updateProgress(int durationTime, int positionTime, int bufferPercent) {
			}

			public void showControls() {
			}

			public void hideControls() {
			}

			public void pauseContent(boolean pause) {
			}

			public void midrollIsActive(boolean active) {
			}

			public void willShowAd() {
			}

			public boolean handleClickThru(String URL) {
				return false;
			}

		});
		
		prerollLoaded = false;
		
		Random random = new Random();
		String randomString = random.nextInt(10) + "" + random.nextInt(10) + "" + random.nextInt(10) + "" +
				random.nextInt(10) + "" + random.nextInt(10) + "" + random.nextInt(10) + "" + random.nextInt(10) + "" + random.nextInt(10);
		
		String adCall = "http://ae.amgdgt.com/ads?t=de&p=9372&pl=teststandard&cat=ms_vast2_nofc&sz=400x320&rnd=" + randomString;
		
		instreamSDK.config().addPreroll(adCall);
		
		instreamSDK.config().setClickThruAlertTitle("Attenzione");
		instreamSDK.config().setClickThruAlertMessage("Vuoi navigare al sito web?");
		instreamSDK.config().setClickThruAlertCancelButtonTitle("No, non ora");
		instreamSDK.config().setClickThruAlertOpenButtonTitle("Vai al sito!");
		
		instreamSDK.config().setCountdownEnabled(true);
		
		instreamSDK.config().setLinearCloseButtonDelay( closeButtonDelay );
		instreamSDK.config().setShowLoadingView(true);
		instreamSDK.config().setLinearAutostart(false);
		
		instreamSDK.onBeforeContent();

	}
	
	@SuppressWarnings("deprecation")
	private void updateDisplay() {

		Display display = cordova.getActivity().getWindowManager().getDefaultDisplay();

		displayWidth = display.getWidth();
		displayHeight = display.getHeight();

		previewWidth = displayWidth;
		previewHeight = (int) (displayWidth / ((double) displayHeight / (double) displayWidth));

		if (display.getHeight() >= display.getWidth()) {
			orientation = Configuration.ORIENTATION_PORTRAIT;
		} else {
			orientation = Configuration.ORIENTATION_LANDSCAPE;
		}

		if (instreamSDK != null) {
			instreamSDK.resize();
		}
		
	}
}
