package com.dbs.mplus.knuh.consent;

import android.content.Context;
import android.os.Build;

import com.dbs.mplus.knuh.BuildConfig;
import com.dbs.mplus.knuh.R;
import com.dbs.mplus.knuh.activity.ConsentActivity;
import com.dbs.mplus.knuh.util.Util;

import java.util.List;
import java.util.Map;

import kr.co.clipsoft.eform.EFormToolkit;
import kr.co.clipsoft.eform.information.RunOption;
import kr.co.clipsoft.eform.type.enumtype.LogLevel;
import kr.co.clipsoft.eform.type.enumtype.Position;
import kr.co.clipsoft.eform.type.enumtype.ScreenOrientation;

public class ConsentFacade {
  private static final String TAG = "ConsentFacade";
  private Context mContext;
  private ConsentActivity instance;

  private EFormToolkit eFormToolkit;

  public ConsentFacade(Context mContext) {
    this.mContext = mContext;
    this.instance = (ConsentActivity) mContext;
    this.eFormToolkit = new EFormToolkit(mContext);
  }

  private RunOption createRunOption() {
    RunOption runOption = new RunOption();

    runOption.setScreenOrientation(ScreenOrientation.Sensor);  // 가로세로 전환 모드
    runOption.setFirstPageLoad(true);              // 서식 로딩 시 첫 페이지만 로딩
    runOption.setUseCaching(false);                // 로컬 파일 생성하여 캐싱 사용 여부
    runOption.setLogLevel(LogLevel.INFO);            // 로그 레벨
    runOption.setFosLogging(true);                // fos 로그 여부
    runOption.setUseCameraAttachPage(true);                     // 첨지기능 사용여부
    runOption.setExternalControlDefinedPath(BuildConfig.CONSENT_EFORM_SERVER_URL);
    runOption.setParameterDefaultValueClear(false);
    runOption.setInitializeScrollOnPageMove(true);    // 페이지 이동시 스크롤 초기화
    runOption.setAttachPagePosition(Position.Next);    // 첨지 옵션
    runOption.setBottomToolbarButtonsVisibleOnPenDrawMode(true); // 펜드로잉 모드일때 하단 이동 버튼 보이기 여부

    // 저장시 옵션
    runOption.setReturnDataXmlOnSave(true);        // 저장시 dataXml 리턴 여부
    runOption.setDataXmlSaveAsFileOnSave(false);      // 저장시 dataXml 리턴 시 file 여부(true : file, false : String)
    runOption.setImageSaveOption("{'encode':'jpg', 'start-index':0, 'quality':100, 'dpi':150, 'gray':false}"); // 저장될 이미지 타입을 설정함
    runOption.setReturnImageOnSave(true);        // 저장시 이미지 파일 리턴 여부
    runOption.setReturnTempDocumentOnSave(true);    // 저장 시 ept 파일 저장 여부
    runOption.setIncludesDrawingOnDataXml(false);    // 저장시 펜드로잉 정보 저장 여부
    runOption.setReturnPdfOnSave(false);        // 저장 시 PDF 저장 여부

    // 임시 저장시 옵션
    runOption.setReturnDataXmlOnTempSave(true);      // 임시 저장시 dataXml 리턴 여부
    runOption.setDataXmlSaveAsFileOnTempSave(false);    // 임시 저장시 dataXml 리턴 시 file 여부(true : file, false : String)
    runOption.setIncludesDrawingOnTempDocument(true);  // 임시저장시 펜드로잉 정보 저장 여부

    runOption.setUseNextDocumentOpenDialogAfterSave(false);// 연속 출력시 저장 후 알림 여부

//    runOption.setInactivityTimeoutInMilisecond(1000 * 60 * sessionTime); //지정한 시간 1000 = 1초

    runOption.setUiStyle("{"
        + "'required-input':{'border':{'visible':'false','color':{'b':0,'g':0,'r':225,'a':120},'width':2},'background':{'visible':'true','color':{'b':0,'g':0,'r':225,'a':120}}}"
        + ",'toast-message':{'signature-missing-data':{'text':'" + mContext.getString(R.string.emptySign) + "'}}"
        + ",'toolbar':{"
        + "        'buttons':{"
        + "              'tempsave2':{'visible':'true','enabled':'true','text':'" + mContext.getString(R.string.check) + "'}"
        + "              ,'record':{'visible':'true'}"
        + "              ,'information':{'visible':'true'}"
        + "              ,'tempsave':{'visible':'true','enabled':'true','text':'" + mContext.getString(R.string.tempList) + "'}"
        + "              ,'save':{'visible':'true','enabled':'false','text':'" + mContext.getString(R.string.certifySave) + "'}"
        + "              ,'exit':{'visible':'true','text':'" + mContext.getString(R.string.exit) + "'}"
        + "              ,'pageattach':{'visible':'true'}"
        + "              ,'page-number':{'current':{'text-color':{'b':116,'g':186,'r':14,'a':255}}"
        + "        }"
        + "}"
        + ",'move-next':{"
        + "     'buttons':{"
        + "       'save-move':{'text':'저장 후 이동','visible':true,'enabled':true}"
        + "        ,'tempsave-move':{'text':'임시저장 후 이동','visible':true,'enabled':true}"
        + "      ,'tempsave2-move':{ 'text':'임시저장2 후 이동','visible':false ,'enabled':true}"
        + "        ,'move':{'text':'저장 없이 이동','visible':true ,'enabled':true}"
        + "   }"
        + "}}}"
    ); // 툴바 및 UI 관련 옵션 설정


    return runOption;
  }

