// Copyright (c) MudBlazor 2021
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

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

namespace Connected
{
    public interface IMask
    {
        /// <summary>
        /// The mask defining the structure of the accepted input. 
        /// Its format depends on the implementation.
        /// </summary>
        string Mask { get; }

        /// <summary>
        /// The current text as it is displayed in the component
        /// </summary>
        string Text { get;  }

        /// <summary>
        /// Get the Text without delimiters or placeholders. Depends on the implementation entirely.
        /// Clean text will usually be used for the Value property of a mask field. 
        /// </summary>
        string GetCleanText() => Text;

        /// <summary>
        /// The current caret position
        /// </summary>
        int CaretPos { get; set; }

        /// <summary>
        /// The currently selected sub-section of the Text
        /// </summary>
        (int, int)? Selection { get; set; }

        /// <summary>
        /// Implements user input at the current caret position (single key strokes or pasting longer text)
        /// </summary>
        /// <param name="input"></param>
        void Insert(string input);

        /// <summary>
        /// Implements the effect of the Del key at the current cursor position
        /// </summary>
        void Delete();

        /// <summary>
        /// Implements the effect of the Backspace key at the current cursor position
        /// </summary>
        void Backspace();

        /// <summary>
        /// Reset the mask as if the whole textfield was cleared
        /// </summary>
        void Clear();

        /// <summary>
        /// Overwrite the mask text without losing caret position
        /// </summary>
        /// <param name="text"></param>
        void SetText(string text);

        /// <summary>
        /// Copy config from other mask but preserve own state.
        /// </summary>
        /// <param name="other"></param>
        void UpdateFrom(IMask other);

    }
}
