package com.atmob.keyboard_android.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.atmob.keyboard_android.R;

/**
 * 裁切背景顶部的布局
 */
public class ClippedLayout extends FrameLayout {
    /**
     * 顶部裁切的高度
     */
    private float topOffset;

    /**
     * 裁切是否开启
     */
    private boolean clipEnable = true;

    /**
     * Debug使用的画笔
     */
    private Paint debugPaint;

    public ClippedLayout(@NonNull Context context) {
        this(context, null);
    }

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

    public ClippedLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setup(context, attrs, defStyleAttr);
    }

    public ClippedLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        setup(context, attrs, defStyleAttr);
    }

    private void setup(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        // 初始化自定义属性
        initAttrs(context, attrs);
        // 初始化debug模式下的画笔
        initDebugPaint();
        // 默认ViewGroup不调用onDraw()方法，设置为false，则调用
        setWillNotDraw(false);
        // 设置禁用硬件加速
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    /**
     * 初始化自定义属性
     */
    private void initAttrs(@NonNull Context context, @Nullable AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ClippedLayout);
        topOffset = typedArray.getDimension(
                R.styleable.ClippedLayout_cl_clip_top_offset,
                0
        );
        clipEnable = typedArray.getBoolean(R.styleable.ClippedLayout_cl_clip_enable, true);
        typedArray.recycle();
    }

    /**
     * 初始化debug模式下的画笔
     */
    private void initDebugPaint() {
        debugPaint = new Paint();
        // 半透明红色
        debugPaint.setColor(Color.parseColor("#66FF0000"));
        debugPaint.setStyle(Paint.Style.FILL);
        debugPaint.setAntiAlias(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 裁切后，让顶部透明区域，不消费点击事件
        if (clipEnable) {
            if (event.getY() < topOffset) {
                return false;
            }
        }
        return super.onTouchEvent(event);
    }

    /**
     * 注意，要重写draw方法，而不是onDraw，ViewGroup的背景是在draw方法中执行的，而View是在onDraw方法
     */
    @Override
    public void draw(@NonNull Canvas canvas) {
        if (clipEnable) {
            // 预览模式：完整绘制背景，红色区域
            if (isInEditMode()) {
                super.draw(canvas);
                canvas.drawRect(0, 0, getWidth(), topOffset, debugPaint);
            } else {
                // 正式环境：应用裁剪
                canvas.save();
                canvas.clipRect(0, topOffset, getWidth(), getHeight());
                super.draw(canvas);
                canvas.restore();
            }
        } else {
            super.draw(canvas);
        }
    }

    /**
     * 动态设置顶部裁切大小
     *
     * @param dpValue 顶部裁切大小，单位为dp
     */
    public void setClipTopOffsetDp(float dpValue) {
        topOffset = TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP,
                dpValue,
                getResources().getDisplayMetrics()
        );
        // 触发重绘
        invalidate();
    }
}