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


using System.ComponentModel;
namespace OpenCVStudio_v0
{
    public sealed class CropBlockProperties
    {
        private readonly ProjectManager projectManager; private readonly ProjectBlock projectBlock;
        private int x; private int y; private int width; private int height; private bool clampToImage;
        public CropBlockProperties(ProjectManager projectManager, ProjectBlock projectBlock)
        {
            this.projectManager = projectManager ?? throw new ArgumentNullException(nameof(projectManager));
            this.projectBlock = projectBlock ?? throw new ArgumentNullException(nameof(projectBlock));
            x = projectManager.GetBlockParameter(projectBlock.Id, "X", 0);
            y = projectManager.GetBlockParameter(projectBlock.Id, "Y", 0);
            width = projectManager.GetBlockParameter(projectBlock.Id, "Width", 640);
            height = projectManager.GetBlockParameter(projectBlock.Id, "Height", 480);
            clampToImage = projectManager.GetBlockParameter(projectBlock.Id, "ClampToImage", true);
        }
        [Category("Область")]
        [DisplayName("X")]
        [Description("Координата левого края области в пикселях.")]
        public int X
        {
            get => x;
            set
            {
                ValidateCoordinate(value, "X");
                if (x == value) return;
                x = value;
                projectManager.SetBlockParameter(projectBlock.Id, "X", value);
            }
        }
        [Category("Область")]
        [DisplayName("Y")]
        [Description("Координата верхнего края области в пикселях.")]
        public int Y
        {
            get => y;
            set
            {
                ValidateCoordinate(value, "Y");
                if (y == value) return;
                y = value;
                projectManager.SetBlockParameter(projectBlock.Id, "Y", value);
            }
        }
        [Category("Область")]
        [DisplayName("Ширина")]
        [Description("Ширина вырезаемой области в пикселях.")]
        public int Width
        {
            get => width;
            set
            {
                ValidateDimension(value, "Ширина");
                if (width == value) return;
                width = value;
                projectManager.SetBlockParameter(projectBlock.Id, "Width", value);
            }
        }
        [Category("Область")]
        [DisplayName("Высота")]
        [Description("Высота вырезаемой области в пикселях.")]
        public int Height
        {
            get => height;
            set
            {
                ValidateDimension(value, "Высота");
                if (height == value) return;
                height = value;
                projectManager.SetBlockParameter(projectBlock.Id, "Height", value);
            }
        }
        [Category("Поведение")]
        [DisplayName("Ограничивать по изображению")]
        [Description("Если область выходит за границы изображения, она автоматически уменьшается до допустимого размера. Если выключено, будет сформирована ошибка.")]
        public bool ClampToImage
        {
            get => clampToImage;
            set
            {
                if (clampToImage == value) return;
                clampToImage = value;
                projectManager.SetBlockParameter(projectBlock.Id, "ClampToImage", 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 ValidateCoordinate(int value, string parameterName)
        {
            if (value < 0 || value > 100000) throw new ArgumentOutOfRangeException(nameof(value), value, $"{parameterName} должна быть от 0 до 100000.");
        }
        private static void ValidateDimension(int value, string parameterName)
        {
            if (value < 1 || value > 100000) throw new ArgumentOutOfRangeException(nameof(value), value, $"{parameterName} должна быть от 1 до 100000 пикселей.");
        }
    }
}