package com.common.commonlib.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import com.common.commonlib.R;
import com.common.commonlib.utils.DisplayUtils;

/**
 * 通用标题栏
 *
 * @author miracle
 * @since 2021/8/2
 */
public class CommonTitleView extends FrameLayout implements View.OnClickListener {
    private Context mContext;
    private ImageView ivLeft;
    private TextView tv_title;
    private ImageView ivRight;
    private TextView tv_edit;
    private int showStyle;

    private static final int STYLE_LEFT = 1;
    private static final int STYLE_LEFT_MIDDLE = 2;
    private static final int STYLE_LEFT_MIDDLE_RIGHT = 3;
    private static final int STYLE_MIDDLE = 4;
    private static final int STYLE_MIDDLE_RIGHT = 5;
    private static final int STYLE_RIGHT = 6;
    private static final int STYLE_EDIT = 7;
    private String title;
    //是否要固定高度的模式，不受match parent\warp content等影响
    private boolean isFixedHeight;
    //设置固定的高度值,默认是48dp
    private int fixedHeight;

    private static final int DEFAULT_HEIGHT = 48;
    private View rlLeftHotZone;
    private View rlRightHotZone;
    private View rlEditZone;
    private Drawable leftDrawable;
    private Drawable rightDrawable;
    private int bgColor;

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

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

    public CommonTitleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        init(attrs);
    }

    private void init(AttributeSet attrs) {
        initAttrs(attrs);
        View inflate = LayoutInflater.from(mContext).inflate(R.layout.common_title_view, this, true);
        View root_view = findViewById(R.id.root_view);
        ivLeft = findViewById(R.id.iv_left);
        ivRight = findViewById(R.id.iv_right);
        tv_title = findViewById(R.id.tv_title);
        rlLeftHotZone = findViewById(R.id.rl_left_hot_zone);
        rlRightHotZone = findViewById(R.id.rl_add_hot_zone);
        tv_edit = findViewById(R.id.tv_edit);
        rlEditZone = findViewById(R.id.rl_edit_hot_zone);
        root_view.setBackgroundColor(bgColor);
        if (leftDrawable != null) {
            ivLeft.setImageDrawable(leftDrawable);
        }
        if (rightDrawable != null) {
            ivRight.setImageDrawable(rightDrawable);
        }
        initStyle();
        setTitle(title);
    }


    private void initAttrs(AttributeSet attrs) {
        TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.CommonTitleView);
        showStyle = typedArray.getInt(R.styleable.CommonTitleView_show_style, STYLE_MIDDLE);
        title = typedArray.getString(R.styleable.CommonTitleView_title);
        isFixedHeight = typedArray.getBoolean(R.styleable.CommonTitleView_is_fixed_height, true);
        fixedHeight = typedArray.getInteger(R.styleable.CommonTitleView_fixed_height, DisplayUtils.INSTANCE.dp2px(mContext, DEFAULT_HEIGHT));
        leftDrawable = typedArray.getDrawable(R.styleable.CommonTitleView_drawableLeft);
        rightDrawable = typedArray.getDrawable(R.styleable.CommonTitleView_drawableRight);
        bgColor = typedArray.getColor(R.styleable.CommonTitleView_bgColor, getResources().getColor(R.color.title_bar_bg_color));

        typedArray.recycle();


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (isFixedHeight) {
            int makeMeasureSpec = MeasureSpec.makeMeasureSpec(fixedHeight, MeasureSpec.EXACTLY);
            super.onMeasure(widthMeasureSpec, makeMeasureSpec);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    private void initStyle() {
        switch (showStyle) {
            case STYLE_LEFT:
                ivLeft.setVisibility(VISIBLE);
                rlLeftHotZone.setOnClickListener(this);
                tv_title.setVisibility(INVISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(INVISIBLE);
                rlRightHotZone.setOnClickListener(null);
                break;
            case STYLE_LEFT_MIDDLE:
                ivLeft.setVisibility(VISIBLE);
                rlLeftHotZone.setOnClickListener(this);
                tv_title.setVisibility(VISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(INVISIBLE);
                rlRightHotZone.setOnClickListener(null);
                break;
            case STYLE_MIDDLE_RIGHT:
                ivLeft.setVisibility(INVISIBLE);
                rlLeftHotZone.setOnClickListener(null);
                tv_title.setVisibility(VISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(VISIBLE);
                rlRightHotZone.setOnClickListener(this);
                break;
            case STYLE_RIGHT:
                ivLeft.setVisibility(INVISIBLE);
                rlLeftHotZone.setOnClickListener(null);
                tv_title.setVisibility(INVISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(VISIBLE);
                rlRightHotZone.setOnClickListener(this);
                break;
            case STYLE_LEFT_MIDDLE_RIGHT:
                ivLeft.setVisibility(VISIBLE);
                rlLeftHotZone.setOnClickListener(this);
                tv_title.setVisibility(VISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(VISIBLE);
                rlRightHotZone.setOnClickListener(this);
                break;
            case STYLE_EDIT:
                ivLeft.setVisibility(VISIBLE);
                rlLeftHotZone.setOnClickListener(this);
                tv_title.setVisibility(VISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(GONE);
                rlRightHotZone.setVisibility(GONE);
                rlRightHotZone.setOnClickListener(null);
                tv_edit.setVisibility(VISIBLE);
                rlEditZone.setVisibility(VISIBLE);
                rlEditZone.setOnClickListener(this);
                break;
            case STYLE_MIDDLE:
            default:
                ivLeft.setVisibility(INVISIBLE);
                rlLeftHotZone.setOnClickListener(null);
                tv_title.setVisibility(VISIBLE);
                tv_title.setText("");
                ivRight.setVisibility(INVISIBLE);
                rlRightHotZone.setOnClickListener(null);
                break;
        }
    }

    public void setTitle(String title) {
        this.title = title;
        tv_title.setText(title);
    }


    @Override
    public void onClick(View v) {
        int viewId = v.getId();
        if (viewId == R.id.rl_left_hot_zone) {
            if (leftIconListener != null) {
                leftIconListener.onClick();
            }
        } else if (viewId == R.id.rl_add_hot_zone) {
            if (rightIconListener != null) {
                rightIconListener.onClick();
            }
        } else if (viewId == R.id.rl_edit_hot_zone) {
            if (editListener != null) {
                editListener.onClick();
            }
        }
    }

    public interface LeftIconListener {
        void onClick();
    }

    private LeftIconListener leftIconListener;

    public void setLeftIconListener(LeftIconListener leftIconListener) {
        this.leftIconListener = leftIconListener;
    }

    public interface RightIconListener {
        void onClick();
    }

    private RightIconListener rightIconListener;

    public void setRightIconListener(RightIconListener rightIconListener) {
        this.rightIconListener = rightIconListener;
    }

    public interface EditListener {
        void onClick();
    }

    private EditListener editListener;

    public void setEditListener(EditListener editListener) {
        this.editListener = editListener;
    }

    public int getEditState() {
        if (tv_edit.getText().equals(mContext.getResources().getString(R.string.edit))) {
            return 0;
        } else if (tv_edit.getText().equals(mContext.getResources().getString(R.string.save))) {
            return 1;
        } else {
            return -1;
        }
    }

    public void setEditText(int state) {
        if (state == 0) {
            tv_edit.setText(mContext.getResources().getString(R.string.edit));
        } else if (state == 1) {
            tv_edit.setText(mContext.getResources().getString(R.string.save));
        } else {
            tv_edit.setText("");
        }
    }
}
