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

[CreateAssetMenu(menuName = "Major Project/Combined Block")]
[System.Serializable]
public class CombinedBlock : LogicBlock
{
    #region Inspector Variables
    [SerializeField]
    [Tooltip("Blocks this will run through")]
    protected BlockReader blockReader;
    #endregion Inspector Variables

    #region Private Variables

    #endregion Private Variables


    public override bool Run(Character player, float animationTime)
    {
        BlockLogic(player,animationTime);

        if (blockReader.Finished)
        {
            blockReader.Reset();
            RepeatCount++;
        }

        return isFinished();
    }

    protected override void BlockLogic(Character player, float animationTime)
    {
        blockReader.Read(player,animationTime);
    }


    /// <summary>
    /// Returns the block that the character will endUp on after they use this logic element
    /// </summary>
    /// <param name="startBlock">block character is on</param>
    /// <param name="layerMask">layers to ignore</param>
    /// <returns>block which character will finish on after performing this function </returns>
    public override Block GetEndBlock(Block startBlock, Transform transform, LayerMask layerMask)
    {
        return blockReader.CurrentBlock.GetEndBlock(startBlock, transform, layerMask);
    }

    /// <summary>
    /// Resets the block to be ready to used again
    /// </summary>
    public override void Reset()
    {
        base.Reset();
        blockReader.Reset();
    }

    public override void CopyToken(BlockToken token)
    {
        base.CopyToken(token);

        blockReader = new BlockReader();

        foreach (BlockToken subToken in ((CombinedToken)token).subBlocks)
            blockReader.Add(subToken.ToLogicBlock());
    }

    public override BlockToken ToToken(BlockToken token = null)
    {
        if (token == null)
            token = new CombinedToken(this);

        CombinedToken retVal = (CombinedToken)base.ToToken(token);
        retVal.subBlocks = new BlockToken[blockReader.LogicChain.Count];

        for (int i = 0; i < retVal.subBlocks.Length; i++)
            retVal.subBlocks[i] = blockReader.LogicChain[i].ToToken();

        return retVal;
    }

}

[System.Serializable]
public class CombinedToken : BlockToken
{
    public BlockToken[] subBlocks;

    public CombinedToken(LogicBlock block) : base(block)
    {
    }
}
