package com.bcm.messenger.common.ui.emoji;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.InputFilter;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;

import com.bcm.messenger.common.R;
import com.bcm.messenger.common.preferences.TextSecurePreferences;
import com.bcm.messenger.common.provider.AMELogin;
import com.bcm.messenger.common.ui.emoji.EmojiProvider.EmojiDrawable;


public class EmojiEditText extends AppCompatEditText {
    private static final String TAG = EmojiEditText.class.getSimpleName();

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

    public EmojiEditText(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.editTextStyle);
    }

    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        if (!TextSecurePreferences.isSystemEmojiPreferred(AMELogin.INSTANCE.getMajorContext())) {
            setFilters(appendEmojiFilter(this.getFilters()));
        }
    }

    public String getTextTrimmed() {
//        return getText().toString().trim();
        Editable editable = getText();
        if (editable != null) {
            return editable.toString().trim();
        }
        return "";
    }

    public void appendFilter(InputFilter newFilter) {
        InputFilter[] result;
        InputFilter[] originalFilters = getFilters();
        if (originalFilters != null) {
            result = new InputFilter[originalFilters.length + 1];
            System.arraycopy(originalFilters, 0, result, 1, originalFilters.length);
        } else {
            result = new InputFilter[1];
        }
        result[0] = newFilter;
        setFilters(result);
    }

    public void insertEmoji(String emoji) {
        final int start = getSelectionStart();
        final int end = getSelectionEnd();

        getText().replace(Math.min(start, end), Math.max(start, end), emoji);
        setSelection(start + emoji.length());
    }

    @Override
    public void invalidateDrawable(@NonNull Drawable drawable) {
        if (drawable instanceof EmojiDrawable) {
            invalidate();
        } else {
            super.invalidateDrawable(drawable);
        }
    }

    private InputFilter[] appendEmojiFilter(@Nullable InputFilter[] originalFilters) {
        InputFilter[] result;

        if (originalFilters != null) {
            result = new InputFilter[originalFilters.length + 1];
            System.arraycopy(originalFilters, 0, result, 1, originalFilters.length);
        } else {
            result = new InputFilter[1];
        }

        result[0] = new EmojiFilter(this);

        return result;
    }
}