package com.webileapps.excalibur;

import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.annotation.Nullable;

public class ExcaliburFragment extends android.app.Fragment {

    private static final String TAG = "ExcaliburFragment";
    private String title = "Chat";
    private int bgColor = Color.parseColor("#101010");
    private int textColor = Color.parseColor("#fefefe");
    private WebView mWebView;
    private ExcaliburWebChromeClient mWebChromeClient;
    private String clientId;
    private String userId;
    private String userName;
    private static final int ICE_CREAM = 12421;
    private static final int LOLLIPOP = 12422;
    private ValueCallback<Uri[]> filePathCallback;
    private ValueCallback<Uri> uploadMsg;

    public ExcaliburFragment() {
    }

    public static ExcaliburFragment newInstance(Context context) {
        ExcaliburFragment fragment = new ExcaliburFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        fragment.initializeWebView(context);
        return fragment;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        this.mWebChromeClient.setWindow(this.getActivity().getWindow());
    }

    public void initializeWebView(Context context) {
        this.mWebView = new WebView(context);
        this.mWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(url));
                ExcaliburFragment.this.startActivity(intent);
                return true;
            }
        });
        this.mWebChromeClient = new ExcaliburWebChromeClient(null) {
            public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                Log.d("ExcaliburFragment", "openFileChooser");
                ExcaliburFragment.this.uploadMsg = uploadMsg;
                Intent i = new Intent("android.intent.action.GET_CONTENT");
                i.addCategory("android.intent.category.OPENABLE");
                i.setType("*/*");
                ExcaliburFragment.this.getActivity().startActivityForResult(Intent.createChooser(i, "Choose a file"), 12421);
            }

            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                Log.d("ExcaliburFragment", "onShowFileChooser");
                ExcaliburFragment.this.filePathCallback = filePathCallback;
                Intent i = new Intent("android.intent.action.GET_CONTENT");
                i.addCategory("android.intent.category.OPENABLE");
                i.setType("*/*");
                ExcaliburFragment.this.getActivity().startActivityForResult(Intent.createChooser(i, "Choose a file"), 12422);
                return true;
            }
        };
        this.mWebView.setWebChromeClient(this.mWebChromeClient);
        WebSettings settings = this.mWebView.getSettings();
        if (context.getCacheDir() != null) {
            settings.setAppCachePath(context.getCacheDir().getAbsolutePath());
            settings.setAllowFileAccess(true);
            settings.setAppCacheEnabled(true);
        }

        settings.setJavaScriptEnabled(true);
        this.mWebView.addJavascriptInterface(new ExcaliburInterface(context, this), "ExcaliburMobile");
        settings.setDomStorageEnabled(true);
        settings.setAllowFileAccessFromFileURLs(true);
        settings.setAllowUniversalAccessFromFileURLs(true);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
    }

    public void loadChat(String clientId, String userId,String userName, String fcmToken, String customFields, boolean isStaging) {
        this.clientId = clientId;
        this.userId = userId;
        this.userName = userName;
        Uri.Builder uriBuilder = new Uri.Builder();

        uriBuilder.scheme("https");
        uriBuilder.authority("bfil.webileapps.io");

//        uriBuilder.scheme("https");
//        uriBuilder.authority("chat.driverzz.com");


        uriBuilder.path("livechat.html");
        uriBuilder.appendQueryParameter("mode", "sdk");
        uriBuilder.appendQueryParameter("sdk", "android");
        uriBuilder.appendQueryParameter("merchantId", this.userId);
        uriBuilder.appendQueryParameter("merchantName", this.userName);
        uriBuilder.appendQueryParameter("custom_fields", customFields);
        if (fcmToken != null) {
            uriBuilder.appendQueryParameter("device_token", fcmToken);
            uriBuilder.appendQueryParameter("device_type", "android");
        }

        Uri uri = uriBuilder.build();
        Log.d("ExcaliburFragment", "URI: " + uri.toString());
        this.mWebView.loadUrl(uri.toString());
    }

    public void startRoom() {
        if (Build.VERSION.SDK_INT >= 19) {
            this.mWebView.evaluateJavascript("ExcaliburLivechat.start();", (ValueCallback) null);
        } else {
            this.mWebView.loadUrl("javascript:ExcaliburLivechat.start();");
        }

    }

    public void setTextColor(String textColor) {
        this.textColor = Color.parseColor(textColor);
    }

    public int getTextColor() {
        return this.textColor;
    }

    public void setBgColor(String bgColor) {
        this.bgColor = Color.parseColor(bgColor);
    }

    public int getBgColor() {
        return this.bgColor;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTitle() {
        return this.title;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("ExcaliburFragment", "onCreate");
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d("ExcaliburFragment", "onCreateView");
        return this.mWebView;
    }

    public void onAttach(Context context) {
        super.onAttach(context);
        if (Build.VERSION.SDK_INT >= 17) {
            this.mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
        }

    }

    public void onDetach() {
        super.onDetach();
        if (Build.VERSION.SDK_INT >= 17) {
            this.mWebView.getSettings().setMediaPlaybackRequiresUserGesture(true);
        }

    }

    public void onDestroy() {
        super.onDestroy();
        Log.d("ExcaliburFragment", "onDestroy");
    }

    public void wipeData() {
        WebStorage storage = WebStorage.getInstance();
        storage.deleteAllData();
    }

    boolean isClientAndUserInitialized() {
        return this.userId != null && this.clientId != null;
    }

    boolean isClientAndUserSame(String clientId, String userId) {
        return this.isClientAndUserInitialized() && this.userId.equals(userId) && this.clientId.equals(clientId);
    }

    void fileUploadResult(int requestCode, int resultCode, Intent data) {
        Log.d("ExcaliburFragment", "Request Code: " + requestCode);
        Log.d("ExcaliburFragment", "Result Code:  " + resultCode);
        switch (requestCode) {
            case 12421:
                Uri uri = null;
                if (data != null) {
                    uri = data.getData();
                }

                this.uploadMsg.onReceiveValue(uri);
                this.uploadMsg = null;
                break;
            case 12422:
                Uri[] results = null;
                if (resultCode == -1) {
                    String dataString = data.getDataString();
                    if (dataString != null) {
                        results = new Uri[]{Uri.parse(dataString)};
                    }
                }

                this.filePathCallback.onReceiveValue(results);
                this.filePathCallback = null;
        }

    }
}

