package com.vmloft.develop.library.tools.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.support.design.widget.TextInputEditText;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.NumberKeyListener;
import android.text.method.PasswordTransformationMethod;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.vmloft.develop.library.tools.R;
import com.vmloft.develop.library.tools.utils.VMColor;
import com.vmloft.develop.library.tools.utils.VMDimen;
import com.vmloft.develop.library.tools.utils.VMStr;

/**
 * Create by lzan13 on 2019/04/16
 *
 * 自定义编辑框控件
 */
public class VMEditView extends RelativeLayout {

    // 输入框
    private TextInputEditText mInputView;
    // 清空按钮
    private ImageView mClearIcon;
    // 显示隐藏按钮
    private ImageView mEyeIcon;

    // 控件属性
    // 文字
    private int mTextColor;
    private int mTextSize;
    private String mHint;
    private String mLimit;
    // 输入模式
    private int mMode;

    // 是否启用清空图标也眼睛图标
    private boolean mEnableClear;
    private boolean mEnableEye;
    private int mClearRes;
    private int mEyeRes;

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

    public VMEditView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public VMEditView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    /**
     * 初始化方法,获取属性等操作
     */
    private void init(Context context, AttributeSet attrs) {
        LayoutInflater.from(context).inflate(R.layout.vm_widget_edit, this);
        mInputView = findViewById(R.id.vm_edit_input_view);
        mClearIcon = findViewById(R.id.vm_edit_clear_icon);
        mEyeIcon = findViewById(R.id.vm_edit_eye_icon);

        // 定义默认值
        mTextColor = VMColor.byRes(R.color.vm_black_87);
        mTextSize = (int) VMDimen.sp2px(14);
        mHint = "";
        mLimit = "";
        mMode = Mode.TEXT;
        mEnableClear = true;
        mEnableEye = false;
        mClearRes = R.drawable.vm_ic_close;
        mEyeRes = R.drawable.vm_ic_eye_off;

        // 获取控件的属性值
        handleAttrs(context, attrs);

        initEditView();
    }

    /**
     * 获取资源属性
     *
     * @param context
     * @param attrs
     */
    private void handleAttrs(Context context, AttributeSet attrs) {
        if (attrs == null) {
            return;
        }
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.VMEditView);
        // 获取自定义属性值,如果没有设置就是默认值
        mTextColor = array.getColor(R.styleable.VMEditView_vm_edit_text_color, mTextColor);
        mTextSize = array.getDimensionPixelOffset(R.styleable.VMEditView_vm_edit_text_size, mTextSize);

        mHint = array.getString(R.styleable.VMEditView_vm_edit_hint);
        mLimit = array.getString(R.styleable.VMEditView_vm_edit_limit);

        mMode = array.getInt(R.styleable.VMEditView_vm_edit_mode, mMode);

        mEnableClear = array.getBoolean(R.styleable.VMEditView_vm_enable_clear, mEnableClear);
        mEnableEye = array.getBoolean(R.styleable.VMEditView_vm_enable_eye, mEnableEye);
        mClearRes = array.getResourceId(R.styleable.VMEditView_vm_edit_clear_res, mClearRes);
        mEyeRes = array.getResourceId(R.styleable.VMEditView_vm_edit_eye_res, mEyeRes);

        // 回收资源
        array.recycle();
    }

    /**
     * 初始化 EditView 控件
     */
    private void initEditView() {
        mInputView.setTextColor(mTextColor);
        mInputView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
        mInputView.setHint(mHint);
        // 设置输入模式
        int inputMode;
        switch (mMode) {
            case Mode.NUMBER:
                inputMode = InputType.TYPE_CLASS_NUMBER;
                break;
            case Mode.PHONE:
                inputMode = InputType.TYPE_CLASS_PHONE;
                break;
            case Mode.EMAIL:
                inputMode = InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
                break;
            case Mode.ACCOUNT:
                inputMode = InputType.TYPE_CLASS_TEXT;
                mLimit = VMStr.isEmpty(mLimit) ? VMStr.byRes(R.string.vm_edit_limit_account) : mLimit;
                break;
            case Mode.TEXT:
                inputMode = InputType.TYPE_CLASS_TEXT;
                break;
            case Mode.PASSWORD:
                mEyeIcon.setVisibility(VISIBLE);
                mInputView.setTransformationMethod(PasswordTransformationMethod.getInstance());
                inputMode = InputType.TYPE_TEXT_VARIATION_PASSWORD;
                break;
            default:
                inputMode = InputType.TYPE_CLASS_TEXT;
                break;
        }
        mInputView.setInputType(inputMode);
        if (!VMStr.isEmpty(mLimit)) {
            // 设置字符过滤功能
            NumberKeyListener keyListener = new NumberKeyListener() {
                public int getInputType() {
                    return InputType.TYPE_CLASS_TEXT;
                }

                protected char[] getAcceptedChars() {
                    return mLimit.toCharArray();
                }
            };
            mInputView.setKeyListener(keyListener);
        }
        // 设置图标
        mClearIcon.setImageResource(mClearRes);
        mEyeIcon.setImageResource(mEyeRes);

        mClearIcon.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mInputView.setText("");
            }
        });
        mEyeIcon.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mEyeIcon.isSelected()) {
                    // 隐藏密码
                    mInputView.setTransformationMethod(PasswordTransformationMethod.getInstance());
                    mEyeIcon.setImageResource(R.drawable.vm_ic_eye_off);
                    mEyeIcon.setSelected(false);
                } else {
                    // 显示密码
                    mInputView.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                    mEyeIcon.setImageResource(R.drawable.vm_ic_eye_on);
                    mEyeIcon.setSelected(true);
                }
            }
        });

        mInputView.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 (VMStr.isEmpty(s)) {
                    mClearIcon.setVisibility(GONE);
                } else {
                    if (mEnableClear) {
                        mClearIcon.setVisibility(VISIBLE);
                    }
                }
            }

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

    /**
     * 获取输入内容
     */
    public String getText() {
        return mInputView.getText().toString().trim();
    }

    /**
     * 设置输入内容
     */
    public void setText(String text) {
        mInputView.setText(text);
    }

    /**
     * 设置输入限制
     */
    public void setLimit(String limit) {
        mLimit = limit;
        if (!VMStr.isEmpty(mLimit)) {
            mInputView.setKeyListener(DigitsKeyListener.getInstance(mLimit));
        }
    }

    /**
     * 添加文本变化监听
     */
    public void addTextChangedListener(TextWatcher watcher) {
        mInputView.addTextChangedListener(watcher);
    }

    /**
     * 输入模式
     */
    public interface Mode {
        int NUMBER = 0;
        int PHONE = 1;
        int EMAIL = 2;
        int ACCOUNT = 3;
        int TEXT = 4;
        int PASSWORD = 5;
    }
}