using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SketchAssistantWPF
{
    public class ActionHistory
    {
        //History of Actions taken
        List<SketchAction> actionHistory;
        //The current position in the actionHistory
        Tuple<int, SketchAction> currentAction;

        public ActionHistory()
        {
            actionHistory = new List<SketchAction>();
            currentAction = new Tuple<int, SketchAction>(-1, null);
            AddNewAction(new SketchAction(SketchAction.ActionType.Start, -1));
        }

        /// <summary>
        /// Resets the action history to its initial state.
        /// </summary>
        /// <returns>The new Last Action taken.</returns>
        public String Reset()
        {
            actionHistory.Clear();
            currentAction = new Tuple<int, SketchAction>(-1, null);
            return AddNewAction(new SketchAction(SketchAction.ActionType.Start, -1));
        }

        /// <summary>
        /// Adds a new action to the action history.
        /// </summary>
        /// <param name="newAction">The newly added action.</param>
        /// <returns>The message to be displayed</returns>
        public String AddNewAction(SketchAction newAction)
        {
            //The current Action is before the last action taken, delete everything after the current action.
            if (currentAction.Item1 < actionHistory.Count - 1)
            {
                actionHistory.RemoveRange(currentAction.Item1 + 1, actionHistory.Count - (currentAction.Item1 + 1));
            }
            actionHistory.Add(newAction);
            currentAction = new Tuple<int, SketchAction>(actionHistory.Count - 1, newAction);
            return UpdateStatusLabel();
        }

        /// <summary>
        /// Changes the currentAction.
        /// </summary>
        /// <param name="moveBack">If True, moves the current action back one slot, if False, moves it forward.</param>
        /// <returns>The message to be displayed</returns>
        public String MoveAction(bool moveBack)
        {
            if (moveBack && CanUndo())
            {
                currentAction = new Tuple<int, SketchAction>(currentAction.Item1 - 1, actionHistory[currentAction.Item1 - 1]);
            }
            if (!moveBack && CanRedo())
            {
                currentAction = new Tuple<int, SketchAction>(currentAction.Item1 + 1, actionHistory[currentAction.Item1 + 1]);
            }
            return UpdateStatusLabel();
        }

        /// <summary>
        /// Returns the current action.
        /// </summary>
        /// <returns>The current action.</returns>
        public SketchAction GetCurrentAction()
        {
            return currentAction.Item2;
        }

        /// <summary>
        /// Return whether or not an action can be undone.
        /// </summary>
        /// <returns>True if an action can be undone.</returns>
        public bool CanUndo()
        {
            if (currentAction.Item1 > 0) { return true; }
            else { return false; }
        }

        /// <summary>
        /// Return whether or not an action can be redone.
        /// </summary>
        /// <returns>True if an action can be redone.</returns>
        public bool CanRedo()
        {
            if (currentAction.Item1 < actionHistory.Count - 1) { return true; }
            else { return false; }
        }

        /// <summary>
        /// Returns whether or not the history is empty.
        /// </summary>
        /// <returns>true if the history is empty, otherwise false</returns>
        public bool IsEmpty()
        {
            if (actionHistory.Count == 1) { return true; }
            else { return false; }
        }

        /// <summary>
        /// Updates the status label if there is one given.
        /// </summary>
        /// <returns>The message to be displayed</returns>
        private String UpdateStatusLabel()
        {
            return "Last Action: " + currentAction.Item2.GetActionInformation();
        }
    }
}
