package com.texasgamer.zephyr.fragment;

import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.textfield.TextInputEditText;
import com.texasgamer.zephyr.R;
import com.texasgamer.zephyr.ZephyrApplication;
import com.texasgamer.zephyr.service.QuickSettingService;
import com.texasgamer.zephyr.util.NetworkUtils;
import com.texasgamer.zephyr.util.preference.IPreferenceManager;
import com.texasgamer.zephyr.util.preference.PreferenceKeys;

import javax.inject.Inject;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnTextChanged;

/**
 * Join code fragment.
 */
public class JoinCodeFragment extends RoundedBottomSheetDialogFragment {

    @BindView(R.id.join_code_edit_text)
    TextInputEditText mJoinCodeTextEdit;
    @BindView(R.id.join_code_invalid)
    TextView joinCodeInvalidText;

    @Inject
    IPreferenceManager preferenceManager;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_join_code, container, false);
        ButterKnife.bind(this, root);
        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ZephyrApplication.getApplicationComponent().inject(this);

        Window window = getDialog().getWindow();
        if (window != null) {
            mJoinCodeTextEdit.requestFocus();
            window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        }

        mJoinCodeTextEdit.setOnKeyListener((v, keyCode, keyEvent) -> {
            if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                Editable joinCodeEditable = mJoinCodeTextEdit.getText();

                if (joinCodeEditable != null) {
                    String joinCode = joinCodeEditable.toString();
                    if (joinCode.trim().isEmpty() || !NetworkUtils.isValidJoinCode(joinCode)) {
                        return true;
                    }

                    preferenceManager.putString(PreferenceKeys.PREF_JOIN_CODE, mJoinCodeTextEdit.getText().toString());
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        QuickSettingService.updateQuickSettingTile(getContext());
                    }
                }

                dismiss();

                return true;
            }
            return false;
        });
    }

    @OnTextChanged(R.id.join_code_edit_text)
    void onJoinCodeChanged(CharSequence text) {
        String joinCode = text.toString();
        if (!joinCode.isEmpty() && !NetworkUtils.isValidJoinCode(joinCode)) {
            joinCodeInvalidText.setVisibility(View.VISIBLE);
        } else {
            joinCodeInvalidText.setVisibility(View.INVISIBLE);
        }
    }

    @Override
    protected int getInitialBottomSheetState() {
        return BottomSheetBehavior.STATE_EXPANDED;
    }

    @Override
    protected boolean shouldSkipCollapsedState() {
        return true;
    }
}