package ru.tinkoff.scrollingpagerindicator;

import android.database.DataSetObserver;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

/**
 * @author Nikita Olifer
 */
public class ViewPagerAttacher extends AbstractViewPagerAttacher<ViewPager> {

    private DataSetObserver dataSetObserver;
    private ViewPager.OnPageChangeListener onPageChangeListener;
    private ViewPager pager;
    private PagerAdapter attachedAdapter;

    @Override
    public void attachToPager(@NonNull final ScrollingPagerIndicator indicator, @NonNull final ViewPager pager) {
        attachedAdapter = pager.getAdapter();
        if (attachedAdapter == null) {
            throw new IllegalStateException("Set adapter before call attachToPager() method");
        }

        this.pager = pager;

        updateIndicatorDotsAndPosition(indicator);

        dataSetObserver = new DataSetObserver() {
            @Override
            public void onChanged() {
                indicator.reattach();
            }

            @Override
            public void onInvalidated() {
                onChanged();
            }
        };
        attachedAdapter.registerDataSetObserver(dataSetObserver);

        onPageChangeListener = new ViewPager.OnPageChangeListener() {

            boolean idleState = true;

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixel) {
                updateIndicatorOnPagerScrolled(indicator, position, positionOffset);
            }

            @Override
            public void onPageSelected(int position) {
                if (idleState) {
                    updateIndicatorDotsAndPosition(indicator);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                idleState = state == ViewPager.SCROLL_STATE_IDLE;
            }
        };
        pager.addOnPageChangeListener(onPageChangeListener);
    }

    @Override
    public void detachFromPager() {
        attachedAdapter.unregisterDataSetObserver(dataSetObserver);
        pager.removeOnPageChangeListener(onPageChangeListener);
    }

    private void updateIndicatorDotsAndPosition(ScrollingPagerIndicator indicator) {
        indicator.setDotCount(attachedAdapter.getCount());
        indicator.setCurrentPosition(pager.getCurrentItem());
    }
}