using System.Collections.Generic;
using System.Windows.Media;
using ExtendedGrid.Microsoft.Windows.Controls;
using MECF.Framework.Common.Account;
using MECF.Framework.Common.Account.Permissions;

namespace MECF.Framework.UI.Client.RecipeEditorLib.RecipeModel.Params
{
    public interface IParam
    {
        #region Properties

        /// <summary>
        /// 返回当前参数所属列名称。
        /// </summary>
        string DisplayName { get; }

        /// <summary>
        /// 设置或返回当前参数的控制名称。
        /// <remarks>
        /// 对应RecipeFormat.xml文件中的ControlName。
        /// </remarks>
        /// </summary>
        string ControlName { get; }

        /// <summary>
        /// 返回当前参数所属的配方步骤。
        /// </summary>
        RecipeStep Parent { get; }

        /// <summary>
        /// 当前参数在表格中的所属行。
        /// </summary>
        DataGridRow RowOwner { get; set; }

        /// <summary>
        /// 当前参数在表格中的所属列。
        /// </summary>
        DataGridColumn ColumnOwner { get; set; }

        /// <summary>
        /// 返回前序参数。
        /// </summary>
        IParam Previous { get; set; }

        /// <summary>
        /// 返回后序参数。
        /// </summary>
        IParam Next { get; set; }

        /// <summary>
        /// 设置或返回当前参数所属步骤的访问权限。
        /// </summary>
        public MenuPermissionEnum StepPermission { get; set; }

        /// <summary>
        /// 设置或返回当前参数所属列的访问权限。
        /// </summary>
        public MenuPermissionEnum ColumnPermission { get; set; }
        
        /// <summary>
        /// 设置或返回当前参数的访问权限。
        /// </summary>
        /// <remarks>
        /// 访问权限由当前参数所在的列和步骤共同决定。权限数值越小优先级越高。
        /// </remarks>
        public MenuPermissionEnum Permission { get; }
        
        /// <summary>
        /// 设置或返回是否在编辑器中隐藏参数值。
        /// </summary>
        public bool IsHideValue { get; set; }
        
        /// <summary>
        /// 设置或返回参数值隐藏时的替代符号。
        /// </summary>
        public string HiddenValueMasking { get; set; }
        
        /// <summary>
        /// 设置或返回当前参数是否被禁用。
        /// </summary>
        public bool IsEnabled { get; set; }

        /// <summary>
        /// 返回当前参数是否已保存。
        /// </summary>
        bool IsSaved { get; }
        
        /// <summary>
        /// 设置或返回当前参数的数值是否和前序参数的数值相等。
        /// </summary>
        /// <remarks>
        /// 该属性用于渲染DataGrid单元格文本颜色，当不等于前序参数数值时，当前参数显示为绿色。
        /// </remarks>
        bool IsEqualsToPrevious { get; }

        /// <summary>
        /// 返回当前参数是否校验成功。
        /// </summary>
        bool IsValid { get; }

        /// <summary>
        /// 返回当前参数校验错误信息。
        /// </summary>
        string ValidationError { get; }

        /// <summary>
        /// 返回计算器是否校验成功。
        /// </summary>
        bool IsCalculatorError { get; }

        /// <summary>
        /// 返回是否高亮显示当前参数。
        /// </summary>
        bool IsHighlighted { get; }

        #endregion

        #region Methods

        /// <summary>
        /// 将参数链表转换为数组。
        /// </summary>
        /// <returns></returns>
        List<IParam> Flatten();

        /// <summary>
        /// 校验用户输入值。
        /// </summary>
        void Validate();

        /// <summary>
        /// 设置为已保存状态。
        /// </summary>
        void Save();

        /// <summary>
        /// 高亮显示当前参数。
        /// </summary>
        void Highlight();

        /// <summary>
        /// 取消高亮显示。
        /// </summary>
        void ResetHighlight();

        /// <summary>
        /// 设置当前参数错误
        /// </summary>
        void SetCalculatorError();

        /// <summary>
        /// 取消当前参数错误
        /// </summary>
        void ResetCalculatorError();

        #endregion
    }
}
