package com.sshine.huochexing.base;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
import com.sshine.huochexing.R;
import com.sshine.huochexing.model.CustomDialog;
import com.sshine.huochexing.model.PullToRefreshView;
import com.sshine.huochexing.model.PullToRefreshView.OnFooterRefreshListener;
import com.sshine.huochexing.model.PullToRefreshView.OnHeaderRefreshListener;
import com.sshine.huochexing.utils.A6Util;
import com.sshine.huochexing.utils.HttpUtil;
import com.sshine.huochexing.utils.L;
import com.sshine.huochexing.value.SF;

import eu.inmite.android.lib.dialogs.ProgressDialogFragment;

public abstract class BaseAty extends SherlockFragmentActivity
	implements OnHeaderRefreshListener, OnFooterRefreshListener{

	protected DialogFragment mDlg;
	private ViewGroup mContainer, mContentView;
	private View mFooterLoadingView;
	
	private static final int REFRESH_TYPE_LOADING = 0;
	private static final int REFRESH_TYPE_PULL_DOWN = 1;
	private static final int REFRESH_TYPE_PULL_UP = 2;
	//刷新模式
	private int mRefreshType = REFRESH_TYPE_LOADING;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		L.d("onCreate:" + getClass().getSimpleName());
		initActionBar();
	}

	private void initActionBar() {
		ActionBar actBar = getSupportActionBar();
		actBar.setDisplayShowTitleEnabled(false);
		actBar.setDisplayShowHomeEnabled(true);
		actBar.setDisplayHomeAsUpEnabled(true);
		actBar.setDisplayShowTitleEnabled(true);
		actBar.setBackgroundDrawable(getResources().getDrawable(
				R.drawable.actionbar_tab_bg));
	}
	/**
	 * 只检测有无网络
	 * @return
	 */
	protected boolean startHandle(Runnable task) {
		if (!HttpUtil.isNetworkConnected(this)){
			Message msg = mHandler.obtainMessage(A6Util.MSG_TOAST);
			msg.obj = "网络不可用,请检测网络状态" + SF.NO_NETWORK;
			mHandler.sendMessage(msg);
			showContentView(false);
			return false;
		}else{
			new Thread(task).start();
			return true;
		}
	}
	@Override
	public void setTitle(CharSequence title) {
		getSupportActionBar().setTitle(title);
	}
	protected void showMsg(CharSequence strMsg) {
		Toast.makeText(this, strMsg, Toast.LENGTH_SHORT).show();
	}
	
	/**
	 * 只用于显示ProgressDialog
	 * @param strMsg
	 * @return 无网络时返回false
	 */
	protected boolean startHandle(String strMsg) {
		return startHandle(strMsg, null);
	}
	
	protected boolean checkNetwork() {
		if (!HttpUtil.isNetworkConnected(this)){
			Message msg = mHandler.obtainMessage(A6Util.MSG_TOAST);
			msg.obj = "网络不可用,请检测网络状态" + SF.NO_NETWORK;
			mHandler.sendMessage(msg);
			return false;
		}else{
			return true;
		}
	}
	protected boolean startHandle(String strMsg, Runnable task){
		if (strMsg == null){
			strMsg = getResources().getString(R.string.requestData);
		}
		if (checkNetwork()){
			Message msg = mHandler.obtainMessage(A6Util.MSG_START_PROGRESS);
			msg.obj = strMsg;
			mHandler.sendMessage(msg);
			showContentView(false);
			if (task != null){
				new Thread(task).start();
			}
			return true;
		}
		return false;
	}
	
	protected void showDlg(CharSequence csMsg) {
		//报错原因不明,暂时catch.
		try{
			CustomDialog dlg = new CustomDialog.Builder(this, null)
				.setTitle("提示")
				.setMessage(csMsg)
				.setPositiveButton("确定")
				.create();
			dlg.show();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	protected void sendToast(CharSequence csMsg){
		Message msg = mHandler.obtainMessage(A6Util.MSG_TOAST, csMsg);
		mHandler.sendMessage(msg);
		sendDismissDialog();
	}
	
	protected void sendDismissDialog() {
		mHandler.sendMessage(mHandler.obtainMessage(A6Util.MSG_DISMISS_DIALOG));
	}
	@SuppressLint("HandlerLeak")
	private Handler mHandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch(msg.what){
			case A6Util.MSG_TOAST:
				showMsg((CharSequence)msg.obj);
				break;
			case A6Util.MSG_DISMISS_DIALOG:
				if (mDlg != null){
					mDlg.dismissAllowingStateLoss();
				}
			case A6Util.MSG_START_PROGRESS:
				String strMsg = (String)msg.obj;
				if (strMsg != null){
					try{
						if (mDlg != null){
							mDlg.dismissAllowingStateLoss();
						}
						mDlg = ProgressDialogFragment.createBuilder(BaseAty.this, getSupportFragmentManager())
								.setMessage(strMsg)
								.show();
					}catch(Exception e){
						e.printStackTrace();
						showMsg(strMsg);
					}
				}
				break;
			}
		}
	};
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:
			this.finish();
			break;
		}
		return super.onOptionsItemSelected(item);
	}
	
	private boolean mDisableLoadingView;
	protected PullToRefreshView mPullToRefreshView;
	
	/**
	 * 初始化界面时调用
	 */
	public void initContainerViews(){
		initContainerViews(R.id.container, R.id.contentView, R.id.pull_to_refresh_view);
	}
	
	/**
	 * 初始化界面时调用
	 * @param containerId
	 * @param contentViewId
	 */
	public void initContainerViews(int containerId, int contentViewId, int pullToRefreshViewId){
		if (!mDisableLoadingView){
			mFooterLoadingView = LayoutInflater.from(this).inflate(R.layout.footer_loading_view, null);
			mFooterLoadingView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
			mContainer = (ViewGroup)findViewById(containerId);
			mContentView = (ViewGroup)findViewById(contentViewId);
			mPullToRefreshView = (PullToRefreshView)findViewById(pullToRefreshViewId);
			if (mPullToRefreshView != null){
				mPullToRefreshView.setOnHeaderRefreshListener(this);
				mPullToRefreshView.setOnFooterRefreshListener(this);
			}
			showLoadingView();
		}
	}
	
	/**
	 * 显示界面,需要在数据请求完成后调用,不使用BaseAty的loadingView的无需调用。
	 */
	public void showContentView(final boolean isSuccess) {
			mHandler.post(new Runnable(){
				@Override
				public void run() {
					if (mPullToRefreshView != null){
						mPullToRefreshView.onHeaderRefreshComplete();
						mPullToRefreshView.onFooterRefreshComplete();
						if (isSuccess){
							switch(mRefreshType){
							case REFRESH_TYPE_PULL_DOWN:
								showMsg("数据已更新");
								break;
							}
						}
					}
					if (!mDisableLoadingView){
						mContainer.removeView(mFooterLoadingView);
						mContentView.setVisibility(View.VISIBLE);
					}
				}
			});
	}
	
	/**
	 * 显示loading
	 */
	public void showLoadingView(){
		if (!mDisableLoadingView){
			mRefreshType = REFRESH_TYPE_LOADING;
			mContentView.setVisibility(View.GONE);
			mContainer.removeView(mFooterLoadingView);
			mContainer.addView(mFooterLoadingView);
		}
	}
	
	/**
	 * 下拉刷新任务,更新完后需调用showContentView()方法通知已更新数据。
	 */
	public abstract void doHeaderTask();
	
	/**
	 * 上拉加载任务,更新完后需调用showContentView()方法通知已更新数据。
	 */
	public abstract void doFooterTask();
	@Override
	public void onFooterRefresh(PullToRefreshView view) {
		mContainer.removeView(mFooterLoadingView);
		mContainer.addView(mFooterLoadingView);
		mRefreshType = REFRESH_TYPE_PULL_UP;
		doFooterTask();
	}

	@Override
	public void onHeaderRefresh(PullToRefreshView view) {
		mContainer.removeView(mFooterLoadingView);
		mContainer.addView(mFooterLoadingView);
		mRefreshType = REFRESH_TYPE_PULL_DOWN;
		doHeaderTask();
	}

	/**
	 * 是否已禁用加载界面
	 * @return
	 */
	public boolean isDisableLoadingView() {
		return mDisableLoadingView;
	}

	/**
	 * 设置是否禁用加载界面,需要在super.OnCreate()之前调用,默认为false
	 * @param disableLoadingView
	 */
	public void setDisableLoadingView(boolean disableLoadingView) {
		mDisableLoadingView = disableLoadingView;
	}
}