package com.lufficc.demolightadapter;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;

import com.lufficc.demolightadapter.model.TextModel;
import com.lufficc.demolightadapter.viewprovider.TextViewProvider;
import com.lufficc.lightadapter.FooterState;
import com.lufficc.lightadapter.LoadMoreFooterViewHolderProvider;
import com.lufficc.lightadapter.LightAdapter;
import com.lufficc.lightadapter.LoadMoreFooterModel;
import com.lufficc.lightadapter.OnDataClickListener;
import com.lufficc.lightadapter.OnHeaderClickListener;

public class GridLoadMoreActivity extends AppCompatActivity implements OnDataClickListener, OnHeaderClickListener, LoadMoreFooterModel.LoadMoreListener, LoadMoreFooterModel.OnFooterClickListener, SwipeRefreshLayout.OnRefreshListener {
    SwipeRefreshLayout swipeRefreshLayout;

    RecyclerView recyclerView;

    LightAdapter adapter;

    LoadMoreFooterModel footerModel;

    Handler handler = new Handler(Looper.getMainLooper());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        register();

        adapter.addFooter(footerModel = new LoadMoreFooterModel());
        adapter.setOnDataClickListener(this);
        adapter.setOnHeaderClickListener(this);
        addData();
        footerModel.setLoadMoreListener(this);
        footerModel.setOnFooterClickListener(this);
    }

    private void init() {
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
        adapter = new LightAdapter();
        GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
        layoutManager.setSpanSizeLookup(adapter.spanSizeLookup(2, 2));
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
        swipeRefreshLayout.setOnRefreshListener(this);
    }

    private void register() {
        adapter.register(TextModel.class, new TextViewProvider());
        adapter.register(LoadMoreFooterModel.class, new LoadMoreFooterViewHolderProvider());
    }

    void addData() {
        adapter.addData(DataSource.textModel());
    }

    @Override
    public void onDataClick(int position, Object data) {
        Log.i("main", "pos:" + position);
        adapter.removeData(position);
    }

    @Override
    public void onHeaderClick(int position, Object header) {
        adapter.removeHeader(position);
    }

    int step = 0;

    @Override
    public void onLoadMore() {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (step == 0) {
                    addData();
                } else if (step == 1) {
                    footerModel.noMoreData();
                } else if (step == 2) {
                    footerModel.errorOccur();
                } else {
                    addData();
                }
                step++;
                if (step > 2)
                    step = 0;
            }
        }, 1000);
    }

    @Override
    public void onFooterClick(int state) {
        if (state == FooterState.STATE_ERROR) {
            footerModel.canLoadMore();
            onLoadMore();
        } else if (state == FooterState.STATE_NO_MORE) {
            footerModel.canLoadMore();
            onLoadMore();
        }
    }

    @Override
    public void onRefresh() {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeRefreshLayout.setRefreshing(false);
                adapter.clearData();
                footerModel.canLoadMore();
                addData();
            }
        }, 1000);
    }
}