package com.tecorb.hrmovecarmarkeranimation.AnimationClass;

import android.animation.ValueAnimator;
import android.location.Location;
import android.view.animation.LinearInterpolator;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.tecorb.hrmovecarmarkeranimation.CallBacks.UpdateLocationCallBack;
import com.tecorb.hrmovecarmarkeranimation.Utils.Utilities;


public class HRMarkerAnimation {

    private UpdateLocationCallBack updateLocation;
    private ValueAnimator valueAnimator;
    private GoogleMap googleMap;
    private long animationDuration;

    public HRMarkerAnimation(GoogleMap googleMap,long duration , UpdateLocationCallBack updateLocation) {
        this.updateLocation = updateLocation;
        this.googleMap =googleMap;
        this.animationDuration=duration;
    }

    public void animateMarker(final Location destination, final Location oldLocation, final Marker marker) {
        if (marker != null) {
            final LatLng startPosition = marker.getPosition();
            final LatLng endPosition = new LatLng(destination.getLatitude(), destination.getLongitude());

            if (valueAnimator != null)
                valueAnimator.end();

            final Utilities.LatLngInterpolator latLngInterpolator = new Utilities.LatLngInterpolator.LinearFixed();
            valueAnimator = ValueAnimator.ofFloat(0, 1);
            valueAnimator.setDuration(animationDuration); // duration 1 second
            valueAnimator.setInterpolator(new LinearInterpolator());
            valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    try {
                        float v = animation.getAnimatedFraction();
                        LatLng newPosition = latLngInterpolator.interpolate(v, startPosition, endPosition);
                        marker.setPosition(newPosition);
                        //marker.setRotation(computeRotation(v, startRotation, destination.getBearing()));
                        marker.setRotation(Utilities.computeRotation(v, marker.getRotation(),
                                (float)Utilities.bearingBetweenLocations(startPosition, newPosition)));
                        marker.setAnchor(0.5f, 0.5f);
                        marker.setFlat(true);


                        // add new location into old location
                        updateLocation.onUpdatedLocation(destination);


                        //when marker goes out from screen it automatically move into center
                        if (googleMap!=null){
                            if (!Utilities.isMarkerVisible(googleMap,newPosition)){
                                googleMap.animateCamera(CameraUpdateFactory
                                        .newCameraPosition(new CameraPosition.Builder()
                                                .target(newPosition)
                                                .zoom(googleMap.getCameraPosition().zoom)
                                                .build()));
                            }else {
                                try {
                                    googleMap.animateCamera(CameraUpdateFactory
                                            .newCameraPosition(new CameraPosition.Builder()
                                                    .target(newPosition)
                                                    .tilt(0)
                                                    .zoom(googleMap.getCameraPosition().zoom)
                                                    .build()));
                                }catch (Exception e){
                                    e.printStackTrace();
                                }

                            }

                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        // handle exception here
                    }
                }

            });
            valueAnimator.start();
        }
    }

}