package com.dbs.dbsec.consent;

import android.content.Context;
import android.util.Log;

import com.dbs.dbsec.BuildConfig;
import com.dbs.dbsec.R;
import com.dbs.dbsec.activity.ConsentActivity;
import com.dbs.dbsec.util.Common;
import com.dbs.dbsec.util.ConsentConfig;

import java.util.ArrayList;
import java.util.HashMap;

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.ScreenOrientation;
import kr.co.clipsoft.eform.type.enumtype.TempSaveCheck;

public class ConsentFacade {
  private static final String TAG = ConsentFacade.class.getSimpleName();
  private Context mContext;
  private ConsentActivity instance;
  private EFormToolkit eFormToolkit;

  private String indexPage = "";
  private String patientState = "";
  private String certify = "";


  public ConsentFacade(Context mContext, String indexPage, String patientState, String certify) {
    this.mContext = mContext;
    this.eFormToolkit = new EFormToolkit(mContext);
    this.instance = ((ConsentActivity) mContext);
    this.indexPage = indexPage;
    this.patientState = patientState;
    this.certify = certify;
  }

  private RunOption getRunOption(String consentMstRid) {

    RunOption runOption = new RunOption();
    runOption.setDefaultZoomRate(1); // 화면 최초 로딩 시 서식 scale 크기 설정 1 ~ 4 default value : -1.0 (임의 조정하지 않음)
    runOption.setInitializeScrollOnPageMove(true); // 서식 페이지 이동시 스크롤 초기화 여부 true : 이동시 초기화, false : 초기화 하지 않음
    runOption.setInitializeScaleOnPageMove(true); // 페이지 이동시 scale 초기화 여부 true : 초기화, false : 초기화 하지 않음
    runOption.setParameterDefaultValueClear(true); // 서식에 저장되어 있는 파라미터 값 초기화 여부 true : 초기화, false : 초기화 하지 않음
    runOption.setLogLevel(LogLevel.INFO); // 레벨에 맞는 로그를 기록함
    runOption.setFosLogging(true); // FOS를 파일로 로깅할지 여부를 설정함 true : FOS를 파일로 로깅함, false : 로깅하지 않음
    runOption.setDataXmlSaveAsFileOnTempSave(false); // 임시저장 시 dataXml 리턴 시 file 여부(true : file, false : String)
    runOption.setReturnDataXmlOnTempSave(true); // 임시저장 시 데이터 XMl도 함께 저장할지 여부를 설정함 true : 함께 저장, false : 저장 X
    runOption.setDataXmlSaveAsFileOnSave(false); // 저장 시 데이터를 xml 문자열 형태로 받을지, 파일로 저장 후 저장된 파일의 path 로 받을지 설정함 true :  로컬에 저장 후 경로 반환, false : xml 문자열 반환
    runOption.setIncludesDrawingOnDataXml(false); // 저장시 펜 드로잉 정보를 포함하여 저장할지 여부를 설정함 true : 펜 드로잉 정보를 포함하여 저장, false : 펜 드로잉 정보를 포함하여 저정 X
    runOption.setImageSaveOption("{'encode':'jpg', 'start-index':0, 'quality':100, 'dpi':150, 'gray':false}"); // 저장될 이미지 타입을 설정함
    runOption.setPreventScreenCapture(false); // 화면 캡쳐 방지 여부 true : 캡쳐방지, false : 캡쳐방지 X
    runOption.setUrlConnectTimeoutInMilisecond(10 * 1000); // 서식을 불러 올 시 Url Connection time out을 설정함 1000 = 1초
    runOption.setReturnTempDocumentOnSave(true); // 저장 시 임시저장 데이터를 반환할지 여부를 설정함 true : 저장 시 임시저장 데이터 반환, false : 반환하지 않음
    runOption.setReturnDataXmlOnTempSave2(true); // 임시저장2 시 데이터 xml도 함께 저장할지 여부를 설정함 true : 함께 저장, false : 저장 X
    runOption.setPreventFingerTouchEvent("{'signature':'false'}"); // Viewer 동작 시 손으로 터치하는 동작을 방지할지 여부를 설정함 true : 손으로 입력 불가능, false : 손으로 입력가능
    runOption.setRequiredCheckOnTempSave2(true); // 임시저장2 시 필수 입력 체크를 할지 여부를 설정함 true : 필수 입력 체크 수행, false : 필수 임력 체크 수행 X
    runOption.setEnableRequiredErrorPopupContentsLineFeed(false); // 필수 입력 오류 팝업 리스트의 개행 여부를 설정함 true : 개행, false : ", " 구분
    runOption.setRunAsRepositoryV2(true);
    runOption.setSameCheckAsSaveWhenTempSave2(TempSaveCheck.Always);
    runOption.setExternalControlDefinedPath(ConsentConfig.CONSENT_EXTERNAL_SERVER); // 외부 사용자 정의 컨트롤의 정보를 갖는 서버 URL을 설정함

    runOption.setUiStyle(getUiStyle());

    return runOption;
  }

  public void startConsent(HashMap consentData, String certPass) {
    HashMap<String, String> globalParam = (HashMap<String, String>) consentData.get("globalParam");
    ArrayList<HashMap<String, String>> formList = (ArrayList<HashMap<String, String>>) consentData.get("consentArray");
    String fos = createFOS(consentData);
    String consentMstRid = formList.get(0).get("consentMstRid");

    eFormToolkit.setResultEventHandler(new EformSaveEventHandler(mContext, eFormToolkit, consentData, certify));
    eFormToolkit.setRunOption(getRunOption(consentMstRid));

    eFormToolkit.startEFormViewer(fos);

  }

