package it.integry.integrywmsnative.view.dialogs;

import android.app.Dialog;
import android.content.Context;

import android.content.DialogInterface;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import com.google.android.material.textfield.TextInputLayout;

import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.MtbDepoPosizione;
import it.integry.integrywmsnative.core.utility.UtilityFocus;
import it.integry.integrywmsnative.core.utility.UtilityPosizione;

public class DialogAskLivelloPosizione {


    private Context mContext;
    private MtbDepoPosizione mtbDepoPosizione;

    private Dialog mAlert;

    private RunnableArgs<MtbDepoPosizione> onComplete;
    private RunnableArgs<Exception> onFailed;

    private TextInputLayout livelloTextInputLayout;

    private boolean completedFLow = false;

    public static void make(Context context, MtbDepoPosizione mtbDepoPosizione, boolean canAbort, RunnableArgs<MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
        new DialogAskLivelloPosizione(context, mtbDepoPosizione, canAbort, onComplete, onFailed).mAlert.show();
    }



    public DialogAskLivelloPosizione(Context context, MtbDepoPosizione mtbDepoPosizione, boolean canAbort, RunnableArgs<MtbDepoPosizione> onComplete, RunnableArgs<Exception> onFailed) {
        mContext = context;
        this.mtbDepoPosizione = mtbDepoPosizione;
        this.onComplete = onComplete;
        this.onFailed = onFailed;

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View currentView = inflater.inflate(R.layout.dialog_ask_livello_of_position, null, false);

        mAlert = new Dialog(mContext);
        mAlert.setContentView(currentView);
        mAlert.setCanceledOnTouchOutside(false);

        mAlert.setOnDismissListener(dialog -> {
            if(!completedFLow) onComplete.run(null);
        });

        mAlert.setOnShowListener(dialog -> {

            if(!canAbort) currentView.findViewById(R.id.button_abort).setVisibility(View.GONE);


            currentView.findViewById(R.id.button_confirm).setOnClickListener(v -> {
                String levelNumber = ((TextView)currentView.findViewById(R.id.level_number)).getText().toString();
                onLevelConfirm(levelNumber);
            });

            currentView.findViewById(R.id.button_abort).setOnClickListener(v -> {
                onLevelAbort();
            });

            livelloTextInputLayout = currentView.findViewById(R.id.level_number_layout);


            UtilityFocus.focusTextBox(mContext, livelloTextInputLayout.getEditText());
            livelloTextInputLayout.getEditText().addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    if(livelloTextInputLayout.getEditText().getText() != null) {
                        validateLevel(livelloTextInputLayout.getEditText().getText().toString());
                    } else resetLevelError();
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });

        });


    }


    private void onLevelConfirm(String levelString) {

        String newPosizione = mtbDepoPosizione.getPosizione().substring(0, mtbDepoPosizione.getPosizione().length()-1);
        newPosizione += levelString;

        MtbDepoPosizione foundPosizione = UtilityPosizione.getFromCache(newPosizione);

        if(foundPosizione != null) {
            resetLevelError();

            completedFLow = true;
            onComplete.run(foundPosizione);
            mAlert.dismiss();


        } else {
            setLevelError(mContext.getResources().getString(R.string.not_valid));
        }
    }


    private void validateLevel(String levelString) {
        String newPosizione = mtbDepoPosizione.getPosizione().substring(0, mtbDepoPosizione.getPosizione().length()-1);
        newPosizione += levelString;

        if(UtilityPosizione.getFromCache(newPosizione) != null) {
            resetLevelError();
        } else setLevelError(mContext.getResources().getString(R.string.not_valid));
    }

    private void setLevelError(String message){
        livelloTextInputLayout.setErrorEnabled(true);
        livelloTextInputLayout.setError(message);
    }

    private void resetLevelError() {
        livelloTextInputLayout.setError(null);
    }


    private void onLevelAbort() {
        completedFLow = true;
        onComplete.run(null);
        mAlert.dismiss();
    }


}


