using System;
using VOID.Generic.Player.Util;

namespace VOID.Generic.Player.CursorOperation
{
    public abstract class AbstractCursorOperation
    {
        /// <summary>
        /// <see cref="Type"/> for which this operation will work.
        /// </summary>
        public abstract Type ForType();
        
        /// <summary>
        /// Returns TRUE if this operation can be executed.
        /// </summary>
        /// <param name="select">Complex information what was selected for this operation</param>
        public abstract bool Check(SelectUtilResult select);
        
        /// <summary>
        /// Instantly executes default logic. Usually, by ordering currently active unit to do something.<br/>
        /// <b>On Scene:</b> single tap, no alternate available (for now)<br/>
        /// <b>On UI:</b> double tap, single tap is alternate usage<br/>
        /// </summary>
        /// <param name="select">Complex information what was selected for this operation</param>
        /// <param name="isAlternate">If operation should execute alternate logic</param>
        public abstract void DoDefault(SelectUtilResult select, bool isAlternate);
        
        /// <summary>
        /// Open context menu with all available action to choose for selected target.
        /// </summary>
        /// <param name="select">Complex information what was selected for this operation</param>
        public abstract void DoContext(SelectUtilResult select);
    }
}