package info.papdt.swipeback.ui.app;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuInflater;
import android.widget.BaseAdapter;

import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;

import java.lang.ref.WeakReference;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import info.papdt.swipeback.R;
import info.papdt.swipeback.ui.adapter.AppAdapter;
import info.papdt.swipeback.ui.base.BaseListFragment;
import info.papdt.swipeback.ui.base.GlobalActivity;
import info.papdt.swipeback.ui.model.AppModel;
import static info.papdt.swipeback.ui.utils.UiUtility.*;

public class PerAppFragment extends BaseListFragment<AppModel>
{
	private AppAdapter mAdapter;
	private MenuItem mSearchItem;

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

	@Override
	protected BaseAdapter buildAdapter() {
		mAdapter = new AppAdapter(getActivity(), getItemList());
		return mAdapter;
	}

	@Override
	protected List<AppModel> loadData(ProgressCallback callback) {
		List<AppModel> list = new ArrayList<AppModel>();
		final PackageManager pm = getActivity().getPackageManager();
		List<ApplicationInfo> la = pm.getInstalledApplications(PackageManager.GET_META_DATA);
		
		for (final ApplicationInfo info : la) {
			final AppModel app = new AppModel();
			app.packageName = info.packageName;
			app.title = pm.getApplicationLabel(info).toString();
			app.iconRefreshRunnable = new Runnable() {
				@Override
				public void run() {
					app.icon = new WeakReference<Drawable>(pm.getApplicationIcon(info));
				}
			};
			list.add(app);
			callback.updateProgress(list.size(), la.size());
		}
		
		Collections.sort(list, new Comparator<AppModel>() {
			@Override
			public int compare(AppModel p1, AppModel p2) {
				return Collator.getInstance().compare(p1.title, p2.title);
			}
		});
		
		// Add the Global config entry
		AppModel global = new AppModel();
		global.packageName = "global";
		global.title = getString(R.string.global);
		global.icon = null;
		list.add(0, global);
		
		return list;
	}

	@Override
	protected void onItemClick(int pos) {
		startFragment("peract", mAdapter.getItem(pos).packageName);
	}

	@Override
	public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
		inflater.inflate(R.menu.app, menu);
		
		mSearchItem = menu.findItem(R.id.search);
		final SearchView search = $(MenuItemCompat.getActionView(mSearchItem));
		search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
				@Override
				public boolean onQueryTextSubmit(String query) {
					return false;
				}

				@Override
				public boolean onQueryTextChange(String query) {
					mAdapter.getFilter().filter(query);
					return true;
				}
		});
		
		search.setIconified(true);
		
		MenuItemCompat.setOnActionExpandListener(mSearchItem, new MenuItemCompat.OnActionExpandListener() {
			@Override
			public boolean onMenuItemActionExpand(MenuItem item) {
				showHomeAsUp();
				search.setIconified(false);
				return true;
			}

			@Override
			public boolean onMenuItemActionCollapse(MenuItem p1) {
				hideHomeAsUp();
				search.setQuery("", false);
				search.setIconified(true);
				return true;
			}
		});
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			case R.id.about:
				startFragment("about");
				return true;
			default:
				return super.onOptionsItemSelected(item);
		}
	}
	
	@Override
	protected void onReturn() {
		MenuItemCompat.collapseActionView(mSearchItem);
	}

}