package com.gracecode.iZhihu.fragment;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ListView;
import com.gracecode.iZhihu.BuildConfig;
import com.gracecode.iZhihu.R;
import com.gracecode.iZhihu.dao.Question;
import com.gracecode.iZhihu.db.QuestionsDatabase;
import com.gracecode.iZhihu.util.Helper;
import com.handmark.pulltorefresh.library.PullToRefreshBase;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;

public class QuestionsListFragment extends BaseListFragment implements PullToRefreshBase.OnRefreshListener2<ListView> {
    private static final String TAG = QuestionsListFragment.class.getName();

    private static final String KEY_CURRENT_PAGE = "KEY_CURRENT_PAGE";
    private int mCurrentPage = QuestionsDatabase.FIRST_PAGE;

    private final Handler mUpdateDataSetChangedHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            try {
                if (msg.what > 0) {
                    mQuestionsAdapter.notifyDataSetChanged();
                } else {
                    Helper.showShortToast(mContext, getString(R.string.nomore_questions));
                }
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } finally {
                mPull2RefreshView.onRefreshComplete();
                if (msg.what <= 0) {
                    mPull2RefreshView.setMode(PullToRefreshBase.Mode.DISABLED);
                }
            }
        }
    };


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            this.mCurrentPage = savedInstanceState.getInt(KEY_CURRENT_PAGE);
        }
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(KEY_CURRENT_PAGE, mCurrentPage);
        super.onSaveInstanceState(outState);
    }

    public void updateQuestionsFromDatabase() {
        mQuestions.clear();
        for (int i = QuestionsDatabase.FIRST_PAGE; i <= mCurrentPage; i++) {
            mQuestions.addAll(mQuestionsDatabase.getRecentQuestions(i));
        }
    }

    public void addNewQuestionsAtHead(ArrayList<Question> questions) {
        this.mQuestions.addAll(0, questions);
    }

    /**
     * Get more times from db.
     */
    synchronized private void getMoreQuestionsFromDatabase() {
        new Thread(new Runnable() {
            private static final long DELAY_TIME = 1000;

            @Override
            public void run() {
                int size = 0;
                try {
                    Thread.sleep(DELAY_TIME);
                    if (mCurrentPage <= mQuestionsDatabase.getTotalPages()) {
                        ArrayList<Question> newDatas = mQuestionsDatabase.getRecentQuestions(++mCurrentPage);
                        mQuestions.addAll(newDatas);
                        size = newDatas.size();
                    }
                } catch (InterruptedException e) {
                    if (BuildConfig.DEBUG) Log.e(TAG, e.getMessage());
                } finally {
                    mUpdateDataSetChangedHandler.sendEmptyMessage(size);
                }
            }
        }).start();
    }


    @Override
    public void onStart() {
        super.onStart();

        mPull2RefreshView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
        mPull2RefreshView.setOnRefreshListener(this);
    }

    @Override
    public void onResume() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if (mQuestions.size() > 0) {
                        for (Question question : mQuestions) {
                            question.setStared(mQuestionsDatabase.isStared(question.getId()));
                        }
                    }
                } catch (ConcurrentModificationException e) {
                    if (BuildConfig.DEBUG) Log.e(TAG, e.getMessage());
                } catch (NullPointerException e) {
                    if (BuildConfig.DEBUG) Log.e(TAG, e.getMessage());
                } finally {
                    mUpdateDataSetChangedHandler.sendEmptyMessage(mQuestions.size());
                }
            }
        }).start();

        super.onResume();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }


    @Override
    public void onStop() {
        super.onStop();
    }


    @Override
    public ArrayList<Question> getInitialData() {
        return getRecentQuestion();
    }


    /**
     * 远程刷新获取条目
     *
     * @param refreshView
     */
    @Override
    public void onPullDownToRefresh(PullToRefreshBase refreshView) {

    }


    /**
     * 载入本地更多的条目
     *
     * @param refreshView
     */
    @Override
    public void onPullUpToRefresh(PullToRefreshBase refreshView) {
        getMoreQuestionsFromDatabase();
    }
}