package com.mylhyl.circledialog;

import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.util.SparseArray;
import android.view.View;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.IdRes;
import androidx.annotation.StringRes;

import com.mylhyl.circledialog.internal.Controller;

/**
 * Created by hupei on 2020/5/22.
 */
public class CircleViewHolder {

    private final View dialogView;
    private final SparseArray<View> views;

    public CircleViewHolder(View dialogView) {
        this.dialogView = dialogView;
        this.views = new SparseArray<>();
    }

    public CircleViewHolder setBackgroundColor(@ColorInt int color) {
        dialogView.setBackgroundColor(color);
        return this;
    }

    public CircleViewHolder setBackgroundRes(@DrawableRes int backgroundRes) {
        dialogView.setBackgroundResource(backgroundRes);
        return this;
    }

    public CircleViewHolder setBackgroundDrawable(Drawable background) {
        if (Controller.SDK_JELLY_BEAN) {
            dialogView.setBackground(background);
        } else {
            dialogView.setBackgroundDrawable(background);
        }
        return this;
    }

    public View getDialogView() {
        return dialogView;
    }

    public CircleViewHolder setText(@IdRes int viewId, CharSequence value) {
        TextView view = findViewById(viewId);
        view.setText(value);
        return this;
    }

    public CircleViewHolder setText(@IdRes int viewId, @StringRes int strId) {
        TextView view = findViewById(viewId);
        view.setText(strId);
        return this;
    }

    public CircleViewHolder setImageResource(@IdRes int viewId, @DrawableRes int imageResId) {
        ImageView view = findViewById(viewId);
        view.setImageResource(imageResId);
        return this;
    }

    public CircleViewHolder setBackgroundColor(@IdRes int viewId, @ColorInt int color) {
        View view = findViewById(viewId);
        view.setBackgroundColor(color);
        return this;
    }

    public CircleViewHolder setBackgroundRes(@IdRes int viewId, @DrawableRes int backgroundRes) {
        View view = findViewById(viewId);
        view.setBackgroundResource(backgroundRes);
        return this;
    }

    public CircleViewHolder setBackgroundDrawable(@IdRes int viewId, Drawable background) {
        View view = findViewById(viewId);
        if (Controller.SDK_JELLY_BEAN) {
            view.setBackground(background);
        } else {
            view.setBackgroundDrawable(background);
        }
        return this;
    }

    public CircleViewHolder setVisibility(@IdRes int viewId, int visibility) {
        View view = findViewById(viewId);
        view.setVisibility(visibility);
        return this;
    }

    public CircleViewHolder setChecked(@IdRes int viewId, boolean checked) {
        View view = findViewById(viewId);
        if (view instanceof Checkable) {
            ((Checkable) view).setChecked(checked);
        }
        return this;
    }

    public CircleViewHolder setEnabled(@IdRes int viewId, boolean enable) {
        View view = findViewById(viewId);
        view.setEnabled(enable);
        return this;
    }

    public CircleViewHolder addTextChangedBeforeListener(@IdRes int viewId, final TextWatcherBefore textWatcherBefore) {
        View view = findViewById(viewId);
        if (view instanceof TextView) {
            ((TextView) view).addTextChangedListener(new android.text.TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    textWatcherBefore.beforeTextChanged(s, start, count, after);
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }

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

    public CircleViewHolder addTextChangedListener(@IdRes int viewId, final TextWatcher textWatcher) {
        View view = findViewById(viewId);
        if (view instanceof TextView) {
            addTextChangedListener(((TextView) view), textWatcher);
        }
        return this;
    }


    public CircleViewHolder addTextChangedListener(TextView textView, final TextWatcher textWatcher) {
        textView.addTextChangedListener(new android.text.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) {
                textWatcher.onTextChanged(s, start, before, count);
            }

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

        return this;
    }

    public CircleViewHolder addTextChangedAfterListener(@IdRes int viewId, final TextWatcherAfter textWatcherAfter) {
        View view = findViewById(viewId);
        if (view instanceof TextView) {
            ((TextView) view).addTextChangedListener(new android.text.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) {
                }

                @Override
                public void afterTextChanged(Editable s) {
                    textWatcherAfter.afterTextChanged(s);
                }
            });
        }
        return this;
    }


    public <T extends View> T findViewById(@IdRes int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = dialogView.findViewById(viewId);
            views.put(viewId, view);
        }
        return (T) view;
    }


    public interface TextWatcherBefore {
        void beforeTextChanged(CharSequence s, int start, int count, int after);
    }

    public interface TextWatcher {
        void onTextChanged(CharSequence s, int start, int before, int count);
    }

    public interface TextWatcherAfter {
        void afterTextChanged(Editable s);
    }
}