/*
 * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
 */
package kr.co.zumo.app.lifeplus.view.dialog;

import android.support.v4.app.FragmentManager;
import android.util.Log;

import kr.co.zumo.app.lifeplus.supervisor.DialogHelper;
import kr.co.zumo.app.lifeplus.view.dialog.factory.BasicDialogFactory;
import kr.co.zumo.app.lifeplus.view.dialog.factory.IDialogFactory;

/**
 * DialogBuilder
 * <pre>
 * </pre>
 *
 * @author 민효동
 * @version 1.0
 * @history 민효동   [2018-09-23]   [최초 작성]
 * @since 2018-09-23
 */
public class DialogBuilder {

  private IDialogFactory factory;
  private int dialogId;
  private FragmentManager manager;
  private IDialogResultListener listener;
  private IAttribute attribute;

  private DialogBuilder(@DialogID.ID int dialogId) {
    this.dialogId = dialogId;
  }

  /**
   * 빌더를 생성한다.
   *
   * @param dialogId Dialog.ID
   */
  public static DialogBuilder create(@DialogID.ID int dialogId) {
    return new DialogBuilder(dialogId);
  }

  /**
   * FragmentManager 를 지정한다.
   * - 지정하지 않으면 DialogHelper 의 것을 사용한다.
   *
   * @param manager FragmentManager
   * @return DialogBuilder
   */
  public DialogBuilder manager(FragmentManager manager) {
    this.manager = manager;
    return this;
  }

  /**
   * factory 를 지정한다.
   * 기본값: BasicDialogFactory
   *
   * @param factory IDialogFactory
   * @return DialogBuilder
   */
  public DialogBuilder factory(IDialogFactory factory) {
    this.factory = factory;
    return this;
  }

  /**
   * 리스너 등록
   *
   * @param listener IDialogResultListener
   * @return DialogBuilder
   */
  public DialogBuilder listener(IDialogResultListener listener) {
    this.listener = listener;
    return this;
  }

  /**
   * 다이얼로그 show 이전에 속성(메서드)를 지정한다.
   *
   * @param attribute
   * @return
   */
  public DialogBuilder attribute(IAttribute attribute) {
    this.attribute = attribute;
    return this;
  }

  /**
   * 다이얼로그 빌드
   *
   * @return DialogBase
   */
  public DialogBase build() {
    if (null == factory) {
      factory = new BasicDialogFactory();
    }
    if (null == manager) {
      manager = DialogHelper.getInstance().getFragmentManager();
    }
    DialogBase dialog = factory.getDialogById(dialogId);
    if (null != attribute) {
      attribute.onAttribute(dialog);
    }
    dialog.setResultListener(listener);

    return dialog;
  }

  /**
   * 다이얼로그 show
   *
   * @return DialogBase
   */
  public DialogBase show() {
    DialogBase dialog = build();
    try {
      // fixme 백그라운드에서 팝업을 열려고 시도할 경우, commit 오류가 발생한다.
      // -> 1. 백그라운드에서는 팝업을 열려는 시도 자체를 하지 못하도록 함 (observable dispose 등)
      // -> 2. 열려고 하면 팝업을 대기 상태로 뒀다가 onResume() 시 열어줌.
      dialog.show(manager, dialog.getClass().getSimpleName());
    } catch (Exception e) {
      Log.e("APP#  DialogBuilder | show", "| >>>>>>>>>>>>>>>> " + e.getLocalizedMessage());

      if (null != listener) {
        listener.onDialogCanceled(dialog);
      }
    }
    return dialog;
  }

}
