using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Animation;

namespace SJ.Controls.Helpers
{
    public class StoryboardHelper
    {
        /// <summary>
        /// 播放动画
        /// </summary>
        /// <param name="fe">控件源</param>
        /// <param name="from">开始值</param>
        /// <param name="to">结束值</param>
        /// <param name="duration">时间间隔</param>
        /// <param name="IsAutoReverse">是否反向播放</param>
        /// <param name="RepeatPlay">是否重复播放</param>
        /// <param name="ef">动画类型</param>
        /// <param name="Callback">回调函数</param>
        /// <param name="PropertyPath">动画属性</param>
        public static void _PlayDoubleAnimation(FrameworkElement fe, double from, double to, TimeSpan duration, bool IsAutoReverse, bool RepeatPlay, IEasingFunction ef, Action Callback, string PropertyPath)
        {
            Storyboard _sb = new Storyboard();
            _sb.Completed += new EventHandler((s, e) =>
            {
                if (Callback != null)
                    Callback();
                _sb.Stop();
                _sb.Children.Clear();
                _sb = null;
            });
            DoubleAnimation daRotation = new DoubleAnimation();
            daRotation.From = from;
            daRotation.To = to;
            daRotation.EasingFunction = ef;
            daRotation.Duration = duration;
            Storyboard.SetTargetProperty(daRotation, new PropertyPath(PropertyPath));
            Storyboard.SetTarget(daRotation, fe);
            _sb.Children.Add(daRotation);
            _sb.AutoReverse = IsAutoReverse;
            if (RepeatPlay)
                _sb.RepeatBehavior = RepeatBehavior.Forever;
            _sb.Begin();
        }

        public static void _PlayAnimationUsingKeyFrames(IList<AnimationModel> AnimationUsingKeyFrameList, bool IsAutoReverse, bool IsRepeayPlay, Action Callback)
        {
            if (AnimationUsingKeyFrameList == null || AnimationUsingKeyFrameList.Count == 0)
                return;
            Storyboard _sb = new Storyboard();
            _sb.Completed += new EventHandler((s, e) =>
            {
                if (Callback != null)
                    Callback();
                _sb.Stop();
                _sb.Children.Clear();
                _sb = null;
            });
            _sb.AutoReverse = IsAutoReverse;
            if (IsRepeayPlay)
                _sb.RepeatBehavior = RepeatBehavior.Forever;
            foreach (AnimationModel am in AnimationUsingKeyFrameList)
            {
                AnimationTimeline animationTimeLine = null;
                switch (am._KeyFrameType)
                {
                    case KeyFrameType.DoubleKeyFrame:
                        animationTimeLine = CreateDoubleAnimationUsingKeyFrames(am);
                        break;
                    case KeyFrameType.ColorKeyFrame:
                        animationTimeLine = CreateColorAnimationUsingKeyFrames(am);
                        break;
                    case KeyFrameType.ObjectKeyFrame:
                        animationTimeLine = CreateObjectAnimationUsingKeyFrames(am);
                        break;
                }
                _sb.Children.Add(animationTimeLine);
            }
            _sb.Begin();
        }

        private static AnimationTimeline CreateDoubleAnimationUsingKeyFrames(AnimationModel am)
        {
            DoubleAnimationUsingKeyFrames animationTimeline = new DoubleAnimationUsingKeyFrames();
            Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath));
            Storyboard.SetTarget(animationTimeline, am.Element);
            foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames)
            {
                animationTimeline.KeyFrames.Add(
                    new EasingDoubleKeyFrame(
                        Convert.ToInt32(baseKeyFrame.Value),
                        baseKeyFrame._KeyTime,
                        baseKeyFrame.EasingFunction)
                    );
            }
            return animationTimeline;
        }

        private static AnimationTimeline CreateColorAnimationUsingKeyFrames(AnimationModel am)
        {
            ColorAnimationUsingKeyFrames animationTimeline = new ColorAnimationUsingKeyFrames();
            Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath));
            Storyboard.SetTarget(animationTimeline, am.Element);
            foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames)
            {
                animationTimeline.KeyFrames.Add(
                    new EasingColorKeyFrame(
                        (System.Windows.Media.Color)baseKeyFrame.Value,
                        baseKeyFrame._KeyTime,
                        baseKeyFrame.EasingFunction)
                    );
            }
            return animationTimeline;
        }

        private static AnimationTimeline CreateObjectAnimationUsingKeyFrames(AnimationModel am)
        {
            ObjectAnimationUsingKeyFrames animationTimeline = new ObjectAnimationUsingKeyFrames();
            Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath));
            Storyboard.SetTarget(animationTimeline, am.Element);
            foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames)
            {
                animationTimeline.KeyFrames.Add(
                    new DiscreteObjectKeyFrame(
                       baseKeyFrame.Value,
                        baseKeyFrame._KeyTime)
                    );
            }
            return animationTimeline;
        }
    }

    /// <summary>
    /// 关键帧动画类型
    /// </summary>
    public enum KeyFrameType
    {
        DoubleKeyFrame = 1,
        ColorKeyFrame = 2,
        ObjectKeyFrame = 3
    }

    public class AnimationModel
    {
        public AnimationModel()
        {
            this.KeyFrames = new List<BaseKeyFrame>();
        }
        /// <summary>
        /// 执行动画的对象
        /// </summary>
        public FrameworkElement Element;

        /// <summary>
        /// 作用于动画的属性
        /// </summary>
        public string PropertyPath;

        /// <summary>
        /// 动画类型枚举
        /// </summary>
        public KeyFrameType _KeyFrameType;

        /// <summary>
        /// 关键帧动画帧集合
        /// </summary>
        public IList<BaseKeyFrame> KeyFrames;
    }

    public class BaseKeyFrame
    {
        /// <summary>
        /// 动画触发时间
        /// </summary>
        public TimeSpan _KeyTime;

        /// <summary>
        /// 值
        /// </summary>
        public object Value;

        /// <summary>
        /// 缓动函数类型
        /// </summary>
        public IEasingFunction EasingFunction;
    }
}