package com.mm.android.deviceaddmodule.p_wiredwireless;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;

import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.base.BaseDevAddFragment;
import com.mm.android.deviceaddmodule.contract.WifiPwdConstract;
import com.mm.android.deviceaddmodule.helper.DeviceAddHelper;
import com.mm.android.deviceaddmodule.helper.PageNavigationHelper;
import com.mm.android.deviceaddmodule.helper.Utils4AddDevice;
import com.mm.android.deviceaddmodule.mobilecommon.AppConsume.ProviderManager;
import com.mm.android.deviceaddmodule.mobilecommon.base.DefaultPermissionListener;
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
import com.mm.android.deviceaddmodule.mobilecommon.common.PermissionHelper;
import com.mm.android.deviceaddmodule.mobilecommon.dialog.LCAlertDialog;
import com.mm.android.deviceaddmodule.mobilecommon.entity.deviceadd.DeviceAddInfo;
import com.mm.android.deviceaddmodule.mobilecommon.location.FuseLocationUtil;
import com.mm.android.deviceaddmodule.mobilecommon.utils.CommonHelper;
import com.mm.android.deviceaddmodule.mobilecommon.utils.UIHelper;
import com.mm.android.deviceaddmodule.mobilecommon.widget.ClearPasswordEditText;
import com.mm.android.deviceaddmodule.presenter.WifiPwdPresenter;

/**
 * 输入wifi密码页
 */
public class WifiPwdFragment extends BaseDevAddFragment implements WifiPwdConstract.View, View.OnClickListener {
    private ImageView mWifiIv;
    private TextView mNextTv;
    private TextView mWifiSsidTv;
    private ClearPasswordEditText mWifiPwdEt;
    private TextView m5GWifiTipTv;
    private TextView mSaveWifiPwdChebox;
    WifiPwdConstract.Presenter mPresenter;
    private ImageView mSwitchWifiIv;

    public static WifiPwdFragment newInstance() {
        WifiPwdFragment fragment = new WifiPwdFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    private final TextWatcher mTextWatcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
            mWifiPwdEt.removeTextChangedListener(mTextWatcher);
            String str = Utils4AddDevice.wifiPwdFilter(s.toString());
            if (!str.equals(s.toString())) {
                mWifiPwdEt.setText(str);
                mWifiPwdEt.setSelection(str.length());
            }
            mWifiPwdEt.addTextChangedListener(mTextWatcher);
            setConnectButtonState();
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        }