  public void startConsent() {

  }

  public String createFOS() {
    String fos = "";
    fos = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    fos += "<fos version='1.0'>";
    fos += "  <global>";
//    fos += this.createFosPageTemplate();
    fos += "    <parameters>"; // form-list의 모든 서식에 적용될 파라미터
    fos += "            <param key='UrlParam'>" + BuildConfig.CONSENT_SERVER_URL + "</param>";
//    fos += this.createParamString(msg.getParamMap());
    fos += "    </parameters>";
    fos += "   </global>";
    fos += "  <form-list>";
//    fos += this.createFormString(msg.getFormParamMapList());
    fos += "  </form-list>";
    fos += "</fos>";
    return fos;
  }

  private String createFosPageTemplate() {
    String pageTemplate = "";
    pageTemplate += "<page-template path='" + BuildConfig.CONSENT_EFORM_SERVER_URL + "' request-encode ='utf-8' response-encode ='utf-8'>";
    pageTemplate += "  <template-get-parameters>";
    pageTemplate += "    <post-param key='OP'>";
    pageTemplate += "      <![CDATA[PAGE_TEMPLATE]]>";
    pageTemplate += "    </post-param>";
    pageTemplate += "    <post-param key='PD'>";
    pageTemplate += "      <![CDATA[";
    pageTemplate += "        <data>";
    pageTemplate += "          <action>GET_LIST</action>";
    pageTemplate += "          <params>";
    pageTemplate += "            <param name='adaptername'>defaultadapter</param>";
    pageTemplate += "          </params>";
    pageTemplate += "        </data>";
    pageTemplate += "      ]]>";
    pageTemplate += "     </post-param>";
    pageTemplate += "  </template-get-parameters>";
    pageTemplate += "</page-template>";
    return pageTemplate;
  }

  private String createFormString(List<Map<String, String>> formMapList) {
    String fos = "";
    for (int i = 0; i < formMapList.size(); i++) {
      Map<String, String> formMap = formMapList.get(i);
      String rid = formMap.get("rid");
      String guid = formMap.get("guid");
      String type = formMap.get("type");
      boolean newForm = true;

      String newConsent = formMap.get("newConsent");
      if (newConsent != null && "true".equals(newConsent)) {
        newForm = true;
      } else {
        newForm = false;
      }

      fos += "    <form name='noname' open-sequence='" + (i + 1) + "' path='" + BuildConfig.CONSENT_EFORM_SERVER_URL + "' request-encode='utf-8' response-encode='utf-8'>";
      fos += "      <parameters>";
      fos += this.createParamString(formMap);
      fos += "      </parameters>";
      fos += "      <form-get-parameters>";
      fos += "        <post-param key='OP'><![CDATA[" + (newForm ? "VIEWER_FORM" : "VIEWER_DATA") + "]]></post-param>";
      fos += "        <post-param key='PD'>";
      fos += "        <![CDATA[";
      fos += "          <data>";
      fos += "          <action>" + (newForm ? "GET" : "GET_DATA") + "</action>";
      fos += "            <params>";
      fos += "              <param name='adaptername'>defaultadapter</param>";

      if (newForm) {
        fos += "                <param name='type'>guid</param>";
        fos += "                <param name='guid'>" + guid + "</param>";
        fos += "                <param name='version'>-1</param>";
      } else {
        fos += "                <param name='rid'>" + rid + "</param>";
      }

      fos += "            </params>";
      fos += "          </data>";
      fos += "        ]]>";
      fos += "        </post-param>";
      fos += "      </form-get-parameters>";
      fos += "    </form>";
    }
    return fos;
  }

  /**
   * @param param
   * @return
   */
  private String createParamString(Map<String, String> param) {
    StringBuffer paramStr = new StringBuffer();
    if (param != null && !param.isEmpty()) {
      for (String key : param.keySet()) {
        paramStr.append("<param key=\'").append(key).append("\'>");
        paramStr.append("<![CDATA[");
        paramStr.append(Util.getNull2EmptyString(param.get(key)));
        paramStr.append("]]>");
        paramStr.append("</param>");
      }
    }
    return paramStr.toString();
  }
}
