using System;
using System.Collections;
using System.Collections.Generic;
using Fort23.UTool;
using UnityEngine;
using UnityEngine.EventSystems;
public class LongPressBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler,
    IPointerClickHandler
{
    private float _time;
    public float startTime = 0.5f;
    public float intervalTime = 0.05f;
    public Action onClick;
    /// 
    /// 连按
    /// 
    public Action longPress;
    /// 
    /// 长按结束
    /// 
    public Action longPressEnd;
    /// 
    /// 是否按下状态
    /// 
    [HideInInspector] public bool isPressd;
    private bool _isTriggerLongPress;
    /// 
    /// 是否触发了长按
    /// 
    public bool isTriggerLongPress => _isTriggerLongPress;
    void OnPress(bool pressed)
    {
        if (pressed) // 按下
        {
            isPressd = true;
        }
        else // 松开或离开
        {
            if (isPressd)
            {
                if (_isTriggerLongPress) // 触发了长按且不是离开,执行 longPressEnd
                {
                    longPressEnd?.Invoke();
                    _isTriggerLongPress = false;
                }
            }
            isPressd = false;
            _time = 0;
        }
    }
    private void Update()
    {
        if (isPressd && !_isTriggerLongPress)
        {
            _time += Time.deltaTime;
            if (_time >= startTime)
            {
                _isTriggerLongPress = true;
                _time -= intervalTime;
                longPress?.Invoke();
            }
        }
        else if (isPressd && _isTriggerLongPress)
        {
            _time += Time.deltaTime;
            if (_time >= intervalTime)
            {
                _time -= intervalTime;
                longPress?.Invoke();
            }
        }
    }
    /// 
    /// 终止
    /// 
    public void Terminated()
    {
        if (isPressd)
        {
            isPressd = false;
            if (_isTriggerLongPress)
            {
                longPressEnd?.Invoke();
            }
            _isTriggerLongPress = false;
            _time = 0;
        }
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        OnPress(true);
    }
    public void OnPointerUp(PointerEventData eventData)
    {
        OnPress(false);
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        OnPress(false);
    }
    public void OnPointerClick(PointerEventData eventData)
    {
        if (!_isTriggerLongPress) // 只有未触发长按时才触发点击
        {
            onClick?.Invoke();
        }
        isPressd = false;
    }
}