using System;
using System.ComponentModel;

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

        private ContourRetrievalMode retrievalMode;
        private ContourApproximationMode approximationMode;

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

            retrievalMode = projectManager.GetBlockParameter(projectBlock.Id, "RetrievalMode", ContourRetrievalMode.Tree);
            approximationMode = projectManager.GetBlockParameter(projectBlock.Id, "ApproximationMode", ContourApproximationMode.Simple);
        }

        [Category("Поиск контуров")]
        [DisplayName("Режим поиска")]
        [Description("External — только внешние контуры. List — все контуры без иерархии. CComp — двухуровневая иерархия. Tree — полная иерархия контуров.")]
        public ContourRetrievalMode RetrievalMode
        {
            get => retrievalMode;

            set
            {
                if (!Enum.IsDefined(value))
                    throw new ArgumentOutOfRangeException(nameof(value), value, "Неизвестный режим поиска контуров.");

                if (retrievalMode == value)
                    return;

                retrievalMode = value;

                projectManager.SetBlockParameter(projectBlock.Id, "RetrievalMode", value);
            }
        }

        [Category("Поиск контуров")]
        [DisplayName("Аппроксимация")]
        [Description("None — сохраняет все точки. Simple — удаляет лишние точки на прямых. TC89L1 и TC89KCOS — алгоритмы аппроксимации Teh–Chin.")]
        public ContourApproximationMode ApproximationMode
        {
            get => approximationMode;

            set
            {
                if (!Enum.IsDefined(value))
                    throw new ArgumentOutOfRangeException(nameof(value), value, "Неизвестный режим аппроксимации контура.");

                if (approximationMode == value)
                    return;

                approximationMode = value;

                projectManager.SetBlockParameter(projectBlock.Id, "ApproximationMode", 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;
    }
}