using System;
using System.Collections.Generic;
using System.Text;

using System;
using System.ComponentModel;
namespace OpenCVStudio_v0
{
    public sealed class BrightnessContrastBlockProperties
    {
        private readonly ProjectManager projectManager; private readonly ProjectBlock projectBlock;
        private double contrast; private double brightness;
        public BrightnessContrastBlockProperties(ProjectManager projectManager, ProjectBlock projectBlock)
        {
            this.projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
            this.projectBlock = projectBlock ?? throw new ArgumentNullException(nameof(projectBlock));
            contrast = projectManager.GetBlockParameter(projectBlock.Id, "Contrast", 1.0);
            brightness = projectManager.GetBlockParameter(projectBlock.Id, "Brightness", 0.0);
        }
        [Category("Коррекция")]
        [DisplayName("Контраст")]
        [Description("Коэффициент контраста. 1,0 — без изменения; меньше 1 — снижение; больше 1 — увеличение.")]
        public double Contrast
        {
            get => contrast;
            set
            {
                ValidateContrast(value);
                if (Math.Abs(contrast - value) < double.Epsilon) return;
                contrast = value;
                projectManager.SetBlockParameter(projectBlock.Id, "Contrast", value);
            }
        }
        [Category("Коррекция")]
        [DisplayName("Яркость")]
        [Description("Смещение яркости. Положительное значение осветляет изображение, отрицательное затемняет.")]
        public double Brightness
        {
            get => brightness;
            set
            {
                ValidateBrightness(value);
                if (Math.Abs(brightness - value) < double.Epsilon) return;
                brightness = value;
                projectManager.SetBlockParameter(projectBlock.Id, "Brightness", 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;
        private static void ValidateContrast(double value)
        {
            if (double.IsNaN(value) || double.IsInfinity(value) || value < 0 || value > 10)
                throw new ArgumentOutOfRangeException(nameof(value), value, "Контраст должен находиться в диапазоне от 0 до 10.");
        }
        private static void ValidateBrightness(double value)
        {
            if (double.IsNaN(value) || double.IsInfinity(value) || value < -255 || value > 255)
                throw new ArgumentOutOfRangeException(nameof(value), value, "Яркость должна находиться в диапазоне от -255 до 255.");
        }
    }
}