package com.dbs.mplus.fatima.receiver;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import android.widget.Toast;

import com.dbs.mplus.fatima.MPlusConstants;
import com.dbs.mplus.fatima.framework.task.MPlusVersionCheckTask;
import com.dbs.mplus.fatima.framework.util.MPlusDeviceUtil;
import com.dbs.mplus.fatima.framework.util.MPlusLogUtil;
import com.dbs.mplus.fatima.framework.util.MPlusStringUtil;
import com.dbs.mplus.fatima.framework.view.dialog.MPlusDialog;
import com.dbs.mplus.fatima.R;
import com.dbs.mplus.fatima.util.AddrUtil;
import com.dbs.mplus.fatima.util.IntentUtil;

import org.json.JSONObject;
/**
 * loading 단계에서 확인할 내용들을 수신함 
 * 
 * @author hyeeun 
 *
 */
public class LoadingStepReceiver extends BroadcastReceiver {
	private final Activity activity;  
	
	/**
	 * 생성자 
	 * @param activity
	 */
	public LoadingStepReceiver(Activity activity) { 
		this.activity = activity; 
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		MPlusLogUtil.INFO(this.getClass(), "LoadingStepReceiver. intent : " + intent);
		
		final String action = intent.getAction();

		// token을 발급 받은 경우
		if(MPlusConstants.ACTION_TOKEN_PREPARE.equals(action)) {
			if(this.processTokenPrepare(intent.getExtras())) {
				// 버전확인
				if(this.processVersionCheck()) {
					// 곧장 띄우니까 가끔 에러남
					// Performing stop of activity that is not resumed
					this.handler.sendEmptyMessageDelayed(1, 500);
				}
			}
			else {
				// 아니면 종료하면 되니까, 여기서는 할일이 없음
				MPlusLogUtil.ERROR(this.getClass(), "토큰발급 실패로 앱 종료");
				Toast.makeText(this.activity, this.activity.getString(R.string.error_no_token), Toast.LENGTH_LONG).show();
				this.activity.finish();
			}
		}
		// 버전확인이 필요한 경우
		else if(MPlusConstants.ACTION_VERSION_CHECK.equals(action)) {
			// 버전을 확인하고
			if(this.processVersionCheck()) {
				// 성공하면 다음 띄우기
				this.openNextIntent();
			}
		}
	}
	
	// 다음 로딩 진행하기 
	private final Handler handler = new Handler(new Handler.Callback() {
		
		@Override
		public boolean handleMessage(Message msg) {
			switch(msg.what) {
			case 1  : 
				MPlusLogUtil.DEBUG(this.getClass(), "다음 로딩 진행... ");
				LoadingStepReceiver.this.openNextIntent(); 
				break; 
				
			default : 
				break; 
			}
			return false;
		}
	}); 

	
	/**
	 * 버전확인 
	 * @return 시작화면으로 가도 되는지 여부 
	 */
	private boolean processVersionCheck() {
		MPlusLogUtil.DEBUG(this.getClass(), "버전확인 시작......  ");
		final String versionPage = AddrUtil.getVersionPage(); 
		final MPlusVersionCheckTask versionCheckTask = new MPlusVersionCheckTask(this.activity, versionPage, MPlusConstants.VERSION_CHECK_APP_NAME);
		Object resObj = null;
		
		try {
			// 버전확인 시작 
			resObj = versionCheckTask.execute().get(); 
			// 버전이 맞아서 아무것도 안해도 되는 경우 
			if(resObj == null) { 
				return true; 
			}
			// 버전이 안 맞아서 마켓이동이 필요한 경우에는 json 메시지가 넘어옴 
			else if(resObj instanceof JSONObject) { 
	     		final JSONObject res = (JSONObject) resObj; 
	     		final String marketUrl = res.getString("marketUrl");
	 
	     		if(MPlusStringUtil.isEmpty(marketUrl)) {
	     			// 예외처리 
	     			throw new Exception("invalid market url"); 
	     		}
	     		else {
	     			this.goMarket(marketUrl);
	     			return false; 
	     		}				
			}
			// 응답으로 예외가 왔으면 catch문으로 넘어가서 계속 처리 
			else if(resObj instanceof Exception) { 
				throw (Exception) resObj; 
			}
			// 이외의 경우는 없음 
		}
		catch(final Exception ex) { 
	     	MPlusLogUtil.DEBUG(this.getClass(), "버전확인 실패", ex);
	     	final String title = this.activity.getString(R.string.title_error); 
	     	String msg = this.activity.getString(R.string.error_init_version);


	 		// 버전확인 실패를 알리기
	     	MPlusDialog.getOKDialog(this.activity, title, msg,
	     			new DialogInterface.OnClickListener() {
	 					@Override
	 					public void onClick(DialogInterface dialog, int which) {
	 						LoadingStepReceiver.this.activity.finish();
	 						return;
	 					}

	     	}).show();
	     	// 여기서 false를 반환하면 loading 화면에 text가 새버전 설치하라고 표시됨 
	     	// 그러나 true를 리턴하면 다음 단계로 넘어감 
	     	return false; 
		}
		return true; 
	}
	
	/**
	 * 토큰발급 완료를 수신한 경우 
	 * @param bundle
	 * @return 토큰발급완료여부 
	 */
	private boolean processTokenPrepare(Bundle bundle) { 
		final boolean hasToken = bundle.getBoolean(MPlusConstants.PARAM_TOKEN_PREPARE_COMPLETE_STR);
		MPlusLogUtil.DEBUG(this.getClass(), "hasToken : " + hasToken);
		
		if(hasToken) {
			MPlusLogUtil.DEBUG(this.getClass(), "토큰 발급완료");
		}
		// 토큰을 발급 받고자 했으나, 실패한 상태임  
		else {
			final String title = this.activity.getString(R.string.title_info); 
			final String message = this.activity.getString(R.string.error_no_token); 
			
			// 구글 플레이 서비스가 있다는건 확인했고, 
			// 토큰이 발급안되는 경우는 네트워크가 안되는 경우 말고는 없을듯... 
			// 토큰이 발급되지 않아도, 로그인 안한 사용자에 대한 서비스는 사용 가능하므로 앱을 죽이지는 않는다. 
			MPlusDialog.getOKDialog(this.activity, title, message, null).show();
		}	
		
		
		return hasToken; 
	}

	/**
	 * market에 앱 받으러 가기 
	 * @param targetUrl
	 */
    private void goMarket(final String targetUrl) { 
    	// 현재 activity 닫고 
    	this.activity.finish();
    	
    	// 새로운 task 시작 
    	final Intent intent = IntentUtil.getNotifyIntent(this.activity.getApplicationContext(), 
    			MPlusConstants.ACTION_VERSION_UP,
    			MPlusConstants.PARAM_VERSION_UP_MARKET_URL,
    			targetUrl); 
    	this.activity.startActivity(intent);
    }
    
	/**
	 * 다음 intent 띄우기 
	 * 
	 */
	private void openNextIntent() { 
    	final Context context = this.activity.getApplicationContext();

		// 지도를 안쓰면 무조건 브라우징 시작
		final Intent intent = IntentUtil.getBrowsingIntent(context);
		this.activity.startActivity(intent);
	}    
}
