package com.michaelflisar.gdprdialog;

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatDialog;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.fragment.app.DialogFragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.michaelflisar.gdprdialog.helper.GDPRViewManager;

public class GDPRDialog extends AppCompatDialogFragment
{
    public static String ARG_PARENT_MUST_IMPLEMENT_CALLBACK = "ARG_PARENT_MUST_IMPLEMENT_CALLBACK";

    private boolean mForceActivityToImplementCallback;
    private GDPRViewManager mViewManager;

    public static GDPRDialog newInstance(GDPRSetup setup, GDPRLocation location) {
        return newInstance(setup, location, true);
    }

    public static GDPRDialog newInstance(GDPRSetup setup, GDPRLocation location, boolean forceActivityToImplementCallback) {
        GDPRDialog dlg = new GDPRDialog();
        Bundle args = GDPRViewManager.createBundle(setup, location);
        args.putBoolean(ARG_PARENT_MUST_IMPLEMENT_CALLBACK, forceActivityToImplementCallback);
        dlg.setArguments(args);
        return dlg;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setCancelable(false);
        mViewManager.setCallback(getActivity(), mForceActivityToImplementCallback);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mViewManager = new GDPRViewManager(getArguments(), savedInstanceState);
        mForceActivityToImplementCallback = getArguments().getBoolean(ARG_PARENT_MUST_IMPLEMENT_CALLBACK);
        GDPRCustomTexts customTexts = mViewManager.getSetup().getCustomTexts();
        if (customTexts.hasTitle() && customTexts.getTitle(getContext()).isEmpty()) {
            setStyle(DialogFragment.STYLE_NO_TITLE, mViewManager.getSetup().customDialogTheme());
        } else {
            setStyle(DialogFragment.STYLE_NORMAL, mViewManager.getSetup().customDialogTheme());
        }
    }

    @Override
    public void onDismiss(DialogInterface dialogInterface) {
        if (mViewManager.handleBackPress()) {
            return;
        }
        if (mViewManager.getSetup().forceSelection()) {
            return;
        }
        onSaveConsentAndCloseDialog();
        super.onDismiss(dialogInterface);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mViewManager.save(outState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = initView(inflater, container);
        GDPRCustomTexts customTexts = mViewManager.getSetup().getCustomTexts();
        if (customTexts.hasTitle())
            getDialog().setTitle(customTexts.getTitle(getContext()));
        else
            getDialog().setTitle(R.string.gdpr_dialog_title);
        return view;
    }

    @Override
    public void onDestroy() {
        mViewManager.reset();
        super.onDestroy();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        if (mViewManager.shouldUseBottomSheet()) {
            BottomSheetDialog dlg = new BottomSheetDialog(getContext(), getTheme()){
                @Override
                public void onBackPressed() {
                    if (mViewManager.handleBackPress()) {
                        return;
                    }
                    if (!mViewManager.getSetup().forceSelection()) {
                        dismiss();
                    }
                }
            };
            dlg.setOnShowListener(dialog -> {
                BottomSheetDialog d = (BottomSheetDialog) dialog;
                FrameLayout bottomSheet = d.findViewById(R.id.design_bottom_sheet);
                BottomSheetBehavior behaviour = BottomSheetBehavior.from(bottomSheet);
                // fully expand sheet and disable collapse state
                behaviour.setState(BottomSheetBehavior.STATE_EXPANDED);
                if (mViewManager.getSetup().forceSelection()) {
                    behaviour.setPeekHeight(bottomSheet.getMeasuredHeight());
                } else {
                    behaviour.setPeekHeight(0);
                    behaviour.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                        @Override
                        public void onStateChanged(@NonNull View bottomSheet, int newState) {
                            if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
                                while (mViewManager.getCurrentStep() != 0) {
                                    mViewManager.handleBackPress();
                                }
                                dismiss();
                            }
                        }

                        @Override
                        public void onSlide(@NonNull View bottomSheet, float slideOffset) {

                        }
                    });
                }
            });
            return dlg;
        } else {
            return new AppCompatDialog(getContext(), getTheme()) {
                @Override
                public void onBackPressed() {
                    if (mViewManager.handleBackPress()) {
                        return;
                    }
                    if (!mViewManager.getSetup().forceSelection()) {
                        dismiss();
                    }
                }
            };
        }
    }

    private View initView(LayoutInflater inflater, ViewGroup container) {
        View view = inflater.inflate(R.layout.gdpr_dialog, container, false);
        mViewManager.init(getActivity(), view, () -> onSaveConsentAndCloseDialog());
        return view;
    }

    private void onSaveConsentAndCloseDialog() {
        if (mViewManager.shouldCloseApp()) {
            if (getActivity() != null) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    getActivity().finishAndRemoveTask();
                } else {
                    ActivityCompat.finishAffinity(getActivity());
                }
            }
        } else {
            dismiss();
        }
        mViewManager.reset();
    }
}