/*******************************************************************************
 * Copyright 2011, 2012, 2013 fanfou.com, Xiaoke, Zhang
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package com.fanfou.app.opensource;

import java.util.ArrayList;
import java.util.List;

import android.app.SearchManager;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;

import com.fanfou.app.opensource.adapter.SearchResultsAdapter;
import com.fanfou.app.opensource.api.ApiClient;
import com.fanfou.app.opensource.api.ApiException;
import com.fanfou.app.opensource.api.bean.Status;
import com.fanfou.app.opensource.service.Constants;
import com.fanfou.app.opensource.ui.ActionBar;
import com.fanfou.app.opensource.ui.UIManager;
import com.fanfou.app.opensource.ui.widget.EndlessListView;
import com.fanfou.app.opensource.ui.widget.EndlessListView.OnRefreshListener;
import com.fanfou.app.opensource.util.CommonHelper;
import com.fanfou.app.opensource.util.StringHelper;

/**
 * @author mcxiaoke
 * @version 1.0 2011.08.05
 * @version 1.1 2011.10.12
 * @version 1.5 2011.10.24
 * @version 1.6 2011.11.21
 * @version 1.7 2011.11.25
 * 
 */
public class SearchResultsPage extends BaseActivity implements
        OnRefreshListener, OnItemLongClickListener {

    private class SearchTask extends AsyncTask<Void, Void, List<Status>> {

        @Override
        protected List<com.fanfou.app.opensource.api.bean.Status> doInBackground(
                final Void... params) {
            if (StringHelper.isEmpty(SearchResultsPage.this.keyword)) {
                return null;
            }
            List<com.fanfou.app.opensource.api.bean.Status> result = null;

            int count = Constants.DEFAULT_TIMELINE_COUNT;
            if (AppContext.isWifi()) {
                count = Constants.MAX_TIMELINE_COUNT;
            }
            try {
                result = SearchResultsPage.this.api.search(
                        SearchResultsPage.this.keyword, null,
                        SearchResultsPage.this.maxId, count, Constants.FORMAT,
                        Constants.MODE);
            } catch (final ApiException e) {
                if (AppContext.DEBUG) {
                    e.printStackTrace();
                }
            }

            return result;
        }

        @Override
        protected void onPostExecute(
                final List<com.fanfou.app.opensource.api.bean.Status> result) {
            if (!SearchResultsPage.this.showListView) {
                showContent();
            }
            if ((result != null) && (result.size() > 0)) {

                final int size = result.size();
                log("result size=" + size);
                SearchResultsPage.this.maxId = result.get(size - 1).id;
                log("maxId=" + SearchResultsPage.this.maxId);

                SearchResultsPage.this.mStatuses.addAll(result);
                updateUI(size < 20);
            }
        }

        @Override
        protected void onPreExecute() {
        }

    }

    protected ActionBar mActionBar;
    protected EndlessListView mListView;

    protected ViewGroup mEmptyView;

    protected SearchResultsAdapter mStatusAdapter;

    private List<Status> mStatuses;
    protected String keyword;

    protected String maxId;

    private ApiClient api;

    private boolean showListView = false;

    private static final String tag = SearchResultsPage.class.getSimpleName();

    private static final String LIST_STATE = "listState";

    private Parcelable mState = null;

    private void doSearch() {
        if (this.keyword != null) {
            if (AppContext.DEBUG) {
                log("doSearch() keyword=" + this.keyword);
            }
            this.mActionBar.setTitle(this.keyword);
            new SearchTask().execute();
        }

    }

    private void goTop() {
        if (this.mListView != null) {
            this.mListView.setSelection(0);
        }
    }

    protected void initialize() {
        this.mStatuses = new ArrayList<Status>();
        this.api = AppContext.getApiClient();
    }

    private void log(final String message) {
        Log.d(SearchResultsPage.tag, message);
    }

    @Override
    public void onClick(final View v) {
        switch (v.getId()) {
        case R.id.actionbar_title:
            goTop();
            break;
        default:
            break;
        }
    }

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initialize();
        setLayout();
        search();
    }

    @Override
    public void onItemClick(final ListView view, final View row,
            final int position) {
        final Status s = (Status) view.getItemAtPosition(position);
        if (s != null) {
            CommonHelper.goStatusPage(this.mContext, s);
        }
    }

    @Override
    public boolean onItemLongClick(final AdapterView<?> parent,
            final View view, final int position, final long id) {
        final Status s = (Status) parent.getItemAtPosition(position);
        showPopup(view, s);
        return true;
    }

    @Override
    public void onLoadMore(final ListView view) {
        doSearch();
    }

    @Override
    protected void onNewIntent(final Intent intent) {
        setIntent(intent);
        search();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    public void onRefresh(final ListView view) {
    }

    @Override
    protected void onRestoreInstanceState(final Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        this.mState = savedInstanceState
                .getParcelable(SearchResultsPage.LIST_STATE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if ((this.mState != null) && (this.mListView != null)) {
            this.mListView.onRestoreInstanceState(this.mState);
            this.mState = null;
        }
    }

    @Override
    protected void onSaveInstanceState(final Bundle outState) {
        super.onSaveInstanceState(outState);
        if (this.mListView != null) {
            this.mState = this.mListView.onSaveInstanceState();
            outState.putParcelable(SearchResultsPage.LIST_STATE, this.mState);
        }
    }

    protected void parseIntent() {
        final Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            this.keyword = intent.getStringExtra(SearchManager.QUERY);
            if (AppContext.DEBUG) {
                log("parseIntent() keyword=" + this.keyword);
            }
        } else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
            final Uri data = intent.getData();
            if (data != null) {
                this.keyword = data.getLastPathSegment();
                log("parseIntent() keyword=" + this.keyword);
            }
        }
    }

    protected void search() {
        parseIntent();
        this.mStatuses.clear();
        doSearch();
        showProgress();

    }

    /**
     * 初始化和设置ActionBar
     */
    private void setActionBar() {
        this.mActionBar = (ActionBar) findViewById(R.id.actionbar);
        this.mActionBar.setTitle("搜索结果");
        this.mActionBar.setTitleClickListener(this);
        this.mActionBar.setRightAction(new ActionBar.SearchAction(this));
        this.mActionBar.setLeftAction(new ActionBar.BackAction(this));
    }

    private void setLayout() {
        setContentView(R.layout.list);

        setActionBar();
        this.mEmptyView = (ViewGroup) findViewById(R.id.empty);
        this.mListView = (EndlessListView) findViewById(R.id.list);
        this.mListView.setOnItemLongClickListener(this);
        this.mListView.setOnRefreshListener(this);
    }

    private void showContent() {
        this.showListView = true;

        this.mStatusAdapter = new SearchResultsAdapter(this, this.mStatuses);
        this.mListView.setAdapter(this.mStatusAdapter);

        this.mEmptyView.setVisibility(View.GONE);
        this.mListView.removeHeader();
        this.mListView.setVisibility(View.VISIBLE);
    }

    private void showPopup(final View view, final Status s) {
        if ((s == null) || s.isNull()) {
            return;
        }
        UIManager.showPopup(this, view, s, this.mStatusAdapter, this.mStatuses);
    }

    private void showProgress() {
        this.showListView = false;
        this.mListView.setVisibility(View.GONE);
        this.mEmptyView.setVisibility(View.VISIBLE);
    }

    protected void updateUI(final boolean noMore) {
        this.mStatusAdapter.updateDataAndUI(this.mStatuses, this.keyword);
        if (noMore) {
            this.mListView.onNoLoadMore();
        } else {
            this.mListView.onLoadMoreComplete();
        }
    }

}