package net.cgt.weixin.view.adapter;

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

import net.cgt.weixin.R;
import net.cgt.weixin.domain.User;
import net.cgt.weixin.domain.pinyin.LanguageComparator_CN;
import net.cgt.weixin.view.pinyin.AssortPinyinList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class PinyinAdapter extends BaseExpandableListAdapter {
	/**
	 * 要被排序的集合
	 */
	private List<User> mList;

	private AssortPinyinList mAssortPinyinList = new AssortPinyinList();

	private Context context;

	private LayoutInflater inflater;
	// 中文排序
	private LanguageComparator_CN<String> cnSort_str = new LanguageComparator_CN<String>();
	private LanguageComparator_CN<User> cnSort_user = new LanguageComparator_CN<User>();

	public PinyinAdapter(Context context, List<User> userList) {
		super();
		this.context = context;
		this.inflater = LayoutInflater.from(context);
		this.mList = userList;
		if (userList == null) {
			userList = new ArrayList<User>();
		}

		//		long time = System.currentTimeMillis();
		// 排序
		sort();
		//		Toast.makeText(context, String.valueOf(System.currentTimeMillis() - time), 1).show();
	}

	private void sort() {
		// 分类
		for (int i = 0; i < mList.size(); i++) {
			mAssortPinyinList.getHashList().add(mList.get(i));
		}
		mAssortPinyinList.getHashList().sortKeyComparator(cnSort_str);
		for (int i = 0, length = mAssortPinyinList.getHashList().size(); i < length; i++) {
			Collections.sort((mAssortPinyinList.getHashList().getValueListThroughIndex(i)), cnSort_user);
		}
	}

	@Override
	public int getGroupCount() {
		return mAssortPinyinList.getHashList().size();
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		//		if (groupPosition == 0) {
		//			return 4;
		//		}
		return mAssortPinyinList.getHashList().getValueListThroughIndex(groupPosition).size();
	}

	@Override
	public Object getGroup(int groupPosition) {
		//		if (groupPosition == 0) {
		//			List<User> mList_top = new ArrayList<User>();
		//			User user1 = new User();
		//			user1.setUserAccount(context.getResources().getString(R.string.text_addressbook_newFriend));
		//			user1.setUserPhote(String.valueOf(R.drawable.cgt_addressbook_newfriend));
		//			User user2 = new User();
		//			user2.setUserAccount(context.getResources().getString(R.string.text_addressbook_newFriend));
		//			user2.setUserPhote(String.valueOf(R.drawable.cgt_addressbook_newfriend));
		//			User user3 = new User();
		//			user3.setUserAccount(context.getResources().getString(R.string.text_addressbook_newFriend));
		//			user3.setUserPhote(String.valueOf(R.drawable.cgt_addressbook_newfriend));
		//			User user4 = new User();
		//			user4.setUserAccount(context.getResources().getString(R.string.text_addressbook_newFriend));
		//			user4.setUserPhote(String.valueOf(R.drawable.cgt_addressbook_newfriend));
		//			mList_top.add(user1);
		//			mList_top.add(user2);
		//			mList_top.add(user3);
		//			mList_top.add(user4);
		//			return mList_top;
		//		}
		return mAssortPinyinList.getHashList().getValueListThroughIndex(groupPosition);
	}

	@Override
	public Object getChild(int groupPosition, int childPosition) {
		//		if (groupPosition == 0) {
		//			return ((List<User>) getGroup(0)).get(childPosition);
		//		}
		return mAssortPinyinList.getHashList().getValueThroughIndexAndKey(groupPosition, childPosition);
	}

	@Override
	public long getGroupId(int groupPosition) {
		return groupPosition;
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		return childPosition;
	}

	@Override
	public boolean hasStableIds() {
		//无论Child是否有相同的ID都指向同一个对象
		//		这样说把. 通知ListView, 你id是唯一的. 不会重复,
		//		默认这个方法是返回false的, 需要返回true.  这样, 才能使用ListView的
		//		CHOICE_MODE_MULTIPLE, CHOICE_MODE_SINGLE, 通过getCheckedItemIds方法才能正常获取用户选中的选项的id, LZ可以试试看

		//		组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们。
		//	        返回值
		//		返回一个Boolean类型的值,如果为TRUE,意味着相同的ID永远引用相同的对象。
		return true;
	}

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.cgt_layout_addressbook_group_item, null);
			// 禁止伸展
			convertView.setClickable(true);//设置是否可以点击伸展
		}
		TextView mTv_addressbook_group_item = (TextView) convertView.findViewById(R.id.cgt_tv_addressbook_group_item);
		if (groupPosition == 0) {
			mTv_addressbook_group_item.setText("↑");
			mTv_addressbook_group_item.setVisibility(View.GONE);
		} else {
			mTv_addressbook_group_item.setText(mAssortPinyinList.getFirstChar(mAssortPinyinList.getHashList().getValueThroughIndexAndKey(groupPosition, 0)));
			mTv_addressbook_group_item.setVisibility(View.VISIBLE);
		}

		convertView.setTag(R.id.cgt_tv_addressbook_content, groupPosition);
		convertView.setTag(R.id.cgt_tv_addressbook_group_item, -1);

		return convertView;
	}

	@Override
	public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.cgt_layout_addressbook_item, null);
		}
		TextView mTv_userName = (TextView) convertView.findViewById(R.id.cgt_tv_userName);
		ImageView mIv_userPhoto = (ImageView) convertView.findViewById(R.id.cgt_iv_userPhoto);
		View mV_line = convertView.findViewById(R.id.cgt_v_line);
		if (groupPosition == 0) {
			switch (childPosition) {
			case 0:
				mTv_userName.setText(context.getResources().getString(R.string.text_addressbook_newFriend));
				mIv_userPhoto.setImageResource(R.drawable.cgt_addressbook_newfriend);
				break;
			case 1:
				mTv_userName.setText(context.getResources().getString(R.string.text_addressbook_groupChat));
				mIv_userPhoto.setImageResource(R.drawable.cgt_addressbook_groupchat);
				break;
			case 2:
				mTv_userName.setText(context.getResources().getString(R.string.text_addressbook_mark));
				mIv_userPhoto.setImageResource(R.drawable.cgt_addressbook_mark);
				break;
			case 3:
				mTv_userName.setText(context.getResources().getString(R.string.text_addressbook_publicNumber));
				mIv_userPhoto.setImageResource(R.drawable.cgt_addressbook_publicnumber);
				break;

			default:
				break;
			}
		} else {
			mTv_userName.setText(mAssortPinyinList.getHashList().getValueThroughIndexAndKey(groupPosition, childPosition).getUserAccount());
			String userPhote = mAssortPinyinList.getHashList().getValueThroughIndexAndKey(groupPosition, childPosition).getUserPhote();
			if (userPhote == null) {
				mIv_userPhoto.setImageResource(R.drawable.user_picture);
			} else {
				mIv_userPhoto.setImageResource(Integer.parseInt(mAssortPinyinList.getHashList().getValueThroughIndexAndKey(groupPosition, childPosition).getUserPhote()));
			}
		}
		if (isLastChild) {
			mV_line.setVisibility(View.GONE);
		} else {
			mV_line.setVisibility(View.VISIBLE);
		}

		convertView.setTag(R.id.cgt_tv_addressbook_content, groupPosition);
		convertView.setTag(R.id.cgt_tv_addressbook_group_item, childPosition);

		return convertView;
	}

	/**
	 * 是否选中指定位置上的子元素。
	 * 
	 * 参数
	 * 
	 * groupPosition 组位置(该组内部含有这个子元素)
	 * 
	 * childPosition 子元素位置
	 * 
	 * 返回值
	 * 
	 * 是否选中子元素
	 */
	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		return true;
	}

	public AssortPinyinList getAssort() {
		return mAssortPinyinList;
	}
}