package com.novoda.spritz;

import android.support.v4.view.ViewPager;

import com.airbnb.lottie.LottieAnimationView;

import java.util.ArrayList;
import java.util.List;

public class Spritz {

    private final List<SpritzStepWithOffset> spritzStepsWithOffset;
    private final ProgressCalculator progressCalculator;
    private final Animation animation;
    private final AnimationRunner animationRunner;
    private final SpritzPager spritzPager;

    private SpritzOnPageChangeListener spritzOnPageChangeListener;

    public static Builder with(LottieAnimationView lottieAnimationView) {
        return new Builder(lottieAnimationView);
    }

    private Spritz(List<SpritzStepWithOffset> spritzStepsWithOffset,
                   ProgressCalculator progressCalculator,
                   Animation animation,
                   AnimationRunner animationRunner,
                   SpritzPager spritzPager) {

        this.spritzStepsWithOffset = spritzStepsWithOffset;
        this.progressCalculator = progressCalculator;
        this.animation = animation;
        this.animationRunner = animationRunner;
        this.spritzPager = spritzPager;
    }

    public void attachTo(ViewPager viewPager) {
        spritzPager.setViewPager(viewPager);

        this.spritzOnPageChangeListener = new SpritzOnPageChangeListener(
                spritzStepsWithOffset,
                progressCalculator,
                animation,
                animationRunner,
                spritzPager
        );

        viewPager.addOnPageChangeListener(spritzOnPageChangeListener);
    }

    public void startPendingAnimations() {
        spritzOnPageChangeListener.onPageScrollStateChanged(ViewPager.SCROLL_STATE_IDLE);
    }

    public void detachFrom(ViewPager viewPager) {
        viewPager.removeOnPageChangeListener(spritzOnPageChangeListener);
    }

    @SuppressWarnings("WeakerAccess")
    public static class Builder {

        private final LottieAnimationView lottieAnimationView;
        private List<SpritzStepWithOffset> spritzStepsWithOffset;

        private Builder(LottieAnimationView lottieAnimationView) {
            this.lottieAnimationView = lottieAnimationView;
            spritzStepsWithOffset = new ArrayList<>();
        }

        public Builder withSteps(SpritzStep... spritzSteps) {
            this.spritzStepsWithOffset = SpritzStepWithOffset.fromSpritzSteps(spritzSteps);
            return this;
        }

        public Spritz build() {
            return new Spritz(
                    spritzStepsWithOffset,
                    new ProgressCalculator(spritzStepsWithOffset, calculateTotalAnimationDuration()),
                    new Animation(lottieAnimationView),
                    new AnimationRunner(lottieAnimationView),
                    new SpritzPager()
            );
        }

        private long calculateTotalAnimationDuration() {
            if (spritzStepsWithOffset.isEmpty()) {
                return 0;
            }

            int lastIndex = spritzStepsWithOffset.size() - 1;
            return spritzStepsWithOffset.get(lastIndex).swipeEnd();
        }

    }

}