using UnityEngine;
/// 
/// Interactable represents the base class of all interactable objects in the scene
/// 
public abstract class Interactable : MonoBehaviour
{
    
    /// 
    /// InteractinType is the type of an interaction. So the "PlayerInteractin.cs" can handle the interaction input.
    /// 
    /// 
    /// - Click: A single click which triggers the Interact Method///
- Hold: Holding a until time is reached an then triggers the Interact Method(Time resets if the Player stops holding)///
- Harvest: Same as Hold but time does not reset. So the time progress gets saved. Used for class "Harvastable.cs"///
/// 
    public enum InteractionType {
        Click,
        Hold,
        Harvest
    }
    [Header("Interactable Properties")]
    public InteractionType interactionType;
    [Tooltip("The time the player has to hold until the Interact method triggers.")]
    [Range(0.1f, 99.9f)]
    [SerializeField]
    float holdDuration = 1f; // The time the player has to hold until the Interact method triggers
    float holdTime; // The time for how long the player has already pressed
    // Used to measure the distance between the player and the object
    Transform playerTransform;
    Transform interactableTransform;
    [Tooltip("The range in which the player can interact with an object")]
    [Range(1f, 50f)]
    [SerializeField]
    float radius = 3f;
    #region GETTER
    /// 
    /// GetDescription gets the description of an interactable object.
    ///
    /// - The description is usally used to display a help text for the player (e.g. "Turn Lights On")///
/// 
    /// A string containing the description of the interactable object
    public abstract string GetDescription();
    /// 
    /// GetHoldTime gets the time for how long the player has already pressed.
    /// 
    /// A float of the time for how long the player has already pressed
    public float GetHoldTime() => holdTime;
    /// 
    /// GetHoldDuration gets the time the player has to hold until the Interact method triggers.
    /// 
    /// A float of the time the player has to hold until the Interact method triggers
    public float GetHoldDuration() => holdDuration;
    /// 
    /// GetHoldTimeLeft gets the time for how long a player still has to hold.
    /// 
    /// A float containig the result of holdDuration - holdTime
    public float GetHoldTimeLeft() => holdDuration - holdTime;
    /// 
    /// GetRadius gets the maximum distance of a player is allowed to have in order to interact with an object.
    /// 
    /// A float containing the interaction distance
    public float GetRadius() => radius;
    #endregion
    /// 
    /// Interact is the method which gets called when a player start the interaction with an object.
    /// 
    ///
    /// - If the player clicks on an object///
- If the holdTime is greater or equals the holdDuration///
- If the harvestTime is greater or equals the harvestDuration///
/// 
    /// It usually gets called in the "PlayerInteraction.cs"
    /// 
    public abstract void Interact();
    /// 
    /// IncreaseHoldTime increases the holdTime by Time.deltaTime.
    ///holdTime += Time.deltaTime;
    /// 
    public void IncreaseHoldTime() => holdTime += Time.deltaTime;
    /// 
    /// ResetHoldTime resets the holdTime to 0f.
    /// 
    public void ResetHoldTime() => holdTime = 0f;
    /// 
    /// isInRange checks if the player is in the interaction range of an interactable object.
    /// 
    /// 
    /// - True: Player is in range///
- False: Player is NOT in range///
/// 
    /// A bool which says if the player is in the interaction range of an interactable object
    public bool isInRange()
    {
        playerTransform = GameObject.FindGameObjectWithTag("Player").gameObject.transform; // Maybe singleton later?
        interactableTransform = gameObject.transform;
        float distance = Vector2.Distance(interactableTransform.position, playerTransform.position);
        if(distance <= radius)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    // Show interactable range in editor but NOT IN-GAME
    private void OnDrawGizmosSelected()
    {
        // Gizmos are only visible in the scene view -> NOT visible IN-GAME (DEBUG Reasons)
        Gizmos.color = Color.magenta;
        Gizmos.DrawWireSphere(transform.position, radius);
    }
}