using System;
using System.ComponentModel;
namespace OpenCVStudio_v0
{
    public sealed class MedianBlurBlockProperties
    {
        private const int MinimumKernelSize = 3; private const int MaximumKernelSize = 99;
        private readonly ProjectManager projectManager; private readonly ProjectBlock projectBlock;
        private int kernelSize;
        public MedianBlurBlockProperties(ProjectManager projectManager, ProjectBlock projectBlock)
        {
            this.projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
            this.projectBlock = projectBlock ?? throw new ArgumentNullException(nameof(projectBlock));
            kernelSize = projectManager.GetBlockParameter(projectBlock.Id, "KernelSize", 5);
        }
        [Category("Фильтр")]
        [DisplayName("Размер ядра")]
        [Description("Размер области медианного фильтра. Значение должно быть нечётным: 3, 5, 7, 9 и далее. Чем больше ядро, тем сильнее удаление шума.")]
        public int KernelSize
        {
            get => kernelSize;
            set
            {
                ValidateKernelSize(value);
                if (kernelSize == value) return;
                kernelSize = value;
                projectManager.SetBlockParameter(projectBlock.Id, "KernelSize", value);
            }
        }
        [Category("Блок")]
        [DisplayName("Название")]
        [Description("Название блока в конвейере обработки.")]
        [ReadOnly(true)]
        public string BlockName => projectBlock.Name;
        [Category("Блок")]
        [DisplayName("Тип")]
        [Description("Внутренний идентификатор типа блока.")]
        [ReadOnly(true)]
        public string BlockType => projectBlock.BlockType;
        [Category("Блок")]
        [DisplayName("Позиция")]
        [Description("Положение блока в конвейере обработки.")]
        [ReadOnly(true)]
        public int Position => projectBlock.Order + 1;
        private static void ValidateKernelSize(int value)
        {
            if (value < MinimumKernelSize || value > MaximumKernelSize)
                throw new ArgumentOutOfRangeException(nameof(value), value, $"Размер ядра должен быть от {MinimumKernelSize} до {MaximumKernelSize}.");
            if (value % 2 == 0) throw new ArgumentException("Размер ядра медианного фильтра должен быть нечётным.", nameof(value));
        }
    }
}