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

import android.content.Context;
import android.content.SharedPreferences;

/**
 * 환경설정 정보를 저장하기 위한 유틸
 *
 *
 * @author aple
 *
 */
public class MPlusPreferenceUtil {
	private static boolean bInit;
	private static MPlusPreferenceUtil util;
	private final Context context;
	//
	private static final String PREFERENCE_NAME = "MCARE_PREF";
	private static final String KEY_DEVICE_TOKEN = "device_token";
	private static final String KEY_RECENT_MSG = "_recent_msg";
	private static final String KEY_RECENT_MSG_DT = "_recent_msg_dt";
	private static final String KEY_START_PAGE = "start_page";
	private static final String KEY_RECENT_DOMAIN = "recent_domain";

	/**
	 * 생성자
	 * @param context
	 */
	private MPlusPreferenceUtil(Context context) {
		this.context = context;
	}
	/**
	 * 인스턴스 생성하기
	 * @param context
	 * @return
	 */
	public static MPlusPreferenceUtil getInstance(Context context) {
		if(!bInit) {
			bInit = true;
			util = new MPlusPreferenceUtil(context);
		}

		return util;
	}

	/**
	 * 시작페이지
	 * @return
	 */
	public String getStartPage(String defaultStartPage) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final String url = p.getString(MPlusPreferenceUtil.KEY_START_PAGE, null);

		// 꺼낸 페이지가 없으면 시작 페이지로 전이
		if(url == null || "".equals(url)) {
			//MPlusLogUtil.DEBUG(this.getClass(), "기존 저장 페이지가 없어서 기본 페이지로 인식할것임 : " + defaultStartPage);
			return defaultStartPage;
		}

		// 꺼낸 페이지가 있으면 재활용 되지 않게 지우기
		this.setStartPage("");
		//MPlusLogUtil.DEBUG(this.getClass(), "저장된 페이지를 꺼내주고 초기화 했음. 저장되었던 페이지 : " + url + ", 초기화된 페이지 : " + p.getString(MPlusPreferenceUtil.KEY_START_PAGE, null));

		return url;
	}

	/**
	 * 시작페이지 저장
	 * @param page
	 * @return
	 */
	public boolean setStartPage(String page) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final SharedPreferences.Editor e = p.edit();
		e.putString(MPlusPreferenceUtil.KEY_START_PAGE, page);

		return e.commit();
	}

	/**
	 * device token 저장
	 * @param token
	 * @return 성공여부
	 */
	public boolean setDeviceToken(String token) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final SharedPreferences.Editor e = p.edit();
		e.putString(MPlusPreferenceUtil.KEY_DEVICE_TOKEN, token);

		return e.commit();
	}
	/**
	 * device token 꺼내기
	 * @return 저장해둔 device token, 없으면 null
	 */
	public String getDeviceToken() {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final String token = p.getString(MPlusPreferenceUtil.KEY_DEVICE_TOKEN, null);

		return token;
	}
	/**
	 * pId에 해당하는 최근 메시지 반환
	 * @param pId
	 * @return
	 */
	public String getRecentMessage(String pId) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final String msg = p.getString(pId + MPlusPreferenceUtil.KEY_RECENT_MSG, null);

		// 오늘저장된 메시지가 맞는지
		if(!MPlusStringUtil.isEmpty(msg) && !MPlusStringUtil.isToday(this.getRecentMessageDt(pId))) {
			// 저장된 메시지 지우기
			this.setRecentMessage(pId, "", "");

			return null;
		}

		return msg;
	}

	/**
	 * pId에 해당하는 최근 메시지 시간 반환
	 * @param pId
	 * @return
	 */
	private String getRecentMessageDt(String pId) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final String dt = p.getString(pId + MPlusPreferenceUtil.KEY_RECENT_MSG_DT, null);

		return dt;
	}

	/**
	 * pId에게 최근 온 메시지 저장
	 * @param pId
	 * @param message
	 * @param dt
	 * @return
	 */
	public boolean setRecentMessage(String pId, String message, String dt) {
		if(pId == null || dt == null) {
			return false;
		}

		// 이전에 저장해둔 최근 메시지 시간 복원
		final String prevDt = this.getRecentMessageDt(pId);

		// 이전 시간이 없으면 무조건 저장하면 되고, 있다면 시간 비교 필요함
		if(prevDt == null || (prevDt.compareToIgnoreCase(dt) < 0)) {
			final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
			final SharedPreferences.Editor e = p.edit();

			e.putString(pId + MPlusPreferenceUtil.KEY_RECENT_MSG_DT, dt);
			e.putString(pId + MPlusPreferenceUtil.KEY_RECENT_MSG, message);

			return e.commit();
		}

		return false;
	}

	/**
	 * 최근 사용된 도메인 반환
	 * 하나의 폰에서 로그아웃을 하고, 다른 계정으로 로그인 하니까 굳이 pid 레벨로 구분해 저장하지는 않음
	 *
	 * @param defaultDomain
	 * @return
	 */
	public String getRecentDomain(String defaultDomain) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
		final String domain = p.getString(MPlusPreferenceUtil.KEY_RECENT_DOMAIN, defaultDomain);

		return domain;
	}

	/**
	 * 최근 사용된 도메인 저장
	 * @param domain
	 */
	public boolean setRecentDomain(String domain) {
		final SharedPreferences p = this.context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);

		if(domain != null) {
			final SharedPreferences.Editor e = p.edit();
			e.putString(MPlusPreferenceUtil.KEY_RECENT_DOMAIN, domain);

			return e.commit();
		}

		return false;
	}
}
