package com.mm.android.deviceaddmodule.mobilecommon.widget;

import android.content.Context;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.mm.android.deviceaddmodule.R;
import com.mm.android.deviceaddmodule.mobilecommon.utils.LogUtil;

/**
 * 通用搜索框
 */

public class CustomSearchView extends RelativeLayout implements View.OnClickListener,
        ClearEditText.IFocusChangeListener, ClearEditText.ITextChangeListener,
        TextView.OnEditorActionListener {
    private ClearEditText mSearchInput;
    private TextView mCancelTv;
    private InputMethodManager mInputMethodManager;
    private IOnTextChangeListener mTextChangeListener;
    private IOnFocusChangeListener mFocusChangeListener;

    public CustomSearchView(Context context) {
        this(context, null);
    }

    public CustomSearchView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public interface IOnFocusChangeListener {
        void onSearchFocusChange(View v, boolean hasFocus);
    }

    public void setOnSearchFocusChangeListener(IOnFocusChangeListener listener) {
        mFocusChangeListener = listener;
    }

    public interface IOnTextChangeListener {
        void onTextChange(View v, CharSequence ch);
    }

    public void setOnTextChangedListener(IOnTextChangeListener listener) {
        mTextChangeListener = listener;
    }

    public CustomSearchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        LayoutInflater.from(context).inflate(R.layout.mobile_common_search_view, this);
        initView();
        initData();
    }

    private void initView() {
        mSearchInput =  findViewById(R.id.common_search_input);
        mCancelTv =  findViewById(R.id.common_search_cancel);

        mCancelTv.setOnClickListener(this);
        mSearchInput.setTextChangeListener(this);
        mSearchInput.setOnClickListener(this);
        mSearchInput.setClearTextFocusChange(this);
        mSearchInput.setOnEditorActionListener(this);
    }

    private void initData() {
        mInputMethodManager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        if (id == R.id.common_search_cancel) {
            mSearchInput.clearFocus();
        } else if (id == R.id.common_search_input) {
            mSearchInput.requestFocus();
        }
    }

    @Override
    public void onClearTextFocusChange(View v, boolean hasFocus) {
        LogUtil.debugLog("33084", " onClearTextFocusChange hasFocus = " + hasFocus);
        if (hasFocus) {
            mCancelTv.setVisibility(View.VISIBLE);
        } else {
            mCancelTv.setVisibility(View.GONE);
            mSearchInput.setText("");
            mInputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }

        if (mFocusChangeListener != null) {
            mFocusChangeListener.onSearchFocusChange(v, hasFocus);
        }
    }

    @Override
    public void afterChanged(EditText v, Editable s) {

    }

    @Override
    public void beforeChanged(EditText v, CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(EditText v, CharSequence text, int start, int lengthBefore, int lengthAfter) {
        LogUtil.debugLog("33084", " onTextChanged");
        if (mTextChangeListener != null) {
            mTextChangeListener.onTextChange(v, text);
        }
    }

    @Override
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent keyEvent) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            if (mInputMethodManager != null) {
                mInputMethodManager.hideSoftInputFromWindow(tv.getWindowToken(), 0);
            }
            return true;
        }
        return false;
    }

    /**
     * 设置提示语
     *
     * @param resId
     */
    public void setSearchTextHint(int resId) {
        mSearchInput.setHint(getResources().getString(resId));
    }

    /**
     * 获取输入框内容
     */
    public String getEditText() {
        return mSearchInput.getText().toString();
    }

    private void onDestroyView() {
        if (mInputMethodManager != null) {
            mInputMethodManager = null;
        }
        if (mTextChangeListener != null) {
            mTextChangeListener = null;
        }
    }
}