package com.holidaycheck.permissify;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.util.Log;

public class PermissionRationaleDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {

    private static final String TAG = "Permissify";
    private static final String ARG_PENDING_CALL = "pendingCall";

    private PermissifyManager.PendingPermissionCall pendingCall;

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        pendingCall = (PermissifyManager.PendingPermissionCall) getArguments().getSerializable(ARG_PENDING_CALL);

        return PermissifyConfig.get()
            .getRationaleDialogFactory()
            .createDialog(getContext(), getDialogMessage(pendingCall.options), this);
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        PermissifyActivity activity = (PermissifyActivity) getActivity();

        activity.getPermissifyManager().getLifecycleHandler().onRationaleDialogConfirm(pendingCall);
    }

    public static void showDialog(FragmentManager fragmentManager, PermissifyManager.PendingPermissionCall pendingPermissionCall) {
        if (fragmentManager.findFragmentByTag(TAG) != null) {
            Log.w(TAG, "Dialog is already on screen - rejecting show command");
            return;
        }

        Bundle args = new Bundle();
        args.putSerializable(ARG_PENDING_CALL, pendingPermissionCall);

        PermissionRationaleDialogFragment dialog = new PermissionRationaleDialogFragment();
        dialog.setArguments(args);
        dialog.setCancelable(false);

        fragmentManager
            .beginTransaction()
            .add(dialog, TAG)
            .commitAllowingStateLoss();
    }

    private String getDialogMessage(PermissionCallOptions callOptions) {
        return callOptions.getRationaleDialogMsg() != null ? callOptions.getRationaleDialogMsg() : getString(callOptions.getRationaleDialogMsgRes());
    }

    public static PermissifyConfig.AlertDialogFactory getDefaultDialogFactory() {
        return new PermissifyConfig.AlertDialogFactory() {
            @Override
            public AlertDialog createDialog(Context context, String dialogMsg, DialogInterface.OnClickListener onClickListener) {
                return new AlertDialog.Builder(context)
                    .setTitle(R.string.permissify_permission_rationale_title)
                    .setMessage(dialogMsg)
                    .setPositiveButton(android.R.string.ok, onClickListener)
                    .create();
            }
        };
    }
}