        @Override
        public void afterTextChanged(Editable arg0) {
        }
    };


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_wifi_pwd, container, false);
    }

    @Override
    public void onResume() {
        super.onResume();
        mWifiSsidTv.setText(mPresenter.getCurWifiName());
        setWifiPwd();

    }

    @Override
    public void onPause() {
        super.onPause();
        mPresenter.updateWifiCache();//更新wifi信息到缓存
    }

    protected void initView(View view) {
        mWifiIv = view.findViewById(R.id.iv_wifi);
        mSwitchWifiIv = view.findViewById(R.id.switch_wifi);
        mNextTv = view.findViewById(R.id.next);
        m5GWifiTipTv = view.findViewById(R.id.tv_5g_tip);
        mWifiSsidTv = view.findViewById(R.id.ssid);
        mWifiPwdEt = view.findViewById(R.id.wifi_pwd);
        mWifiPwdEt.openEyeMode(ProviderManager.getAppProvider().getAppType() != LCConfiguration.APP_LECHANGE_OVERSEA);
        mWifiPwdEt.addTextChangedListener(mTextWatcher);
        mNextTv.setOnClickListener(this);
        mSaveWifiPwdChebox = view.findViewById(R.id.wifi_pwd_check);
        m5GWifiTipTv.setOnClickListener(this);
        mSaveWifiPwdChebox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view.setSelected(!view.isSelected());
            }
        });

        mSwitchWifiIv.setOnClickListener(this);
    }

    protected void initData() {
        mPresenter = new WifiPwdPresenter(this);
        String configMode = mPresenter.getConfigMode();
        if (DeviceAddInfo.ConfigMode.LAN.name().equalsIgnoreCase(configMode)
                || !configMode.contains(DeviceAddInfo.ConfigMode.LAN.name()))
            DeviceAddHelper.updateTile(DeviceAddHelper.TitleMode.MORE);
        else {
            DeviceAddHelper.updateTile(DeviceAddHelper.TitleMode.MORE2);
        }
        check5GWifiTip();
        setConnectButtonState();
        setSSIDTextView(true);
    }

    private void setSSIDTextView(boolean needCheckPermission) {
        if (null != getActivity() && !Utils4AddDevice.isWifi(getActivity())) {
            mWifiSsidTv.setText("");
            mWifiPwdEt.setText("");
            showToastInfo(R.string.add_device_con_wifi);
            return;
        }

        String curWifiName = mPresenter.getCurWifiName();
        if (TextUtils.isEmpty(curWifiName) && needCheckPermission) {
            dealWithUnknownSsid();
            return;
        }

        mWifiSsidTv.setText(curWifiName);
        setWifiPwd();
    }

    private void dealWithUnknownSsid() {
        if (getActivity() == null) return;
        //1.判断是否该应用有地理位置权限  2.判断是否开启定位服务
        PermissionHelper permissionHelper = new PermissionHelper(this);
        if (permissionHelper.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) {
            verifyLocationService();
        } else {
            permissionHelper.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, new DefaultPermissionListener() {
                @Override
                public void onGranted() {
                    verifyLocationService();
                }

                @Override
                public boolean onDenied() {
                    return true;
                }
            });
        }


    }

    private void verifyLocationService() {
        if (FuseLocationUtil.isGpsEnabled(getActivity())) {
            mWifiSsidTv.setText(mPresenter.getCurWifiName());
            setWifiPwd();
        } else {
            showOpenLocationServiceDialog();
        }

    }

    private void showOpenLocationServiceDialog() {
        LCAlertDialog dialog = new LCAlertDialog.Builder(getActivity())
                .setTitle(R.string.add_device_goto_open_location_service)
                .setCancelButton(R.string.common_cancel, null)
                .setConfirmButton(R.string.common_confirm, new LCAlertDialog.OnClickListener() {
                    @Override
                    public void onClick(LCAlertDialog dialog, int which, boolean isChecked) {
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        startActivity(intent);
                        dialog.dismiss();
                    }
                }).create();
        dialog.show(getFragmentManager(), null);
    }

    private void setWifiPwd() {
        String wifiPwd = mPresenter.getSavedWifiPwd();
        boolean wifiCheckBoxStatus = mPresenter.getSavedWifiCheckBoxStatus();

        if (!TextUtils.isEmpty(wifiPwd)) {
            mWifiPwdEt.setText(wifiPwd);
            mSaveWifiPwdChebox.setSelected(wifiCheckBoxStatus);
        } else {
            mWifiPwdEt.setText("");
            mSaveWifiPwdChebox.setSelected(wifiCheckBoxStatus);
        }
    }

    private void check5GWifiTip() {
        if (!mPresenter.isDevSupport5G()) {
            m5GWifiTipTv.setVisibility(View.VISIBLE);
            mWifiIv.setImageResource(R.drawable.adddevice_icon_wifipassword_nosupport5g_layer);
        } else {
            m5GWifiTipTv.setVisibility(View.GONE);
            mWifiIv.setImageResource(R.drawable.adddevice_icon_wifipassword);
        }
    }

    private void setConnectButtonState() {
        if (null != getActivity() && !Utils4AddDevice.isWifi(getActivity())) {
            UIHelper.setEnabledEX(false, mNextTv);
        } else {
            UIHelper.setEnabledEX(true, mNextTv);
        }
    }

    @Override
    protected IntentFilter createBroadCast() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(LCConfiguration.CONNECTIVITY_CHAGET_ACTION);
        return intentFilter;
    }

    @Override
    protected void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (LCConfiguration.CONNECTIVITY_CHAGET_ACTION.equals(intent.getAction())) {
            setConnectButtonState();
            setSSIDTextView(false);
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (null != getActivity() && mWifiPwdEt != null) {
            InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(
                    Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(mWifiPwdEt.getWindowToken(), 0);

        }
        super.onDestroyView();
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (getActivity() == null) return;
        if (R.id.next == id) {
            if (!Utils4AddDevice.isWifi(getActivity())) {
                toastInCenter(R.string.add_device_con_wifi);
                return;
            }

            if (TextUtils.isEmpty(mWifiSsidTv.getText().toString())) {
                toast(R.string.mobile_common_permission_explain_access_location_usage);
                return;
            }

            InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(
                    Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(mWifiPwdEt.getWindowToken(), 0);

            PageNavigationHelper.gotoLightTipPage(this);
        } else if (R.id.tv_5g_tip == id) {
            PageNavigationHelper.gotoErrorTipPage(this, DeviceAddHelper.ErrorCode.COMMON_ERROR_NOT_SUPPORT_5G);
        } else if (R.id.switch_wifi == id) {
            CommonHelper.gotoWifiSetting(getActivity());
        }
    }

    @Override
    public String getWifiPwd() {
        return mWifiPwdEt.getText().toString();
    }

    @Override
    public boolean isSavePwdChecked() {
        return mSaveWifiPwdChebox.isSelected();
    }

}