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

/// <summary>
/// Base class all logic blocks are derived from
/// </summary>
[System.Serializable]
public abstract class LogicBlock : ScriptableObject
{

    #region Inspector Fields
    [SerializeField]
    [Header("UI Settings")]
    [Tooltip("Color which will identify this element")]
    public Color Color;

    [SerializeField]
    [Tooltip("Name which will appear in the UI")]
    protected string _DisplayName;

    [SerializeField]
    [Header("Base Settings")]
    [Tooltip("Wait until this block is resolved before moving to next")]
    public bool WaitUntilFinished = false;

    [SerializeField]
    [Tooltip("Amount of times to run this Block before moving to next")]
    protected int RepeatAmount = 1;
    #endregion Inspector Fields

    #region ReadOnly Variables
    public string DisplayName { get {return (string.IsNullOrEmpty(_DisplayName)) ? name : _DisplayName; } }
    #endregion

    #region private variables

    /// <summary>
    /// Amount of times this block has run
    /// </summary>
    protected int RepeatCount = 0;

    #endregion private variables


    #region Class Functions
    /// <summary>
    /// Runs the block
    /// </summary>
    /// <param name="player">Player which will be affected by the block</param>
    /// <returns>returns true if block is finished</returns>
    public virtual bool Run(Character player, float animationTime)
    {
        RepeatCount++;
        BlockLogic(player, animationTime);

        return isFinished();
    }

    /// <summary>
    /// Returns the amount of space this logic block takes up
    /// </summary>
    /// <returns>Int which controlls how much space this takes up</returns>
    public virtual int Size()
    {
        return 1;
    }

    /// <summary>
    /// Where derived callses should implement the logic for their classes
    /// </summary>
    /// <param name="player">Player which will be affected by the block</param>
    /// <returns>returns true if block is finished</returns>
    protected abstract void BlockLogic(Character player, float animationTime);

    /// <summary>
    /// Resets the block to be ready to used again
    /// </summary>
    public virtual void Reset()
    {
        RepeatCount = 0;
    }

    /// <summary>
    /// False if this block needs to be run again
    /// </summary>
    /// <returns>bool false if block needs to be run again</returns>
    public virtual bool isFinished()
    {
        return (RepeatCount == RepeatAmount);
    }

    #endregion Class Functions
}
