package com.ybao.pullrefreshview.support.utils;

import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;

/**
 * Created by ybao on 16/3/9.
 */
public class ViewScrollUtil {
    public static ScrollGeter getScrollGeter(View view) {
        if (view == null) {
            return null;
        }
        if (view instanceof ScrollGeter) {
            return (ScrollGeter) view;
        } else if (view instanceof AbsListView) {
            return new AbsListViewScrollGeter((AbsListView) view);
        } else if (view instanceof RecyclerView) {
            return new RecyclerViewScrollGeter((RecyclerView) view);
        }
        return null;
    }

    private static class AbsListViewScrollGeter implements ScrollGeter {
        AbsListView absListView;

        public AbsListViewScrollGeter(AbsListView absListView) {
            this.absListView = absListView;
        }

        @Override
        public int getScrollX() {
            return 0;
        }

        @Override
        public int getScrollY() {
            int firstVisiblePosition = absListView.getFirstVisiblePosition();
            View c = absListView.getChildAt(0);
            if (c == null) {
                return 0;
            }
            int top = c.getTop() - absListView.getPaddingTop();
            return -top + firstVisiblePosition * c.getHeight();
        }
    }

    private static class RecyclerViewScrollGeter implements ScrollGeter {
        RecyclerView recyclerView;
        LinearLayoutManager layoutManager;

        public RecyclerViewScrollGeter(RecyclerView recyclerView) {
            this.recyclerView = recyclerView;
            RecyclerView.LayoutManager layout = recyclerView.getLayoutManager();
            if (layout != null && layout instanceof LinearLayoutManager) {
                layoutManager = (LinearLayoutManager) layout;
            } else {
                Log.w("RecyclerViewScrollGeter", "LayoutManager is null or Not is LinearLayoutManager");
            }
        }

        @Override
        public int getScrollX() {
            return 0;
        }

        @Override
        public int getScrollY() {
            if (layoutManager != null) {
                int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                View c = layoutManager.findViewByPosition(firstVisiblePosition);
                if (c == null) {
                    return 0;
                }
                int top = c.getTop() - recyclerView.getPaddingTop();
                int n = firstVisiblePosition;
                if (layoutManager instanceof GridLayoutManager) {
                    int spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
                    n = n / spanCount;
                }
                return -top + n * c.getHeight();
            }
            return 0;
        }
    }

    public interface ScrollGeter {
        int getScrollX();

        int getScrollY();
    }
}