package se.emilsjolander.stickylistheaders;

import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

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


/**
 * @author lsjwzh
 */
class ExpandableStickyListHeadersAdapter extends BaseAdapter implements StickyListHeadersAdapter {

	private final StickyListHeadersAdapter mInnerAdapter;
	DualHashMap<View, Long> mViewToItemIdMap = new DualHashMap<View, Long>();
	DistinctMultiHashMap<Integer, View> mHeaderIdToViewMap = new DistinctMultiHashMap<Integer, View>();
	List<Long> mCollapseHeaderIds = new ArrayList<Long>();

	ExpandableStickyListHeadersAdapter(StickyListHeadersAdapter innerAdapter) {
		this.mInnerAdapter = innerAdapter;
	}

	@Override
	public View getHeaderView(int position, View convertView, ViewGroup parent) {
		return mInnerAdapter.getHeaderView(position, convertView, parent);
	}

	@Override
	public long getHeaderId(int position) {
		return mInnerAdapter.getHeaderId(position);
	}

	@Override
	public boolean areAllItemsEnabled() {
		return mInnerAdapter.areAllItemsEnabled();
	}

	@Override
	public boolean isEnabled(int i) {
		return mInnerAdapter.isEnabled(i);
	}

	@Override
	public void registerDataSetObserver(DataSetObserver dataSetObserver) {
		mInnerAdapter.registerDataSetObserver(dataSetObserver);
	}

	@Override
	public void unregisterDataSetObserver(DataSetObserver dataSetObserver) {
		mInnerAdapter.unregisterDataSetObserver(dataSetObserver);
	}

	@Override
	public int getCount() {
		return mInnerAdapter.getCount();
	}

	@Override
	public Object getItem(int i) {
		return mInnerAdapter.getItem(i);
	}

	@Override
	public long getItemId(int i) {
		return mInnerAdapter.getItemId(i);
	}

	@Override
	public boolean hasStableIds() {
		return mInnerAdapter.hasStableIds();
	}

	@Override
	public View getView(int i, View view, ViewGroup viewGroup) {
		View convertView = mInnerAdapter.getView(i, view, viewGroup);
		mViewToItemIdMap.put(convertView, getItemId(i));
		mHeaderIdToViewMap.add((int) getHeaderId(i), convertView);
		if (mCollapseHeaderIds.contains(getHeaderId(i))) {
			convertView.setVisibility(View.GONE);
		} else {
			convertView.setVisibility(View.VISIBLE);
		}
		return convertView;
	}

	@Override
	public int getItemViewType(int i) {
		return mInnerAdapter.getItemViewType(i);
	}

	@Override
	public int getViewTypeCount() {
		return mInnerAdapter.getViewTypeCount();
	}

	@Override
	public boolean isEmpty() {
		return mInnerAdapter.isEmpty();
	}

	public List<View> getItemViewsByHeaderId(long headerId) {
		return mHeaderIdToViewMap.get((int) headerId);
	}

	public boolean isHeaderCollapsed(long headerId) {
		return mCollapseHeaderIds.contains(headerId);
	}

	public void expand(long headerId) {
		if (isHeaderCollapsed(headerId)) {
			mCollapseHeaderIds.remove((Object) headerId);
		}
	}

	public void collapse(long headerId) {
		if (!isHeaderCollapsed(headerId)) {
			mCollapseHeaderIds.add(headerId);
		}
	}

	public View findViewByItemId(long itemId) {
		return mViewToItemIdMap.getKey(itemId);
	}

	public long findItemIdByView(View view) {
		return mViewToItemIdMap.get(view);
	}
}
