using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public struct BufferedInput
{
    public BufferedInput( float bufferTime )
    {
        _bufferTime = bufferTime;
        _value = false;
        _timeSincePress = Mathf.Infinity;
        _timeSinceRelease = Mathf.Infinity;
    }
    
    private float _bufferTime;
    private bool _value;
    private float _timeSinceRelease;
    private float _timeSincePress;

    public void Set( bool newValue )
    {
        if ( newValue && !_value )
        {
            _timeSincePress = 0f;
        }
        else if ( !newValue && _value )
        {
            _timeSinceRelease = 0f;
        }

        _value = newValue;
    }

    public void Update( float deltaTime )
    {
        _timeSincePress += deltaTime;
        _timeSinceRelease += deltaTime;
    }

    public bool GetValue()
    {
        return _value || _timeSinceRelease <= _bufferTime;
    }

    public bool GetRawValue()
    {
        return _value;
    }

    public bool GetDown( bool consume = true )
    {
        bool value = _timeSincePress <= _bufferTime;
        
        if ( consume && value )
            _timeSincePress = Mathf.Infinity;
        
        return value;
    }

    public bool GetRelease( bool consume = true )
    {
        bool value = _timeSinceRelease <= _bufferTime;
        
        if ( consume && value )
            _timeSinceRelease = Mathf.Infinity;

        return value;
    }
}