package com.dbs.mplus.fatima.service;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import com.dbs.mplus.fatima.MPlusConstants;
import com.dbs.mplus.fatima.framework.MPlusFrameworkConstants;
import com.dbs.mplus.fatima.framework.util.MPlusLogUtil;
import com.dbs.mplus.fatima.framework.util.MPlusNotificationBuilder;
import com.dbs.mplus.fatima.framework.util.MPlusPreferenceUtil;
import com.dbs.mplus.fatima.framework.util.MPlusServiceUtil;
import com.dbs.mplus.fatima.R;
import com.dbs.mplus.fatima.util.AddrUtil;
import com.dbs.mplus.fatima.util.IntentUtil;
import com.dbs.mplus.fatima.view.web.MPlusWebActivity;
import com.google.android.gms.gcm.GcmListenerService;

import java.util.Random;


/**
 * GCM에서 Push 메시지 수신
 * 
 * @author hyeeun 
 *
 */
public class PushMessageListenerService extends GcmListenerService {

	@Override 
	public void onMessageReceived(String from, Bundle data) { 
//		final StringBuilder builder = new StringBuilder(); 		
//		builder.append("====================================="); 
//		builder.append("from : ").append(from).append(", bundle : ").append(data); 
//		LogUtil.DEBUG(this.getClass(), builder.toString());

		// 번들복원 
		final Bundle bundle = MPlusServiceUtil.parsePushBundle(super.getApplicationContext(), data);
		final String title = bundle.getString(MPlusConstants.KEY_NOTI_PUSH_TITLE);
		
		// 폰이 꺼져있을때 push는 여기까지(Service)만 호출되고, 여기서 날리는 localBroadcast 메시지는 처리되지 않음 		
		// 그래서 여기에서 preference에 정보를 심음 심기 
		final MPlusPreferenceUtil p = MPlusPreferenceUtil.getInstance(this.getApplicationContext());
		p.setRecentMessage(bundle.getString(MPlusConstants.KEY_NOTI_PUSH_PID), title, bundle.getString(MPlusConstants.KEY_NOTI_PUSH_REGDT));
		//MPlusLogUtil.DEBUG(this.getClass(), "preference에 저장 : dt = " + bundle.getString(MPlusConstants.KEY_NOTI_PUSH_REGDT));
				
		// notification 올려주기 
		this.notifyMessage(this.getApplication().getString(R.string.title_noti_push), title);

//		// 내부에 적당한 애가 화면처리할 수 있도록 날리고 
//		final LocalBroadcastManager broadCastManager = LocalBroadcastManager.getInstance(this.getApplicationContext()); 	
//		broadCastManager.sendBroadcast(IntentUtil.getPushNotificationIntent(bundle)); 
		// 오랜 처리가 필요하다면 IntentService 날리는걸 고려하면 됨 
		
		// PushMessageAlertReceiver가 받아서 처리하게될것임 
		final Context context = this.getApplicationContext(); 
		final Intent intent = IntentUtil.getNotifyIntent(context, MPlusFrameworkConstants.ACTION_PUSH, bundle);
		context.startActivity(intent);
		//MPlusLogUtil.DEBUG(this.getClass(), "onMessageReceived. startActivity 호출 시 전달한 번들 : " + bundle.getString(MPlusFrameworkConstants.KEY_NOTI_PUSH_TITLE));
	}

	@Override 
	public void onDeletedMessages() { 
		// TODO 어떻게 처리할지 결정 필요 
		MPlusLogUtil.DEBUG(this.getClass(), "GCM 서버에서 메시지 삭제됨... app Server에서 데이터 수신 필요");
	}
	
	/**
	 * notification 올리기 
	 * @param title
	 * @param message
	 */
	private void notifyMessage(String title, String message) {
		//MPlusLogUtil.DEBUG(this.getClass(), "noti 메세지 올리기 준비 시작");
		final Context context = this.getApplicationContext();

		// 누르면 도우미가 뜰 수 있도록 준비하고 
		// 이렇게 띄우면 로딩단계 없이 도우미만 짠! 하고 뜨게 됨... 	
		final Intent intent = IntentUtil.getStartApp(context, MPlusFrameworkConstants.ACTION_PUSH, AddrUtil.getHelperPage());
		// 작업만들고 
		final TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
		stackBuilder.addParentStack(MPlusWebActivity.class);
		stackBuilder.addNextIntent(intent);
		// 인텐트 만들고
		final PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

		// Notification 만들어서
		Notification notification = MPlusNotificationBuilder.generate(context, title, message, pendingIntent);

		// 올리기
		final NotificationManager notiManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
		
		if(MPlusConstants.PUSH_SINGLE_NOTIFICATION) {
			notiManager.notify(1, notification);
		}
		else {
			notiManager.notify(this.getNotificationId(), notification);
		}
	}
	
	/**
	 * ID를 따로 사용하지는 않을꺼라서 랜덤하게 만들어서 사용 
	 * @return
	 */
	private int getNotificationId() { 
		final Random r = new Random(System.currentTimeMillis()); 
		int value = r.nextInt(); 
		if(value < 0) { 
			value *= -1; 
		}
		
		return value; 
	}
}
