package rjsv.morphos.data.animations;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.animation.Interpolator;

import rjsv.morphos.data.ViewDefault;
import rjsv.morphos.enumerators.AnimationTarget;

import static rjsv.morphos.Morpho.atLeastLollipop;

/**
 * Description
 *
 * @author <a href="mailto:[email protected]">RJSV</a>
 * @version $Revision : 1 $
 */

public class TranslationAnimation extends Animation {

    private float initialValueX;
    private float initialValueY;
    private float initialValueZ;
    private float translationValueX;
    private float translationValueY;
    private float translationValueZ;
    private AnimationTarget target;

    public TranslationAnimation(AnimationTarget target, float translationValueX, float translationValueY, float translationValueZ, int duration, Interpolator interpolator) {
        this.duration = duration;
        this.interpolator = interpolator;
        this.target = target;
        this.initialValueX = translationValueX;
        this.initialValueY = translationValueY;
        this.initialValueZ = translationValueZ;
        this.translationValueX = translationValueX;
        this.translationValueY = translationValueY;
        this.translationValueZ = translationValueZ;
    }

    @Override
    public Animator buildAnimation(@NonNull ViewDefault viewDefault, @NonNull View viewToMorph, boolean isReversed) {
        float moveToX = 0, moveToY = 0, moveToZ = 0;
        if (target == AnimationTarget.TO) {
            if (!isReversed) {
                initialValueX = viewDefault.getX();
                initialValueY = viewDefault.getY();
                initialValueZ = viewDefault.getZ();
            }
            moveToX = isReversed ? initialValueX : translationValueX;
            moveToY = isReversed ? initialValueY : translationValueY;
            moveToZ = isReversed ? initialValueZ : translationValueZ;
            viewDefault.setX(moveToX);
            viewDefault.setY(moveToY);
            viewDefault.setZ(moveToZ);
        } else if (target == AnimationTarget.BY) {
            moveToX = viewDefault.getX() + (isReversed ? -translationValueX : translationValueX);
            moveToY = viewDefault.getY() + (isReversed ? -translationValueY : translationValueY);
            moveToZ = viewDefault.getZ() + (isReversed ? -translationValueZ : translationValueZ);
            viewDefault.setX(moveToX);
            viewDefault.setY(moveToY);
            viewDefault.setZ(moveToZ);
        }
        PropertyValuesHolder[] parameters = new PropertyValuesHolder[atLeastLollipop ? 3 : 2];
        parameters[0] = PropertyValuesHolder.ofFloat(View.X, moveToX);
        parameters[1] = PropertyValuesHolder.ofFloat(View.Y, moveToY);
        if (atLeastLollipop) {
            parameters[2] = PropertyValuesHolder.ofFloat(View.Z, moveToZ);
        }
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(viewToMorph, parameters);
        if (duration >= 0) {
            animator.setDuration(duration);
        }
        if (interpolator != null) {
            animator.setInterpolator(interpolator);
        }
        return animator;
    }

}