package com.ikantech.yiim.ui;

import java.io.File;

import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.ikantech.support.ui.YiFragmentBaseActivity;
import com.ikantech.support.util.YiFileUtils;
import com.ikantech.support.util.YiPrefsKeeper;
import com.ikantech.yiim.R;
import com.ikantech.yiim.app.YiIMApplication;
import com.ikantech.yiim.common.UserInfo;
import com.ikantech.yiim.common.YiIMConfig;
import com.ikantech.yiim.frag.AboutFragment;
import com.ikantech.yiim.frag.ConversationFragment;
import com.ikantech.yiim.frag.FriendFragment;
import com.ikantech.yiim.frag.SettingsFragment;
import com.ikantech.yiim.frag.SideMenuFragment;
import com.ikantech.yiim.frag.UserInfoSetFragment;
import com.ikantech.yiim.frag.SideMenuFragment.OnMenuStateChangeListener;
import com.ikantech.yiim.provider.ConversationManager.ConversationColumns;
import com.ikantech.yiim.provider.MsgManager.MsgColumns;
import com.ikantech.yiim.service.XmppService.XmppBinder;
import com.ikantech.yiim.util.StringUtils;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivityBase;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivityHelper;

public class MainActivity extends YiFragmentBaseActivity implements
		SlidingActivityBase {
	private static final int MSG_CHECK_XMPP_SERVICE = 0x01;

	private int mMenuMode = SlidingMenu.LEFT_RIGHT;

	private SlidingActivityHelper mHelper;
	private Fragment mContent;
	private SideMenuFragment mLeftMenu;
	private SideMenuFragment mRightMenu;

	private TextView mTitleTextView;
	private Button mTitleRightBtn;
	private Button mTitleBackBtn;
	private ImageButton mTitleLeftImgBtn;
	private ImageButton mTitleRightImgBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mHelper = new SlidingActivityHelper(this);
		mHelper.onCreate(savedInstanceState);

		mContent = null;
		if (savedInstanceState != null)
			mContent = getSupportFragmentManager().getFragment(
					savedInstanceState, "mContent");
		// if (mContent == null)
		// mContent = new ColorFragment(R.color.red);

		// set the Above View
		setContentView(R.layout.side_menu_content_frame);
		// getSupportFragmentManager().beginTransaction()
		// .replace(R.id.content_frame, mContent).commit();
		SlidingMenu sm = getSlidingMenu();
		sm.setShadowWidthRes(R.dimen.shadow_width);
		sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
		sm.setFadeDegree(0.35f);
		sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
		sm.setMode(mMenuMode);

		switch (mMenuMode) {
		case SlidingMenu.LEFT:
			setupLeftMenu();
			break;
		case SlidingMenu.RIGHT:
			setupRightMenu();
			break;
		case SlidingMenu.LEFT_RIGHT:
			setupSideMenu();
			break;
		default:
			break;
		}
		if (mLeftMenu != null && mRightMenu != null) {
			mLeftMenu
					.setMenuStateChangeListener(new OnMenuStateChangeListener() {

						@Override
						public void onSelectionChanged(int section, int position) {
							// TODO Auto-generated method stub
							mRightMenu.setSection(section, position);
						}

						@Override
						public void onScrollChanged(int scrollX, int scrollY) {
							// TODO Auto-generated method stub
							mRightMenu.setScroll(scrollX, scrollY);
						}
					});
			mRightMenu
					.setMenuStateChangeListener(new OnMenuStateChangeListener() {

						@Override
						public void onSelectionChanged(int section, int position) {
							// TODO Auto-generated method stub
							mLeftMenu.setSection(section, position);
						}

						@Override
						public void onScrollChanged(int scrollX, int scrollY) {
							// TODO Auto-generated method stub
							mLeftMenu.setScroll(scrollX, scrollY);
						}
					});
		}

		YiIMConfig config = YiIMConfig.getInstance();
		config.setExited(false);
		YiPrefsKeeper.write(this, config);

		if (getXmppService() == null) {
			getHandler().sendEmptyMessageDelayed(MSG_CHECK_XMPP_SERVICE, 200);
		} else {
			startXmpp();
		}
	}

	private void startXmpp() {
		getXmppService().checkIfNeedAutoLogin();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		if (getXmppService() != null) {
			onXmppServiceStarted();
		}
	}

	private XmppBinder getXmppService() {
		YiIMApplication yiIMApplication = (YiIMApplication) getApplication();
		return yiIMApplication.getXmppService();
	}

	private void setupLeftMenu() {
		SlidingMenu sm = getSlidingMenu();
		setBehindContentView(R.layout.left_menu_frame);
		sm.setShadowDrawable(R.drawable.left_menu_shadow);
		mLeftMenu = new SideMenuFragment();
		mLeftMenu.setMode(SlidingMenu.LEFT);
		// set the Behind View
		getSupportFragmentManager().beginTransaction()
				.replace(R.id.left_menu_frame, mLeftMenu).commit();
	}

	private void setupRightMenu() {
		SlidingMenu sm = getSlidingMenu();
		setBehindContentView(R.layout.right_menu_frame);
		sm.setShadowDrawable(R.drawable.right_menu_shadow);
		mRightMenu = new SideMenuFragment();
		mRightMenu.setMode(SlidingMenu.RIGHT);
		// set the Behind View
		getSupportFragmentManager().beginTransaction()
				.replace(R.id.right_menu_frame, mRightMenu).commit();
	}

	private void setupSideMenu() {
		SlidingMenu sm = getSlidingMenu();
		setupLeftMenu();

		sm.setSecondaryMenu(R.layout.right_menu_frame);
		sm.setSecondaryShadowDrawable(R.drawable.right_menu_shadow);
		mRightMenu = new SideMenuFragment();
		mRightMenu.setMode(SlidingMenu.RIGHT);
		// set the Behind View
		getSupportFragmentManager().beginTransaction()
				.replace(R.id.right_menu_frame, mRightMenu).commit();
	}

	@Override
	public void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		mHelper.onPostCreate(savedInstanceState);
	}

	@Override
	public View findViewById(int id) {
		View v = super.findViewById(id);
		if (v != null)
			return v;
		return mHelper.findViewById(id);
	}

	public void reloadUserInfo() {
		if (mLeftMenu != null) {
			mLeftMenu.loadUserInfo(getXmppService());
		}
		if (mRightMenu != null) {
			mRightMenu.loadUserInfo(getXmppService());
		}
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		mHelper.onSaveInstanceState(outState);
		getSupportFragmentManager().putFragment(outState, "mContent", mContent);
	}

	@Override
	public void setContentView(int id) {
		setContentView(getLayoutInflater().inflate(id, null));
	}

	@Override
	public void setContentView(View v) {
		setContentView(v, new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT));
	}

	@Override
	public void setContentView(View v, LayoutParams params) {
		requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
		super.setContentView(R.layout.activity_custom_title);
		getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
				R.layout.layout_title_bar);

		LinearLayout l = (LinearLayout) findViewById(R.id.main_layout);
		l.addView(v, params);
		mHelper.registerAboveContentView(l, params);

		mTitleTextView = (TextView) findViewById(R.id.title_bar_title);
		mTitleBackBtn = (Button) findViewById(R.id.title_back_btn);
		mTitleRightBtn = (Button) findViewById(R.id.title_right_btn);
		mTitleRightImgBtn = (ImageButton) findViewById(R.id.title_right_img_btn);
		mTitleLeftImgBtn = (ImageButton) findViewById(R.id.title_left_img_btn);

		mTitleBackBtn.setVisibility(View.GONE);
	}

	@Override
	public void processHandlerMessage(Message msg) {
		// TODO Auto-generated method stub
		switch (msg.what) {
		case MSG_CHECK_XMPP_SERVICE:
			XmppBinder binder = getXmppService();
			if (binder == null) {
				getHandler().sendEmptyMessageDelayed(MSG_CHECK_XMPP_SERVICE,
						200);
			} else {
				startXmpp();
				// onXmppServiceStarted();
			}
			break;
		default:
			break;
		}
	}

	@Override
	public void setBehindContentView(View view, LayoutParams layoutParams) {
		// TODO Auto-generated method stub
		mHelper.setBehindContentView(view, layoutParams);
	}

	@Override
	public void setBehindContentView(View view) {
		// TODO Auto-generated method stub
		setBehindContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT));
	}

	@Override
	public void setBehindContentView(int layoutResID) {
		// TODO Auto-generated method stub
		setBehindContentView(getLayoutInflater().inflate(layoutResID, null));
	}

	@Override
	public SlidingMenu getSlidingMenu() {
		// TODO Auto-generated method stub
		return mHelper.getSlidingMenu();
	}

	@Override
	public void toggle() {
		// TODO Auto-generated method stub
		mHelper.toggle();
	}

	@Override
	public void showContent() {
		// TODO Auto-generated method stub
		mHelper.showContent();
	}

	@Override
	public void showMenu() {
		// TODO Auto-generated method stub
		mHelper.showMenu();
	}

	@Override
	public void showSecondaryMenu() {
		// TODO Auto-generated method stub
		mHelper.showSecondaryMenu();
	}

	@Override
	public void setSlidingActionBarEnabled(boolean slidingActionBarEnabled) {
		// TODO Auto-generated method stub
		mHelper.setSlidingActionBarEnabled(slidingActionBarEnabled);
	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		boolean b = mHelper.onKeyUp(keyCode, event);
		if (b)
			return b;
		return super.onKeyUp(keyCode, event);
	}

	public void switchContent(Fragment fragment) {
		if (mContent == fragment)
			return;
		mContent = fragment;

		mTitleBackBtn.setVisibility(View.GONE);
		mTitleLeftImgBtn.setVisibility(View.GONE);
		mTitleRightImgBtn.setVisibility(View.GONE);
		mTitleRightBtn.setVisibility(View.GONE);

		if (mContent instanceof ConversationFragment) {
			setTitleRes(R.string.str_chats);
		} else if (mContent instanceof FriendFragment) {
			setTitleRes(R.string.str_contacts);
		} else if (mContent instanceof SettingsFragment) {
			setTitleRes(R.string.str_settings);
		} else if (mContent instanceof UserInfoSetFragment) {
			setTitleRes(R.string.str_personal_info);
		} else if (mContent instanceof AboutFragment) {
			setTitleRes(R.string.str_about);
		}

		getSupportFragmentManager().beginTransaction()
				.replace(R.id.content_frame, fragment).commit();
		getSlidingMenu().showContent();
	}

	public void setTitleBarRightBtnText(String lab) {
		if (lab != null && lab.length() > 1) {
			mTitleRightBtn.setText(lab);
			mTitleRightBtn.setVisibility(View.VISIBLE);
		} else {
			mTitleRightBtn.setVisibility(View.GONE);
		}
	}

	public void setTitleBarLeftBtnText(String lab) {
		if (lab != null && lab.length() > 1) {
			mTitleBackBtn.setText(lab);
			mTitleBackBtn.setVisibility(View.VISIBLE);
		} else {
			mTitleBackBtn.setVisibility(View.GONE);
		}
	}

	public void setTitleBarRightImageBtnSrc(int srcId) {
		if (srcId != -1) {
			mTitleRightImgBtn.setImageDrawable(getResources()
					.getDrawable(srcId));
			mTitleRightImgBtn.setVisibility(View.VISIBLE);
		} else {
			mTitleRightImgBtn.setVisibility(View.GONE);
		}
	}

	public void setTitleBarLeftImageBtnSrc(int srcId) {
		if (srcId != -1) {
			mTitleLeftImgBtn
					.setImageDrawable(getResources().getDrawable(srcId));
			mTitleLeftImgBtn.setVisibility(View.VISIBLE);
		} else {
			mTitleLeftImgBtn.setVisibility(View.GONE);
		}
	}

	public void onTitleBarLeftBtnClick(View view) {
		// TODO Auto-generated method stub
	}

	public void onTitleBarLeftImgBtnClick(View view) {
		// TODO Auto-generated method stub

	}

	public void onTitleBarRightBtnClick(View view) {
		// TODO Auto-generated method stub

	}

	public void onTitleBarRightImgBtnClick(View view) {
		// TODO Auto-generated method stub
		if (mContent instanceof FriendFragment) {
			((FriendFragment) mContent).onTitleBarRightImgBtnClick(view);
		}

	}

	private void setTitleRes(int res) {
		mTitleTextView.setText(res);
	}

	/**
	 * 用户自行登录
	 */
	private void manualLogin() {
		getXmppService().removeNotification();
		YiIMConfig config = YiIMConfig.getInstance();
		config.setExited(true);
		YiPrefsKeeper.write(MainActivity.this, config);

		UserInfo userInfo = UserInfo.getUserInfo(this);
		if (userInfo != null) {
			userInfo.setAutoLogin(false);
			YiPrefsKeeper.write(this, userInfo);
		}

		getXmppService().stopXmppService(null);

		Intent intent = new Intent(MainActivity.this, LoginActivity.class);
		startActivity(intent);
		finish();
	}

	public void exit() {
		showContent();
		showMsgDialog(null, getString(R.string.str_exit_confirm),
				getString(R.string.str_ok), getString(R.string.str_cancel),
				new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						getXmppService().removeNotification();
						YiIMApplication application = (YiIMApplication) getApplication();
						application.setLogin(false);
						YiIMConfig config = YiIMConfig.getInstance();
						config.setExited(true);
						YiPrefsKeeper.write(MainActivity.this, config);

						getXmppService().stopXmppService(null);
						finish();
					}
				}, null);
	}

	protected void onXmppServiceStarted() {
		if (mContent != null && mContent instanceof ConversationFragment) {
			((ConversationFragment) mContent).setXmppBinder(getXmppService());
			((ConversationFragment) mContent).loadConversations();
		}
		reloadUserInfo();
		getXmppService().updateNotification();
	}

	public void onExitLoginClick(View v) {
		manualLogin();
	}

	public void onMsgTipSetClick(View v) {
		Intent intent = new Intent(MainActivity.this,
				MsgTipSettingActivity.class);
		startActivity(intent);
	}

	public void onClearChatRecordClick(View v) {
		showMsgDialog(null, getString(R.string.tip_clear_chat_record),
				getString(R.string.str_yes), getString(R.string.str_no),
				new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						getXmppService().execute(new Runnable() {
							@Override
							public void run() {
								// TODO Auto-generated method stub
								try {
									String currentUser = UserInfo.getUserInfo(
											getXmppService()
													.getServiceContext())
											.getUser();
									String whereString = " like '"
											+ currentUser + "%'";
									getContentResolver().delete(
											ConversationColumns.CONTENT_URI,
											ConversationColumns.USER
													+ whereString, null);
									getContentResolver().delete(
											MsgColumns.CONTENT_URI,
											MsgColumns.SENDER + whereString
													+ " OR "
													+ MsgColumns.RECEIVER
													+ whereString, null);

									File file = new File(
											YiFileUtils.getStorePath()
													+ "yiim/"
													+ StringUtils
															.escapeUserHost(currentUser));
									YiFileUtils.deleteFile(file);
								} catch (Exception e) {
									// TODO: handle exception
								}
							}
						});
					}
				}, null);
	}

	public void onClearConversationClick(View v) {
		showMsgDialog(null, getString(R.string.tip_clear_conversation),
				getString(R.string.str_yes), getString(R.string.str_no),
				new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						getXmppService().execute(new Runnable() {
							@Override
							public void run() {
								// TODO Auto-generated method stub
								try {
									String currentUser = UserInfo.getUserInfo(
											getXmppService()
													.getServiceContext())
											.getUser();
									String whereString = " like '"
											+ currentUser + "%'";
									getContentResolver().delete(
											ConversationColumns.CONTENT_URI,
											ConversationColumns.USER
													+ whereString, null);
								} catch (Exception e) {
									// TODO: handle exception
								}
							}
						});
					}
				}, null);
	}
}