using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions;
using Filtration.ObjectModel.ThemeEditor;

namespace Filtration.ObjectModel.BlockItemBaseTypes
{
    public abstract class IconBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
    {
        private IconSize _size;
        private IconColor _color;
        private IconShape _shape;
        private ThemeComponent _themeComponent;

        protected IconBlockItem()
        {
        }

        protected IconBlockItem(IconSize size, IconColor color, IconShape shape)
        {
            Size = size;
            Color = color;
            Shape = shape;
        }

        public override string OutputText => PrefixText + " " + (int)Size + " " + Color.GetAttributeDescription() + " " + Shape.GetAttributeDescription() +
                                             (ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);

        public override string SummaryText => string.Empty;

        public ThemeComponent ThemeComponent
        {
            get { return _themeComponent; }
            set
            {
                if (_themeComponent == value) { return; }

                if (_themeComponent != null)
                {
                    _themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
                    _themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
                }
                if (value != null)
                {
                    value.ThemeComponentUpdated += OnThemeComponentUpdated;
                    value.ThemeComponentDeleted += OnThemeComponentDeleted;
                }

                _themeComponent = value;
                OnPropertyChanged();
            }
        }

        public override Color SummaryBackgroundColor => Colors.Transparent;
        public override Color SummaryTextColor => Colors.Transparent;

        public IconSize Size
        {
            get { return _size; }
            set
            {
                _size = value;
                IsDirty = true;
                OnPropertyChanged();
            }
        }

        public IconColor Color
        {
            get { return _color; }
            set
            {
                _color = value;
                IsDirty = true;
                OnPropertyChanged();
            }
        }

        public IconShape Shape
        {
            get { return _shape; }
            set
            {
                _shape = value;
                IsDirty = true;
                OnPropertyChanged();
            }
        }

        private void OnThemeComponentUpdated(object sender, EventArgs e)
        {
            Size = ((IconThemeComponent)sender).IconSize;
            Color = ((IconThemeComponent)sender).IconColor;
            Shape = ((IconThemeComponent)sender).IconShape;
        }

        private void OnThemeComponentDeleted(object sender, EventArgs e)
        {
            ThemeComponent = null;
        }
    }
}