package vell.bibi.vsigner.view;

import java.util.List;

import vell.bibi.vsigner.CreateOwnChannelActivity;
import vell.bibi.vsigner.OwnChannelDetailActivity;
import vell.bibi.vsigner.R;
import vell.bibi.vsigner.adapter.BaseAdapterHelper;
import vell.bibi.vsigner.adapter.QuickAdapter;
import vell.bibi.vsigner.config.Constants;
import vell.bibi.vsigner.model.Channel;
import vell.bibi.vsigner.view.pullable.PullToRefreshLayout;
import vell.bibi.vsigner.view.pullable.PullToRefreshLayout.OnRefreshListener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.UpdateListener;

public class OwnChannelFragment extends BaseFragment{
	
	private QuickAdapter<Channel> mOwnChannelAdapter;
	
	private ListView mOwnChannelListView;
	private ImageButton mCreateOwnChannelImageButton;
	
	private PullToRefreshLayout mPullToRefreshLayout;
	
	// 双击事件记录最近一次点击的位置
	private int lastClickPos;
	// 双击事件记录最近一次点击的时间
	private long lastClickTime;
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_own_channel, container, false);
	}

	@Override
	public void initViews() {
		mOwnChannelListView = (ListView) findViewById(R.id.lv_own_channel);
		mPullToRefreshLayout = (PullToRefreshLayout) findViewById(R.id.ptrl_own_channel);
		mCreateOwnChannelImageButton = (ImageButton) findViewById(R.id.ib_create_own_channel);
	}

	@Override
	public void initListeners() {
		mCreateOwnChannelImageButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				startActivity(new Intent(mContext, CreateOwnChannelActivity.class));
			}
		});
		mPullToRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
			@Override
			public void onRefresh(PullToRefreshLayout pullToRefreshLayout) {
				refreshData();
			}
			
			@Override
			public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) {
				mPullToRefreshLayout.loadmoreFinish(PullToRefreshLayout.SUCCEED);
			}
		});
		
		mOwnChannelListView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(final AdapterView<?> parent, final View view, final int pos,
					final long id) {
				if (lastClickPos == pos &&
						Math.abs(lastClickTime-System.currentTimeMillis()) < Constants.DOUBLE_CLICK_TIME) {
					lastClickPos = -1;
					lastClickTime = 0;
				} else {
					lastClickPos = pos;
					lastClickTime = System.currentTimeMillis();
					new Handler().postDelayed(new Runnable(){
					    public void run() {
					    	if(lastClickTime == 0) {
					    		System.out.println("double click");
					    	} else {
					    		itemSingleClick(parent, view, pos, id);
							}
					    }
					 }, Constants.DOUBLE_CLICK_TIME);
				}
			}
		});
		
		// 长按修改签到isActive属性
		mOwnChannelListView.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view, int pos,
					long id) {
				changeIsActive(mOwnChannelAdapter.getItem(pos));
				return true;
			}
		});
	}

	@Override
	public void initData() {
		if(mOwnChannelAdapter == null) {
			mOwnChannelAdapter = new QuickAdapter<Channel>(mContext, R.layout.item_channel) {
				@Override
				protected void convert(BaseAdapterHelper helper, Channel channel) {
					helper.setText(R.id.tv_channel_name, channel.getName())
						.setText(R.id.tv_manager_name, String.format(getString(R.string.user_name_format), 
								channel.getManager().getRealname(),
								channel.getManager().getUsername()))
						.setText(R.id.tv_channel_info, channel.getInfo())
						.setText(R.id.tv_channel_manager_phone, channel.getManager().getPhoneNumber())
						.setText(R.id.tv_channel_updated_time, channel.getUpdatedAt());
					if(channel.isActive()) { // 正在签到
						helper.setBackgroundColor(R.id.ll_channel_item, getResources().getColor(R.color.channel_is_active_bg))
							.setVisible(R.id.tv_is_active, true);
					} else {
						helper.setBackgroundColor(R.id.ll_channel_item, getResources().getColor(R.color.channel_not_active_bg))
							.setVisible(R.id.tv_is_active, false);
					}
				}
			};
			mOwnChannelListView.setAdapter(mOwnChannelAdapter);
		}
		
		refreshData();
		
		mBaseActivity.registerReceiver(new OwnChannelBroadcastRecevier(), new IntentFilter(OwnChannelBroadcastRecevier.ACTION));
	}
	
	public void refreshData() {
		BmobQuery<Channel> channelQuery = new BmobQuery<Channel>();
		channelQuery.addWhereEqualTo(Channel.MANAGER_KEY, mCurrentUser.getObjectId());
		channelQuery.include(Channel.MANAGER_KEY);
		channelQuery.setLimit(Constants.QUERY_MAX_NUMBER);
		channelQuery.order("-" + Channel.IS_ACTIVE_KEY + ",-" + Constants.UPDATED_AT_KEY);
		channelQuery.findObjects(mContext, new FindListener<Channel>() {
			@Override
			public void onSuccess(List<Channel> channels) {
				mOwnChannelAdapter.clear();
				mOwnChannelAdapter.addAll(channels);
				mPullToRefreshLayout.refreshFinish(PullToRefreshLayout.SUCCEED);
			}
			
			@Override
			public void onError(int arg0, String msg) {
				mPullToRefreshLayout.refreshFinish(PullToRefreshLayout.FAIL);
			}
		});
	}
	
	/**
	 * 改变channel的isActive属性
	 * @param channel
	 */
	private void changeIsActive(final Channel channel) {
		String msg;
		if (channel.isActive()) {
			msg = String.format(getString(R.string.whether_close_sign_format), channel.getName());
		} else {
			msg = String.format(getString(R.string.whether_open_sign_format), channel.getName());
		}
		TipsDialog tipsDialog = new TipsDialog(mContext, msg, getString(R.string.ok), getString(R.string.cancel));
		// 按下确认按钮
		tipsDialog.SetOnSuccessListener(new android.content.DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface arg0, int arg1) {
				if (channel.isActive()) {
					channel.setActive(false);
				} else {
					channel.setActive(true);
				}
				mBaseActivity.showProgressDialog(getString(R.string.request_server));
				channel.update(mContext, new UpdateListener() {
					@Override
					public void onSuccess() {
						refreshData();
						mBaseActivity.hideProgressDialog();
					}
					@Override
					public void onFailure(int arg0, String msg) {
						new TipsDialog(mContext, getString(R.string.server_update_error_tips) + ": " + msg, getString(R.string.ok)).show();
						mBaseActivity.hideProgressDialog();
					}
				});
			}
		});
		
		tipsDialog.show();
	}
	
	/**
	 * ListView 单击事件
	 * @param parent
	 * @param view
	 * @param pos
	 * @param id
	 */
	private void itemSingleClick(AdapterView<?> parent, View view, final int pos,
			long id) {
		Intent intent = new Intent(mContext, OwnChannelDetailActivity.class);
		intent.putExtra(Constants.CHANNEL_KEY, mOwnChannelAdapter.getItem(pos));
		startActivity(intent);
	}
	
	/**
	 * 消息接收器
	 * @author VellBibi
	 *
	 * @date Jan 23, 2015
	 */
	public class OwnChannelBroadcastRecevier extends BroadcastReceiver {
		public static final String ACTION = "vell.bibi.vsigner.intent.action.ownChannelChanged";
		@Override
		public void onReceive(Context context, Intent intent) {
			refreshData();
		}
	}
}