package com.sxfjr.rnpatching;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import androidx.core.content.ContextCompat;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ImageSpan;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.views.modal.ReactModalHostView;

import java.util.ArrayList;
import java.util.List;

public class CodePushDialog extends ReactContextBaseJavaModule {

    private Dialog dialog;

    public CodePushDialog(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @ReactMethod
    public void showDialog(final String title, final String version, final String versionSize, final String message, final String button1Text,
                           final String button2Text, final Callback successCallback, Callback errorCallback) {
        Activity currentActivity = getCurrentActivity();
        if (currentActivity == null) {
            // If getCurrentActivity is null, it could be because the app is backgrounded,
            // so we show the dialog when the app resumes)
            getReactApplicationContext().addLifecycleEventListener(new LifecycleEventListener() {
                @Override
                public void onHostResume() {
                    Activity currentActivity = getCurrentActivity();
                    if (currentActivity != null) {
                        getReactApplicationContext().removeLifecycleEventListener(this);
                        showDialogInternal(title, version, versionSize, message, button1Text, button2Text, successCallback, currentActivity);
                    }
                }

                @Override
                public void onHostPause() {
                    disDialog();
                }

                @Override
                public void onHostDestroy() {

                }
            });
        } else {
            showDialogInternal(title, version, versionSize, message, button1Text, button2Text, successCallback, currentActivity);
        }
    }

    private void showDialogInternal(String title, String version, String versionSize, String message, String button1Text,
                                    String button2Text, final Callback successCallback, Activity currentActivity) {

        if (dialog != null && dialog.isShowing()) {
            return;
        }

        dialog = new Dialog(currentActivity, R.style.notice_dialog);
//        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG);
        View v_details = View.inflate(getCurrentActivity(), R.layout.view_dialog_update, null);
        dialog.setContentView(v_details);


        ImageView up_ok_iv = (ImageView) v_details.findViewById(R.id.up_ok_iv);
        TextView up_cancel_tv = (TextView) v_details.findViewById(R.id.up_cancel_tv);

        TextView up_version_tv = (TextView) v_details.findViewById(R.id.up_version_tv);
        TextView up_version_size_tv = (TextView) v_details.findViewById(R.id.up_version_size_tv);
        TextView up_tips_tv = (TextView) v_details.findViewById(R.id.up_tips_tv);

        if (!TextUtils.isEmpty(version)) {
            up_version_tv.setText(version);
        }

        if (!TextUtils.isEmpty(versionSize)) {
            up_version_size_tv.setText("新版本大小：" + versionSize);
        }

        up_cancel_tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                successCallback.invoke(1);
                disDialog();
            }
        });

        up_ok_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                successCallback.invoke(0);
            }
        });

        if (message != null) {
            TextView up_content_tv = (TextView) v_details.findViewById(R.id.up_content_tv);
            up_content_tv.setMovementMethod(ScrollingMovementMethod.getInstance());
            setParagraphSpacing(getCurrentActivity(), up_content_tv, message.trim().replace("#", "\n"), 4, 1);
        }

        if (!TextUtils.isEmpty(button1Text) && TextUtils.isEmpty(button2Text)) {

        } else if (!TextUtils.isEmpty(button1Text) && !TextUtils.isEmpty(button2Text)) {
            up_cancel_tv.setVisibility(View.VISIBLE);
            up_tips_tv.setText("更新后有更好的操作体验");
        }

        dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
                if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_HOME) {
                    return true;
                } else {
                    return false;
                }
            }
        });

        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        dialog.show();
    }

    @ReactMethod
    public void disDialog() {
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }
    }

    @Override
    public String getName() {
        return "CodePushDialog";
    }


    /**
     * 设置TextView段落间距
     *
     * @param context          上下文
     * @param tv               给谁设置段距，就传谁
     * @param content          文字内容
     * @param paragraphSpacing 请输入段落间距（单位dp）
     * @param lineSpacingExtra xml中设置的的行距（单位dp）
     */
    private void setParagraphSpacing(Context context, TextView tv, String content, int paragraphSpacing, int lineSpacingExtra) {
        if (!content.contains("\n")) {
            tv.setText(content);
            return;
        }
        content = content.replace("\n", "\n\r");

        int previousIndex = content.indexOf("\n\r");
        //记录每个段落开始的index，第一段没有，从第二段开始
        List<Integer> nextParagraphBeginIndexes = new ArrayList<>();
        nextParagraphBeginIndexes.add(previousIndex);
        while (previousIndex != -1) {
            int nextIndex = content.indexOf("\n\r", previousIndex + 2);
            previousIndex = nextIndex;
            if (previousIndex != -1) {
                nextParagraphBeginIndexes.add(previousIndex);
            }
        }
        //获取行高（包含文字高度和行距）
        float lineHeight = tv.getLineHeight();

        //把\r替换成透明长方形（宽:1px，高：字高+段距）
        SpannableString spanString = new SpannableString(content);
        Drawable d = ContextCompat.getDrawable(context, R.drawable.paragraph_space);
        float density = context.getResources().getDisplayMetrics().density;
        //int强转部分为：行高 - 行距 + 段距
        d.setBounds(0, 0, 1, (int) ((lineHeight - lineSpacingExtra * density) / 1.2 + (paragraphSpacing - lineSpacingExtra) * density));

        for (int index : nextParagraphBeginIndexes) {
            // \r在String中占一个index
            spanString.setSpan(new ImageSpan(d), index + 1, index + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        tv.setText(spanString);
    }

}
