using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Effects;

namespace HandyControl.Interactivity
{
    public abstract class TransitionEffect : ShaderEffect
    {
        // Fields
        public static readonly DependencyProperty InputProperty =
            RegisterPixelShaderSamplerProperty("Input", typeof(TransitionEffect), 0, SamplingMode.NearestNeighbor);

        public static readonly DependencyProperty OldImageProperty =
            RegisterPixelShaderSamplerProperty("OldImage", typeof(TransitionEffect), 1, SamplingMode.NearestNeighbor);

        public static readonly DependencyProperty ProgressProperty = DependencyProperty.Register("Progress",
            typeof(double), typeof(TransitionEffect), new PropertyMetadata(0.0, PixelShaderConstantCallback(0)));

        // Methods
        protected TransitionEffect()
        {
            UpdateShaderValue(InputProperty);
            UpdateShaderValue(OldImageProperty);
            UpdateShaderValue(ProgressProperty);
        }

        // Properties
        public Brush Input
        {
            get =>
                (Brush) GetValue(InputProperty);
            set => SetValue(InputProperty, value);
        }

        public Brush OldImage
        {
            get =>
                (Brush) GetValue(OldImageProperty);
            set => SetValue(OldImageProperty, value);
        }

        public double Progress
        {
            get =>
                (double) GetValue(ProgressProperty);
            set => SetValue(ProgressProperty, value);
        }

        public new TransitionEffect CloneCurrentValue()
        {
            return (TransitionEffect) base.CloneCurrentValue();
        }

        protected abstract TransitionEffect DeepCopy();
    }
}