package com.indigitall.cordova.inapp;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Build;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageButton;
import android.widget.PopupWindow;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.indigitall.android.commons.models.ErrorMessage;
import com.indigitall.android.commons.models.ErrorModel;
import com.indigitall.android.commons.utils.Log;
import com.indigitall.android.inapp.InAppConfiguration;
import com.indigitall.android.inapp.InAppConstants;
import com.indigitall.android.inapp.InAppIndigitall;
import com.indigitall.android.inapp.Utils.EventUtils;
import com.indigitall.android.inapp.Utils.InAppAudienceUtils;
import com.indigitall.android.inapp.Utils.InAppPreferenceUtils;
import com.indigitall.android.inapp.Utils.InAppValidations;
import com.indigitall.android.inapp.Utils.ShowInAppUtils;
import com.indigitall.android.inapp.api.InAppClient;
import com.indigitall.android.inapp.api.request.InAppApplicationRequest;
import com.indigitall.android.inapp.api.request.InAppAudiencesRequest;
import com.indigitall.android.inapp.callbacks.GetInAppCallback;
import com.indigitall.android.inapp.callbacks.InAppApplicationCallback;
import com.indigitall.android.inapp.callbacks.InAppAudienceCallback;
import com.indigitall.android.inapp.callbacks.InAppCallback;
import com.indigitall.android.inapp.models.InApp;
import com.indigitall.android.inapp.models.InAppApplication;
import com.indigitall.android.inapp.models.InAppAudience;
import com.indigitall.android.inapp.models.InAppErrorModel;
import com.indigitall.android.inapp.models.InAppPopUp;
import com.indigitall.cordova.inapp.callbacks.ShowCDVInAppCallback;
import com.indigitall.cordova.interfaces.WebCDVInAppInterface;

public class CDVInAppIndigitall {
    private static final String TAG = "[IND]CDVInAppIndigitall";
    private static final String INDIGITALL_INTERFACE = "InAppIndigitallInterface";
    private static Log log = null;

    private static String htmlFinal;
    public static void showPopUp(
            @Nullable final InAppConfiguration configuration,
            final Context context,
            final View view,
            final String inAppCode,
            @Nullable ImageButton closeIcon,
            boolean closeIconDisabled,
            @Nullable final ShowCDVInAppCallback show){
        if (configuration != null) {
            InAppIndigitall.setConfiguration(context,configuration);
        }

        InAppClient.getApplicationWithInAppChannel(context, new InAppApplicationRequest(context), new InAppApplicationCallback(context, TAG) {
            @Override
            public void onSuccess(@NonNull InAppApplication inAppApplication) {
                if (InAppAudienceUtils.isAudienceCacheFinish(context)) {
                    InAppClient.getAudiences(new InAppAudiencesRequest(context), new InAppAudienceCallback(context) {
                        @Override
                        public void onSuccess(@NonNull InAppAudience audience) {
                            InAppAudienceUtils.saveAudienceCache(context, inAppApplication.getAudienceDeviceTtl());
                            inAppValidations(context, view, inAppCode, closeIcon, closeIconDisabled, show);
                        }

                        @Override
                        public void onFail(ErrorModel errorModel) {
                            Log log = new Log(TAG);
                            log.e(errorModel != null ? errorModel.getErrorMessage().getErrorMessage() : ErrorMessage.GENERAL_ERROR.getErrorMessage()).writeLog();
                            inAppValidations(context, view, inAppCode, closeIcon, closeIconDisabled, show);
                        }
                    });
                } else {
                    inAppValidations(context, view, inAppCode, closeIcon, closeIconDisabled, show);
                }
            }

            @Override
            public void onFail(@Nullable ErrorModel errorModel) {
                if (show != null) show.onFail(String.valueOf(errorModel != null ? errorModel.getErrorCode() : null), null, errorModel != null ? errorModel.getErrorMessage().getErrorMessage() : null);
            }
        });

    }