  public String createFOS(HashMap consentData) {
    String fos = "";

    fos  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    fos += "  <fos version=\"1.0\">";
    fos += "    <global>";
    fos += "      <parameters>";
    fos += createParam((HashMap<String,String>) consentData.get("globalParam"));
    fos += "      </parameters>";
    fos += "      <page-template path='" + BuildConfig.CONSENT_EFORM_SERVER_URL + "' request-encode='utf-8' response-encode='utf-8'>";
    fos += "        <template-get-parameters>";
    fos += "          <post-param key='parameter'><![CDATA[{}]]></post-param>";
    fos += "        </template-get-parameters>";
    fos += "      </page-template>";
    fos += "    </global>";
    fos += "    <form-list>";
    fos += formParam((ArrayList<HashMap<String, String>>) consentData.get("consentArray"));
    fos += "    </form-list>";
    fos += "  </fos>";

    Log.e(TAG, "fos -- > " + fos);
    return fos;
  }

  private String formParam(ArrayList<HashMap<String, String>> consentArray) {
    String formStr = "";
    int seq = 0;

    if (consentArray.size() > 0) {
      for (int i = 0; i < consentArray.size(); i++) {
        HashMap<String ,String> data = consentArray.get(i);
        seq += seq + 1;

        formStr += "  <form name=\""+ consentArray.get(i).get("par_formNm") +"\" open-sequence='"+ seq +"' path='"+ BuildConfig.CONSENT_EFORM_SERVER_URL +"' request-encode='utf-8' response-encode='utf-8' compression='false'>";
        formStr += "    <form-get-parameters>";
        formStr += "    <post-param key='parameter'>";
        formStr += "      <![CDATA[{'formId':'"+ consentArray.get(i).get("formId") +"', 'formVersion':'-1'}]]>";
        formStr += "    </post-param>";
        formStr += "    </form-get-parameters>";
        formStr += "  <attachments>";
//        formStr += "    <record-files>";
//        formStr +=        recordFileTag(data);
//        formStr += "    </record-files>";
        formStr += "  </attachments>";
        formStr += "  </form>";
      }
    }

    return formStr;
  }

  private String createParam(HashMap<String, String> globalParam) {
    String paramStr = "";

    if (globalParam != null && !globalParam.isEmpty()) {
      for (String key : globalParam.keySet()) {
        paramStr += "<param key='" + key +"'><![CDATA[" + globalParam.get(key) + "]]></param>";
      }
    }

    return paramStr;
  }

  private String getUiStyle() {

    String str = "{" +
                 "  'toolbar': {                                                          " +
                 "    'top-toolbar': {                                                    " +
                 "      'visible': true                                                   " +
                 "    },                                                                  " +
                 "    'buttons': {                                                        " +
                 "      'record': {                                                       " +
                 "        'visible': true,                                                " +
                 "        'enabled': false                                                " +
                 "      },                                                                " +
                 "      'pageattach': {                                                   " +
                 "        'text': '" + mContext.getString(R.string.addPage) + "',         " +
                 "        'visible': true,                                                " +
                 "        'use-attach-page': true,                                        " +
                 "        'use-camera-attach-page': true                                  " +
                 "      },                                                                " +
                 "      'save': {                                                         " +
                 "        'text': '" + mContext.getString(R.string.certifySave) + "',     " +
                 "        'visible': true,                                                " +
                 "        'enabled': true                                                 " +
                 "      },                                                                " +
                 "      'tempsave': {                                                     " +
                 "        'text': '" + mContext.getString(R.string.tempList) + "',        " +
                 "        'visible': true,                                                " +
                 "        'enabled': true                                                 " +
                 "      },                                                                " +
                 "      'tempsave2': {                                                    " +
                 "        'text': '" + mContext.getString(R.string.confirmSave) + "',     " +
                 "        'visible': true,                                                " +
                 "        'enabled': true                                                 " +
                 "      },                                                                " +
                 "      'exit': {                                                         " +
                 "        'text': '" + mContext.getString(R.string.exit) + "',            " +
                 "        'visible': true                                                 " +
                 "      }                                                                 " +
                 "    }                                                                   " +
                 "  },                                                                    " +
                 "  'dialog': {                                                           " +
                 "    'save': {                                                           " +
                 "      'title': '" + mContext.getString(R.string.certifySave) + "',      " +
                 "      'contents': '" + mContext.getString(R.string.certifiedMsg) + "'   " +
                 "    },                                                                  " +
                 "    'tempsave': {                                                       " +
                 "      'title': '" + mContext.getString(R.string.tempList) + "',         " +
                 "      'contents': '" + mContext.getString(R.string.saveTempMsg) + "'    " +
                 "    },                                                                  " +
                 "    'tempsave2': {                                                      " +
                 "      'title': '" + mContext.getString(R.string.confirmSave) + "',      " +
                 "      'contents': '" + mContext.getString(R.string.saveConfirmMsg) + "' " +
                 "    }                                                                   " +
                 "  },                                                                    " +
                 "  'required-input': {                                                   " +
                 "    'border': {                                                         " +
                 "      'visible': true,                                                  " +
                 "      'width': 2,                                                       " +
                 "      'color': {                                                        " +
                 "        'a': 255,                                                       " +
                 "        'r': 255,                                                       " +
                 "        'g': 0,                                                         " +
                 "        'b': 0                                                          " +
                 "      }                                                                 " +
                 "    },                                                                  " +
                 "    'background': {                                                     " +
                 "      'visible': true,                                                  " +
                 "      'color': {                                                        " +
                 "        'a': 120,                                                       " +
                 "        'r': 255,                                                       " +
                 "        'g': 0,                                                         " +
                 "        'b': 0                                                          " +
                 "      }                                                                 " +
                 "    }                                                                   " +
                 "  }                                                                     " +
                 "}                                                                       ";

    return str;
  }


}
