package com.dbs.mplus.fatima.framework.util;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.widget.Toast;

import com.dbs.mplus.fatima.framework.MPlusFrameworkConstants;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.google.android.gms.iid.InstanceID;

import java.io.IOException;

/**
 * 구글 클라우드 서비스 연계 
 * 
 * @author aple
 *
 */
public class MPlusGCMUtil {
	
	/**
	 * device token 얻기 
	 * @param context application context 
	 * @return device token 
	 * @throws IOException 
	 */
	public static String getDeviceToken(Context context) throws IOException { 
		// 로컬에 저장된게 있나 보고 
		final MPlusPreferenceUtil p = MPlusPreferenceUtil.getInstance(context);
		final String token = p.getDeviceToken();

		// 토큰이 저장되어 있으면 전달해주기
		if(!MPlusStringUtil.isEmpty(token)) {
			return token;
		}

		return MPlusGCMUtil.refreshDeviceToken(context);
	}
	/**
	 * device token 얻기
	 * @param context
	 * @return
	 * @throws IOException
	 */
	public static String refreshDeviceToken(Context context) throws IOException {
		String token = null;
		// GoogleCloudMessaging.register(xxx) 형태의 메소드는 deprecated 되었음

		// 없다면 발급받아야 함
		final InstanceID instanceId = InstanceID.getInstance(context);
		try {
			token = instanceId.getToken(MPlusFrameworkConstants.GCM_SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
			MPlusLogUtil.DEBUG(MPlusGCMUtil.class, "deviceToken 발급완료 : " + token);
		}
		catch(final IOException ex) {
			MPlusLogUtil.ERROR(MPlusGCMUtil.class, "fail to get device token. token = " + token, ex);
			throw ex;
		}

		return token;
	}

	/**
	 * 구글 플레이 서비스를 사용할 수 있는지 여부
	 * @param activity
	 * @param errorMsg
	 * @return true : 사용할 수 있음, false : 사용할 수 없음
	 */
	public static boolean isGooglePlayServiceAvailable(Activity activity, String errorMsg) {
		final GoogleApiAvailability g = GoogleApiAvailability.getInstance();

		// 인스턴스를 얻을 수 없으면 안되는걸로...
		if(g == null) {
			MPlusLogUtil.DEBUG(MPlusGCMUtil.class, "google api 사용불가");
			return false;
		}

		// 구글플레이 서비스 이용가능한지 확인
// GooglePlayServicesUtil.isGooglePlayServicesAvailable is deprecated....
//		final int result = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity.getApplicationContext());
//		if(result == ConnectionResult.SUCCESS) {
//			MPlusLogUtil.DEBUG(MPlusGCMUtil.class, "google paly service 사용가능");
//			return true;
//		}

		final int result = g.isGooglePlayServicesAvailable(activity.getApplicationContext());
		if(result == ConnectionResult.SUCCESS) {
			MPlusLogUtil.DEBUG(MPlusGCMUtil.class, "google paly service 사용가능");
			return true;
		}

		// 사용자가 고칠 수 있는 에러라면, 고칠 수 있도록 창 띄워주기 
		if(!g.isUserResolvableError(result)) {
			// 사용자가 어떻게 할 수 있는 처지가 아니면, 무시 
			MPlusLogUtil.ERROR(MPlusGCMUtil.class, "GoogleApiAvailability.isGooglePlayServiceAvailable = " + result);
			Toast.makeText(activity.getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show();
			activity.finish(); 
		}
		else {
			final Dialog d = g.getErrorDialog(activity, result, MPlusFrameworkConstants.ACTIVITY_REQUEST_CODE.GOOGLE_API_AVAILABILITY_USER_RESOLVABLE_ERROR_DIALOG.ordinal());
			if(d != null) { 
				d.show(); 
			}
			// 에러가 나서 보여줄려고 하는데 dialog를 못 만들었다면 
			else {
				Toast.makeText(activity.getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show();				
			}
		}

		return false; 
	}
}
