package net.flashpunk.tweens.misc 
{
    import net.flashpunk.FP;
    import net.flashpunk.Tween;
    
    /**
     * Tweens from one angle to another.
     */
    public class AngleTween extends Tween
    {
        /**
         * The current value.
         */
        public var angle:Number = 0;
        
        /**
         * Constructor.
         * @param    complete    Optional completion callback.
         * @param    type        Tween type.
         */
        public function AngleTween(complete:Function = null, type:uint = 0) 
        {
            super(0, type, complete);
        }
        
        /**
         * Tweens the value from one angle to another.
         * @param    fromAngle        Start angle.
         * @param    toAngle            End angle.
         * @param    duration        Duration of the tween.
         * @param    ease            Optional easer function.
         */
        public function tween(fromAngle:Number, toAngle:Number, duration:Number, ease:Function = null):void
        {
            _start = angle = fromAngle;
            var d:Number = toAngle - angle,
                a:Number = Math.abs(d);
            if (a > 181) _range = (360 - a) * (d > 0 ? -1 : 1);
            else if (a < 179) _range = d;
            else _range = FP.choose(180, -180);
            _target = duration;
            _ease = ease;
            start();
        }
        
        /** @private Updates the Tween. */
        override public function update():void 
        {
            super.update();
            angle = (_start + _range * _t) % 360;
            if (angle < 0) angle += 360;
        }
        
        // Tween information.
        /** @private */ private var _start:Number;
        /** @private */ private var _range:Number;
    }
}