using System;
using System.ComponentModel;

namespace OpenCVStudio_v0
{
    /// <summary>
    /// Параметры блока отображения контуров.
    /// </summary>
    public sealed class DrawContoursBlockProperties
    {
        private readonly ProjectManager projectManager;
        private readonly ProjectBlock projectBlock;

        private int blue;
        private int green;
        private int red;
        private int thickness;

        public DrawContoursBlockProperties(ProjectManager projectManager, ProjectBlock projectBlock)
        {
            this.projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
            this.projectBlock = projectBlock ?? throw new ArgumentNullException(nameof(projectBlock));

            blue = projectManager.GetBlockParameter(projectBlock.Id, "Blue", 0);
            green = projectManager.GetBlockParameter(projectBlock.Id, "Green", 255);
            red = projectManager.GetBlockParameter(projectBlock.Id, "Red", 0);
            thickness = projectManager.GetBlockParameter(projectBlock.Id, "Thickness", 2);
        }

        [Category("Цвет контура")]
        [DisplayName("Синий")]
        [Description("Синяя составляющая цвета контура. Допустимый диапазон: 0–255.")]
        public int Blue
        {
            get => blue;

            set
            {
                int normalizedValue = Math.Clamp(value, 0, 255);

                if (blue == normalizedValue)
                    return;

                blue = normalizedValue;

                projectManager.SetBlockParameter(projectBlock.Id, "Blue", normalizedValue);
            }
        }

        [Category("Цвет контура")]
        [DisplayName("Зелёный")]
        [Description("Зелёная составляющая цвета контура. Допустимый диапазон: 0–255.")]
        public int Green
        {
            get => green;

            set
            {
                int normalizedValue = Math.Clamp(value, 0, 255);

                if (green == normalizedValue)
                    return;

                green = normalizedValue;

                projectManager.SetBlockParameter(projectBlock.Id, "Green", normalizedValue);
            }
        }

        [Category("Цвет контура")]
        [DisplayName("Красный")]
        [Description("Красная составляющая цвета контура. Допустимый диапазон: 0–255.")]
        public int Red
        {
            get => red;

            set
            {
                int normalizedValue = Math.Clamp(value, 0, 255);

                if (red == normalizedValue)
                    return;

                red = normalizedValue;

                projectManager.SetBlockParameter(projectBlock.Id, "Red", normalizedValue);
            }
        }

        [Category("Отображение")]
        [DisplayName("Толщина")]
        [Description("Толщина линий контура в пикселях. Допустимый диапазон: 1–20.")]
        public int Thickness
        {
            get => thickness;

            set
            {
                int normalizedValue = Math.Clamp(value, 1, 20);

                if (thickness == normalizedValue)
                    return;

                thickness = normalizedValue;

                projectManager.SetBlockParameter(projectBlock.Id, "Thickness", normalizedValue);
            }
        }

        [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;
    }
}