    public static void inAppValidations(
            Context context,
            View view,
            String inAppCode,
            ImageButton closeIcon,
            boolean closeIconDisabled,
            ShowCDVInAppCallback show) {
        if (InAppValidations.isValidFormatRequest(context)) {
            ShowInAppUtils.inAppWithFilters(
                    context,
                    inAppCode,
                    view,
                    closeIcon,
                    closeIconDisabled,
                    true,
                    new GetInAppCallback() {
                        @Override
                        public void didExpired(InApp inApp, InAppErrorModel inAppErrorModel) {
                            if (show != null) show.didExpired(inApp, inAppErrorModel);
                        }

                        @Override
                        public void didFound(InApp inApp) {
                            showPopUp(
                                    context,
                                    view,
                                    inApp,
                                    closeIcon,
                                    closeIconDisabled,
                                    show
                            );
                        }

                        @Override
                        public void notFound() {
                            createPopUp(
                                    context,
                                    view,
                                    inAppCode,
                                    closeIcon,
                                    closeIconDisabled,
                                    show
                            );
                        }

                        @Override
                        public void didDismissForever(InApp inApp, InAppErrorModel inAppErrorModel) {
                            if (show != null) show.didDismissForever(inApp, inAppErrorModel);
                        }

                        @Override
                        public void didShowManyTimes(InApp inApp, InAppErrorModel inAppErrorModel) {
                            if (show != null) show.didShowManyTimes(inApp, inAppErrorModel);
                        }

                        @Override
                        public void didClickOut(InApp inApp, InAppErrorModel inAppErrorModel) {
                            if (show != null) show.didClickOut(inApp, inAppErrorModel);
                        }
                    }
            , show);
        }
    }

    public static void createPopUp(
            Context context,
            View view,
            String inAppCode,
            ImageButton closeIcon,
            boolean closeIconDisabled,
            ShowCDVInAppCallback show) {
        InAppIndigitall.inAppGet(context, inAppCode, new InAppCallback(context) {
            @Override
            public void onSuccess(InApp inApp) {
                InApp newInApp = ShowInAppUtils.addNewInApp(context, inApp);
                showPopUp(
                        context,
                        view,
                        newInApp,
                        closeIcon,
                        closeIconDisabled,
                        show
                );
            }

            @Override
            public void onFail(ErrorModel errorModel) {
                if (show != null) show.onFail(inAppCode, null, errorModel.getErrorMessage().getErrorMessage());
            }
        });
    }

    static CDVInAppPopUp popupWindow;
    public static void showPopUp(
            final Context context,
            final View view,
            final InApp inApp,
            @Nullable ImageButton closeIcon,
            boolean closeIconDisabled,
            @Nullable final ShowCDVInAppCallback show) {
        log = new Log(TAG,context);
        AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... params) {
                String html = inApp.getProperties().getContentUrl();
//                    log.d("InAppPopUp html: " + html).writeLog();
                return html;
            }

            @Override
            protected void onPostExecute(String html) {
                super.onPostExecute(html);
                new CDVInAppPopUp(context, html, view, inApp, closeIcon, closeIconDisabled, show);
            }
        };
        asyncTask.execute();
    }

    public static void drawInApp(
            Context context,
            InApp inApp,
            WebView hole,
            String html,
            PopupWindow popupWindow,
            ShowCDVInAppCallback show
    ) {
        hole.post(new Runnable() {
            @Override
            public void run() {
                try {
                    hole.getSettings().setJavaScriptEnabled(true);
                    hole.setHorizontalScrollBarEnabled(false);
                    hole.setVerticalScrollBarEnabled(false);
                    hole.getSettings().setUseWideViewPort(true);
                    hole.getSettings().setLoadWithOverviewMode(true);
                    htmlFinal = html;
                    if (inApp.getCustomData() != null) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            inApp.getCustomData().forEach((key, value) ->{
                                htmlFinal = htmlFinal.replace("{{"+key+"}}", value);
                            });
                        }
                    }
                    String placeholder = "\"{{customTimeSlide}}\"";
                    hole.addJavascriptInterface(new WebCDVInAppInterface(context, inApp, popupWindow, show), INDIGITALL_INTERFACE);
                    hole.loadDataWithBaseURL(
                        null,
                        htmlFinal + InAppConstants.SCRIPT.replace(placeholder, String.valueOf(InAppPreferenceUtils.getInAppCarouselTimeSlide(context))),
                        InAppConstants.MIME_TYPE_INFO,
                        InAppConstants.UTF8,
                        null
                    );
                }catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    EventUtils.sendEventPrint(context, inApp);
                }
            }
        });
    }

}
