package com.yugy.v2ex.daily.fragment;

import android.app.Activity;
import android.app.Fragment;
import android.app.LoaderManager;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.SearchView;

import com.etsy.android.grid.StaggeredGridView;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.yugy.v2ex.daily.R;
import com.yugy.v2ex.daily.activity.MainActivity;
import com.yugy.v2ex.daily.activity.NodeActivity;
import com.yugy.v2ex.daily.adapter.AllNodesAdapter;
import com.yugy.v2ex.daily.adapter.SearchAllNodeAdapter;
import com.yugy.v2ex.daily.dao.datahelper.AllNodesDataHelper;
import com.yugy.v2ex.daily.model.NodeModel;
import com.yugy.v2ex.daily.sdk.V2EX;
import com.yugy.v2ex.daily.tasker.AllNodesParseTask;
import com.yugy.v2ex.daily.utils.DebugUtils;
import com.yugy.v2ex.daily.widget.AppMsg;
import com.yugy.v2ex.daily.widget.NodeView;

import org.apache.http.Header;
import org.json.JSONArray;

import java.util.ArrayList;

/**
 * Created by yugy on 14-2-23.
 */
public class AllNodeFragment extends Fragment implements
        AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor>{

    private StaggeredGridView mGridView;
    private AllNodesDataHelper mAllNodesDataHelper;
    private AllNodesAdapter mAllNodesAdapter;
    private SearchAllNodeAdapter mSearchAllNodeAdapter = null;
    private View mEmptyView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_all_node, container, false);
        mGridView = (StaggeredGridView) rootView.findViewById(R.id.grid_fragment_all_node);
        mEmptyView = rootView.findViewById(R.id.progress_fragment_all_node);
        mGridView.setEmptyView(mEmptyView);
        mGridView.setOnItemClickListener(this);
        mAllNodesDataHelper = new AllNodesDataHelper(getActivity());
        mAllNodesAdapter = new AllNodesAdapter(getActivity());
        mGridView.setAdapter(mAllNodesAdapter);
        getLoaderManager().initLoader(0, null, this);
        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if(mAllNodesDataHelper.query().length == 0){
            getData();
        }
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.all_node, menu);
        MenuItem searchMenuItem = menu.findItem(R.id.menu_all_node_search);
        final SearchView searchView = (SearchView) searchMenuItem.getActionView();
        searchView.setQueryHint("Search for nodes");
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                DebugUtils.log("onQueryTextSubmit: " + query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                DebugUtils.log("onQueryTextChange: " + newText);
                if(newText.equals("")){     //删除关键字到空或者初始状态
                    if(mGridView.getAdapter() instanceof AllNodesAdapter){      //初始状态, do nothing

                    }else if(mGridView.getAdapter() instanceof SearchAllNodeAdapter){       //删除关键字到空,用回AllNodesAdapter
                        mGridView.setAdapter(mAllNodesAdapter);
                        mSearchAllNodeAdapter = null;
                    }
                }else{      //有关键字啦
                    if(mSearchAllNodeAdapter == null){      //SearchAllNodesAdapter 初始化
                        mSearchAllNodeAdapter = new SearchAllNodeAdapter(getActivity(), newText);
                        mGridView.setAdapter(mSearchAllNodeAdapter);
                    }else{
                        mSearchAllNodeAdapter.setKeyword(newText);
                    }
                }
                return true;
            }
        });
        searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                DebugUtils.log("onMenuItemActionExpand");
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                DebugUtils.log("onMenuItemActionCollapse");
                mGridView.setAdapter(mAllNodesAdapter);
                mSearchAllNodeAdapter = null;
                return true;
            }
        });

    }

    private void getData(){
        V2EX.getAllNode(getActivity(), new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                DebugUtils.log(response);
                new AllNodesParseTask(getActivity()) {
                    @Override
                    protected void onPostExecute(ArrayList<NodeModel> nodeModels) {
                        mAllNodesDataHelper.bulkInsert(nodeModels);
                        mEmptyView.setVisibility(View.GONE);
                        mGridView.setEmptyView(null);
                    }
                }.execute(response);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable e) {
                e.printStackTrace();
                AppMsg.makeText(getActivity(), "Network error", AppMsg.STYLE_ALERT).show();
                super.onFailure(statusCode, headers, responseBody, e);
            }
        });
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return mAllNodesDataHelper.getCursorLoader();
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mAllNodesAdapter.changeCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mAllNodesAdapter.changeCursor(null);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        NodeView item = (NodeView) view;
        Intent intent = new Intent(getActivity(), NodeActivity.class);
        Bundle argument = new Bundle();
        argument.putInt("node_id", item.getNodeId());
        intent.putExtra("argument", argument);
        startActivity(intent);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(2);
    }
}