package net.oschina.app.ui;

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

import net.oschina.app.AppContext;
import net.oschina.app.AppException;
import net.oschina.app.R;
import net.oschina.app.adapter.ListViewFriendAdapter;
import net.oschina.app.bean.FriendList;
import net.oschina.app.bean.FriendList.Friend;
import net.oschina.app.bean.Notice;
import net.oschina.app.common.UIHelper;
import net.oschina.app.widget.PullToRefreshListView;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 用户关注、粉丝
 * @author liux (http://my.oschina.net/liux)
 * @version 1.0
 * @created 2012-3-21
 */
public class UserFriend extends BaseActivity {

	private ImageView mBack;
	private ProgressBar mProgressbar;
	
	private Button friend_type_fans;
	private Button friend_type_follower;
	
	private PullToRefreshListView mlvFriend;
	private ListViewFriendAdapter lvFriendAdapter;
	private List<Friend> lvFriendData = new ArrayList<Friend>();
	private View lvFriend_footer;
	private TextView lvFriend_foot_more;
	private ProgressBar lvFriend_foot_progress;
    private Handler mFriendHandler;
    private int lvSumData;
	
	private int curLvCatalog;
	private int curLvDataState;
    
	private final static int DATA_LOAD_ING = 0x001;
	private final static int DATA_LOAD_COMPLETE = 0x002;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_friend);
        
        this.initView();
        
        this.initData();
	}
	
    /**
     * 头部按钮展示
     * @param type
     */
    private void headButtonSwitch(int type) {
    	switch (type) {
    	case DATA_LOAD_ING:
			mProgressbar.setVisibility(View.VISIBLE);
			break;
		case DATA_LOAD_COMPLETE:
			mProgressbar.setVisibility(View.GONE);
			break;
		}
    }
	
	//初始化视图控件
    private void initView()
    {	
    	mBack = (ImageView)findViewById(R.id.friend_head_back);
    	mBack.setOnClickListener(UIHelper.finish(this));
    	mProgressbar = (ProgressBar)findViewById(R.id.friend_head_progress);
    	
    	friend_type_fans = (Button)findViewById(R.id.friend_type_fans);
    	friend_type_follower = (Button)findViewById(R.id.friend_type_follower);
    	
    	friend_type_fans.setOnClickListener(this.friendBtnClick(friend_type_fans,FriendList.TYPE_FANS));
    	friend_type_follower.setOnClickListener(this.friendBtnClick(friend_type_follower,FriendList.TYPE_FOLLOWER));
    	
    	//设置当前分类
    	curLvCatalog = getIntent().getIntExtra("friend_type", FriendList.TYPE_FOLLOWER);
    	if(curLvCatalog == FriendList.TYPE_FANS) {
        	friend_type_fans.setEnabled(false);
    	} else {
    		friend_type_follower.setEnabled(false);
    	}
    	
    	//设置粉丝与关注的数量
    	int followers = getIntent().getIntExtra("friend_followers", 0);
    	int fans = getIntent().getIntExtra("friend_fans", 0);
    	friend_type_follower.setText(getString(R.string.user_friend_follower, followers));
    	friend_type_fans.setText(getString(R.string.user_friend_fans, fans));
    	
    	lvFriend_footer = getLayoutInflater().inflate(R.layout.listview_footer, null);
    	lvFriend_foot_more = (TextView)lvFriend_footer.findViewById(R.id.listview_foot_more);
    	lvFriend_foot_progress = (ProgressBar)lvFriend_footer.findViewById(R.id.listview_foot_progress);

    	lvFriendAdapter = new ListViewFriendAdapter(this, lvFriendData, R.layout.friend_listitem); 
    	mlvFriend = (PullToRefreshListView)findViewById(R.id.friend_listview);
    	
    	mlvFriend.addFooterView(lvFriend_footer);//添加底部视图  必须在setAdapter前
    	mlvFriend.setAdapter(lvFriendAdapter); 
    	mlvFriend.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        		//点击头部、底部栏无效
        		if(position == 0 || view == lvFriend_footer) return;
        		
    			TextView name = (TextView)view.findViewById(R.id.friend_listitem_name);
    			Friend friend = (Friend)name.getTag();

        		if(friend == null) return;
        		
        		//跳转
        		UIHelper.showUserCenter(view.getContext(), friend.getUserid(), friend.getName());
        	}
		});
    	mlvFriend.setOnScrollListener(new AbsListView.OnScrollListener() {
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				mlvFriend.onScrollStateChanged(view, scrollState);
				
				//数据为空--不用继续下面代码了
				if(lvFriendData.size() == 0) return;
				
				//判断是否滚动到底部
				boolean scrollEnd = false;
				try {
					if(view.getPositionForView(lvFriend_footer) == view.getLastVisiblePosition())
						scrollEnd = true;
				} catch (Exception e) {
					scrollEnd = false;
				}
				
				if(scrollEnd && curLvDataState==UIHelper.LISTVIEW_DATA_MORE)
				{
					mlvFriend.setTag(UIHelper.LISTVIEW_DATA_LOADING);
					lvFriend_foot_more.setText(R.string.load_ing);
					lvFriend_foot_progress.setVisibility(View.VISIBLE);
					//当前pageIndex
					int pageIndex = lvSumData/20;
					loadLvFriendData(curLvCatalog, pageIndex, mFriendHandler, UIHelper.LISTVIEW_ACTION_SCROLL);
				}
			}
			public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
				mlvFriend.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
			}
		});
    	mlvFriend.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
			public void onRefresh() {
				loadLvFriendData(curLvCatalog, 0, mFriendHandler, UIHelper.LISTVIEW_ACTION_REFRESH);
            }
        });
    }
    
    //初始化控件数据
  	private void initData()
  	{	
		mFriendHandler = new Handler()
		{
			public void handleMessage(Message msg) {
				
				headButtonSwitch(DATA_LOAD_COMPLETE);

				if(msg.what >= 0){						
					FriendList list = (FriendList)msg.obj;
					Notice notice = list.getNotice();
					//处理listview数据
					switch (msg.arg1) {
					case UIHelper.LISTVIEW_ACTION_INIT:
					case UIHelper.LISTVIEW_ACTION_REFRESH:
					case UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG:
						lvSumData = msg.what;
						lvFriendData.clear();//先清除原有数据
						lvFriendData.addAll(list.getFriendlist());
						break;
					case UIHelper.LISTVIEW_ACTION_SCROLL:
						lvSumData += msg.what;
						if(lvFriendData.size() > 0){
							for(Friend friend1 : list.getFriendlist()){
								boolean b = false;
								for(Friend friend2 : lvFriendData){
									if(friend1.getUserid() == friend2.getUserid()){
										b = true;
										break;
									}
								}
								if(!b) lvFriendData.add(friend1);
							}
						}else{
							lvFriendData.addAll(list.getFriendlist());
						}
						break;
					}	
					
					if(msg.what < 20){
						curLvDataState = UIHelper.LISTVIEW_DATA_FULL;
						lvFriendAdapter.notifyDataSetChanged();
						lvFriend_foot_more.setText(R.string.load_full);
					}else if(msg.what == 20){					
						curLvDataState = UIHelper.LISTVIEW_DATA_MORE;
						lvFriendAdapter.notifyDataSetChanged();
						lvFriend_foot_more.setText(R.string.load_more);
					}
					//发送通知广播
					if(notice != null){
						UIHelper.sendBroadCast(UserFriend.this, notice);
					}
				}
				else if(msg.what == -1){
					//有异常--显示加载出错 & 弹出错误消息
					curLvDataState = UIHelper.LISTVIEW_DATA_MORE;
					lvFriend_foot_more.setText(R.string.load_error);
					((AppException)msg.obj).makeToast(UserFriend.this);
				}
				if(lvFriendData.size()==0){
					curLvDataState = UIHelper.LISTVIEW_DATA_EMPTY;
					lvFriend_foot_more.setText(R.string.load_empty);
				}
				lvFriend_foot_progress.setVisibility(View.GONE);
				if(msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH){
					mlvFriend.onRefreshComplete(getString(R.string.pull_to_refresh_update) + new Date().toLocaleString());
					mlvFriend.setSelection(0);
				}else if(msg.arg1 == UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG){
					mlvFriend.onRefreshComplete();
					mlvFriend.setSelection(0);
				}
			}
		};
		this.loadLvFriendData(curLvCatalog,0,mFriendHandler,UIHelper.LISTVIEW_ACTION_INIT);
  	}
  	
    /**
     * 线程加载好友列表数据
     * @param type 0:显示自己的粉丝 1:显示自己的关注者
     * @param pageIndex 当前页数
     * @param handler 处理器
     * @param action 动作标识
     */
	private void loadLvFriendData(final int type,final int pageIndex,final Handler handler,final int action){  
		headButtonSwitch(DATA_LOAD_ING);
		new Thread(){
			public void run() {
				Message msg = new Message();
				boolean isRefresh = false;
				if(action == UIHelper.LISTVIEW_ACTION_REFRESH || action == UIHelper.LISTVIEW_ACTION_SCROLL)
					isRefresh = true;
				try {
					FriendList FriendList = ((AppContext)getApplication()).getFriendList(type, pageIndex, isRefresh);
					msg.what = FriendList.getFriendlist().size();
					msg.obj = FriendList;
	            } catch (AppException e) {
	            	e.printStackTrace();
	            	msg.what = -1;
	            	msg.obj = e;
	            }
				msg.arg1 = action;//告知handler当前action
				if(curLvCatalog == type)
					handler.sendMessage(msg);
			}
		}.start();
	} 
	
	private View.OnClickListener friendBtnClick(final Button btn,final int catalog){
    	return new View.OnClickListener() {
			public void onClick(View v) {
		    	if(btn == friend_type_fans)
		    		friend_type_fans.setEnabled(false);
		    	else
		    		friend_type_fans.setEnabled(true);
		    	if(btn == friend_type_follower)
		    		friend_type_follower.setEnabled(false);
		    	else
		    		friend_type_follower.setEnabled(true);		    	
		    	
				lvFriend_foot_more.setText(R.string.load_more);
				lvFriend_foot_progress.setVisibility(View.GONE);
				
				curLvCatalog = catalog;
				loadLvFriendData(curLvCatalog, 0, mFriendHandler, UIHelper.LISTVIEW_ACTION_CHANGE_CATALOG);		    	
			}
		};
    }
}
