package com.adealink.weparty.commonui.text

import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatEditText


class ScrollableEditText @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
) : AppCompatEditText(context, attrs, defStyleAttr) {

    private var lastY = 0f

    init {
        isVerticalScrollBarEnabled = true
        overScrollMode = OVER_SCROLL_ALWAYS
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        // 先让EditText处理自己的事件（包括输入、光标移动等）
        val handled = super.onTouchEvent(event)

        when (event?.actionMasked) {
            MotionEvent.ACTION_DOWN -> {
                lastY = event.getY()
                // 告诉父View不要拦截触摸事件
                parent.requestDisallowInterceptTouchEvent(true)
            }

            MotionEvent.ACTION_MOVE -> {
                val currentY = event.y
                val deltaY: Float = currentY - lastY
                lastY = currentY


                // 检查EditText是否还能继续滚动
                val atTop = !canScrollVertically(-1) // 是否在顶部
                val atBottom = !canScrollVertically(1) // 是否在底部


                // 如果在边界且滑动方向是想要离开EditText，就让父View处理
                if ((atTop && deltaY > 0) || (atBottom && deltaY < 0)) {
                    // 让父View可以拦截事件
                    parent.requestDisallowInterceptTouchEvent(false)
                } else {
                    // 否则不让父View拦截
                    parent.requestDisallowInterceptTouchEvent(true)
                }
            }

            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL ->                 // 恢复默认行为
                parent.requestDisallowInterceptTouchEvent(false)
        }

        return handled
    }

    /**
     * 判断是否可以垂直滚动
     */
    override fun canScrollVertically(direction: Int): Boolean {
        // 使用系统的判断方法
        return computeVerticalScrollRange() > computeVerticalScrollExtent()
    }
}