using System;
using System.ComponentModel;
namespace OpenCVStudio_v0
{
    /// <summary>
    /// Параметры блока выделения цветового канала,
    /// отображаемые в PropertyGrid.
    /// </summary>
    public sealed class ColorChannelBlockProperties
    {
        private readonly ProjectManager projectManager; private readonly ProjectBlock projectBlock;
        private ColorSpaceMode colorSpace; private int channel;
        public ColorChannelBlockProperties(ProjectManager projectManager, ProjectBlock projectBlock)
        {
            this.projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
            this.projectBlock = projectBlock ?? throw new ArgumentNullException(nameof(projectBlock));
            colorSpace = projectManager.GetBlockParameter(projectBlock.Id, "ColorSpace", ColorSpaceMode.BGR);
            channel = projectManager.GetBlockParameter(projectBlock.Id, "Channel", 0);
        }
        [Category("Параметры")]
        [DisplayName("Цветовое пространство")]
        [Description("Цветовое пространство, из которого выделяется канал.")]
        public ColorSpaceMode ColorSpace
        {
            get => colorSpace;
            set
            {
                if (colorSpace == value) return;
                colorSpace = value;
                projectManager.SetBlockParameter(projectBlock.Id, "ColorSpace", value);
            }
        }
        [Category("Параметры")]
        [DisplayName("Канал")]
        [Description("Номер канала от 0 до 2.")]
        public int Channel
        {
            get => channel;
            set
            {
                if (value < 0 || value > 2) throw new ArgumentOutOfRangeException(nameof(value), value, "Номер канала должен быть от 0 до 2.");
                if (channel == value) return;
                channel = value;
                projectManager.SetBlockParameter(projectBlock.Id, "Channel", value);
            }
        }
        [Category("Блок")]
        [DisplayName("Название")]
        [ReadOnly(true)]
        public string BlockName => projectBlock.Name;
        [Category("Блок")]
        [DisplayName("Тип")]
        [ReadOnly(true)]
        public string BlockType => projectBlock.BlockType;
        [Category("Блок")]
        [DisplayName("Позиция")]
        [ReadOnly(true)]
        public int Position => projectBlock.Order + 1;
    }
}