using System;
using System.Text.RegularExpressions;

namespace BgTools.Dialogs
{
    public class TextValidator
    {
        public enum ErrorType
        {
            Invalid = -1,
            Info = 0,
            Warning = 1,
            Error = 2
        }

        [NonSerialized]
        public ErrorType m_errorType = ErrorType.Invalid;

        [NonSerialized]
        private string m_regEx = string.Empty;

        [NonSerialized]
        private Func<string, bool> m_validationFunction;

        [NonSerialized]
        public string m_failureMsg = string.Empty;

        /// <summary>
        /// Validator for TextFieldDialog based on regex.
        /// </summary>
        /// <param name="errorType">Categorie of the error.</param>
        /// <param name="failureMsg">Message that described the reason why the validation fail.</param>
        /// <param name="regEx">String with regular expression. It need to describe the valid state.</param>
        public TextValidator(ErrorType errorType, string failureMsg, string regEx)
        {
            m_errorType = errorType;
            m_failureMsg = failureMsg;
            m_regEx = regEx;
        }

        /// <summary>
        /// Validator for TextFieldDialog based on regex.
        /// </summary>
        /// <param name="errorType">Categorie of the error.</param>
        /// <param name="failureMsg">Message that described the reason why the validation fail.</param>
        /// <param name="validationFunction">Function that validate the input. Get the current input as string and need to return a bool. Nedd to return 'false' if the validation fails.</param>
        public TextValidator(ErrorType errorType, string failureMsg, Func<string, bool> validationFunction)
        {
            m_errorType = errorType;
            m_failureMsg = failureMsg;
            m_validationFunction = validationFunction;
        }

        public bool Validate(string srcString)
        {
            if (m_regEx != string.Empty)
                return Regex.IsMatch(srcString, m_regEx);
            else if (m_validationFunction != null)
                return m_validationFunction(srcString);

            return false;
        }
    }
}