// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "fpdfsdk/fpdfxfa/include/fpdfxfa_app.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
#include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h"
#include "fpdfsdk/include/fsdk_define.h"
#include "fpdfsdk/include/fsdk_mgr.h"
#include "public/fpdf_formfill.h"
#include "xfa/fxbarcode/include/BC_Library.h"
#include "xfa/fxfa/include/xfa_ffapp.h"
#include "xfa/fxfa/include/xfa_fontmgr.h"

CPDFXFA_App* CPDFXFA_App::g_pApp = NULL;

CPDFXFA_App* CPDFXFA_App::GetInstance() {
  if (!g_pApp) {
    g_pApp = new CPDFXFA_App();
  }
  return g_pApp;
}

void CPDFXFA_App::ReleaseInstance() {
  delete g_pApp;
  g_pApp = NULL;
}

CPDFXFA_App::CPDFXFA_App()
    : m_bJavaScriptInitialized(FALSE),
      m_pXFAApp(NULL),
      m_hJSERuntime(NULL),
      m_csAppType(JS_STR_VIEWERTYPE_STANDARD),
      m_bOwnedRuntime(false) {
  m_pEnvList.RemoveAll();
}

CPDFXFA_App::~CPDFXFA_App() {
  delete m_pXFAApp;
  m_pXFAApp = NULL;

#ifdef PDF_ENABLE_XFA
  FXJSE_Runtime_Release(m_hJSERuntime, m_bOwnedRuntime);
  m_hJSERuntime = NULL;

  FXJSE_Finalize();
  BC_Library_Destory();
#endif
}

FX_BOOL CPDFXFA_App::Initialize(FXJSE_HRUNTIME hRuntime) {
#ifdef PDF_ENABLE_XFA
  BC_Library_Init();
  FXJSE_Initialize();

  m_bOwnedRuntime = !hRuntime;
  m_hJSERuntime = hRuntime ? hRuntime : FXJSE_Runtime_Create();
  if (!m_hJSERuntime)
    return FALSE;

  m_pXFAApp = new CXFA_FFApp(this);
  m_pXFAApp->SetDefaultFontMgr(new CXFA_DefFontMgr);
#endif
  return TRUE;
}

FX_BOOL CPDFXFA_App::AddFormFillEnv(CPDFDoc_Environment* pEnv) {
  if (!pEnv)
    return FALSE;

  m_pEnvList.Add(pEnv);
  return TRUE;
}

FX_BOOL CPDFXFA_App::RemoveFormFillEnv(CPDFDoc_Environment* pEnv) {
  if (!pEnv)
    return FALSE;

  int nFind = m_pEnvList.Find(pEnv);
  if (nFind != -1) {
    m_pEnvList.RemoveAt(nFind);
    return TRUE;
  }

  return FALSE;
}

void CPDFXFA_App::GetAppType(CFX_WideString& wsAppType) {
  wsAppType = m_csAppType;
}

void CPDFXFA_App::GetAppName(CFX_WideString& wsName) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    wsName = pEnv->FFI_GetAppName();
  }
}

void CPDFXFA_App::SetAppType(const CFX_WideStringC& wsAppType) {
  m_csAppType = wsAppType;
}

void CPDFXFA_App::GetLanguage(CFX_WideString& wsLanguage) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    wsLanguage = pEnv->FFI_GetLanguage();
  }
}

void CPDFXFA_App::GetPlatform(CFX_WideString& wsPlatform) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    wsPlatform = pEnv->FFI_GetPlatform();
  }
}

void CPDFXFA_App::GetVariation(CFX_WideString& wsVariation) {
  wsVariation = JS_STR_VIEWERVARIATION;
}

void CPDFXFA_App::GetVersion(CFX_WideString& wsVersion) {
  wsVersion = JS_STR_VIEWERVERSION_XFA;
}

void CPDFXFA_App::Beep(uint32_t dwType) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    pEnv->JS_appBeep(dwType);
  }
}

int32_t CPDFXFA_App::MsgBox(const CFX_WideStringC& wsMessage,
                            const CFX_WideStringC& wsTitle,
                            uint32_t dwIconType,
                            uint32_t dwButtonType) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (!pEnv)
    return -1;

  uint32_t iconType = 0;
  int iButtonType = 0;
  switch (dwIconType) {
    case XFA_MBICON_Error:
      iconType |= 0;
      break;
    case XFA_MBICON_Warning:
      iconType |= 1;
      break;
    case XFA_MBICON_Question:
      iconType |= 2;
      break;
    case XFA_MBICON_Status:
      iconType |= 3;
      break;
  }
  switch (dwButtonType) {
    case XFA_MB_OK:
      iButtonType |= 0;
      break;
    case XFA_MB_OKCancel:
      iButtonType |= 1;
      break;
    case XFA_MB_YesNo:
      iButtonType |= 2;
      break;
    case XFA_MB_YesNoCancel:
      iButtonType |= 3;
      break;
  }
  int32_t iRet = pEnv->JS_appAlert(wsMessage.c_str(), wsTitle.c_str(),
                                   iButtonType, iconType);
  switch (iRet) {
    case 1:
      return XFA_IDOK;
    case 2:
      return XFA_IDCancel;
    case 3:
      return XFA_IDNo;
    case 4:
      return XFA_IDYes;
  }
  return XFA_IDYes;
}

void CPDFXFA_App::Response(CFX_WideString& wsAnswer,
                           const CFX_WideStringC& wsQuestion,
                           const CFX_WideStringC& wsTitle,
                           const CFX_WideStringC& wsDefaultAnswer,
                           FX_BOOL bMark) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    int nLength = 2048;
    char* pBuff = new char[nLength];
    nLength = pEnv->JS_appResponse(wsQuestion.c_str(), wsTitle.c_str(),
                                   wsDefaultAnswer.c_str(), NULL, bMark, pBuff,
                                   nLength);
    if (nLength > 0) {
      nLength = nLength > 2046 ? 2046 : nLength;
      pBuff[nLength] = 0;
      pBuff[nLength + 1] = 0;
      wsAnswer = CFX_WideString::FromUTF16LE(
          reinterpret_cast<const unsigned short*>(pBuff),
          nLength / sizeof(unsigned short));
    }
    delete[] pBuff;
  }
}

int32_t CPDFXFA_App::GetCurDocumentInBatch() {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    return pEnv->FFI_GetCurDocument();
  }
  return 0;
}

int32_t CPDFXFA_App::GetDocumentCountInBatch() {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    return pEnv->FFI_GetDocumentCount();
  }

  return 0;
}

IFX_FileRead* CPDFXFA_App::DownloadURL(const CFX_WideStringC& wsURL) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    return pEnv->FFI_DownloadFromURL(wsURL.c_str());
  }
  return NULL;
}

FX_BOOL CPDFXFA_App::PostRequestURL(const CFX_WideStringC& wsURL,
                                    const CFX_WideStringC& wsData,
                                    const CFX_WideStringC& wsContentType,
                                    const CFX_WideStringC& wsEncode,
                                    const CFX_WideStringC& wsHeader,
                                    CFX_WideString& wsResponse) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    wsResponse = pEnv->FFI_PostRequestURL(wsURL.c_str(), wsData.c_str(),
                                          wsContentType.c_str(),
                                          wsEncode.c_str(), wsHeader.c_str());
    return TRUE;
  }
  return FALSE;
}

FX_BOOL CPDFXFA_App::PutRequestURL(const CFX_WideStringC& wsURL,
                                   const CFX_WideStringC& wsData,
                                   const CFX_WideStringC& wsEncode) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv) {
    return pEnv->FFI_PutRequestURL(wsURL.c_str(), wsData.c_str(),
                                   wsEncode.c_str());
  }
  return FALSE;
}

void CPDFXFA_App::LoadString(int32_t iStringID, CFX_WideString& wsString) {
  switch (iStringID) {
    case XFA_IDS_ValidateFailed:
      wsString = L"%s validate failed";
      return;
    case XFA_IDS_CalcOverride:
      wsString = L"Calculate Override";
      return;
    case XFA_IDS_ModifyField:
      wsString = L"Are you sure you want to modify this field?";
      return;
    case XFA_IDS_NotModifyField:
      wsString = L"You are not allowed to modify this field.";
      return;
    case XFA_IDS_AppName:
      wsString = L"Foxit";
      return;
    case XFA_IDS_ImageFilter:
      wsString =
          L"Image "
          L"Files(*.bmp;*.jpg;*.png;*.gif;*.tif)|*.bmp;*.jpg;*.png;*.gif;*.tif|"
          L"All Files(*.*)|*.*||";
      return;
    case XFA_IDS_UNKNOW_CATCHED:
      wsString = L"unknown error is catched!";
      return;
    case XFA_IDS_Unable_TO_SET:
      wsString = L"Unable to set ";
      return;
    case XFA_IDS_VALUE_EXCALMATORY:
      wsString = L" value!";
      return;
    case XFA_IDS_INVALID_ENUM_VALUE:
      wsString = L"Invalid enumerated value: ";
      return;
    case XFA_IDS_UNSUPPORT_METHOD:
      wsString = L"unsupport %s method.";
      return;
    case XFA_IDS_UNSUPPORT_PROP:
      wsString = L"unsupport %s property.";
      return;
    case XFA_IDS_INVAlID_PROP_SET:
      wsString = L"Invalid property set operation;";
      return;
    case XFA_IDS_NOT_DEFAUL_VALUE:
      wsString = L" doesn't have a default property";
      return;
    case XFA_IDS_UNABLE_SET_LANGUAGE:
      wsString = L"Unable to set language value!";
      return;
    case XFA_IDS_UNABLE_SET_NUMPAGES:
      wsString = L"Unable to set numPages value!";
      return;
    case XFA_IDS_UNABLE_SET_PLATFORM:
      wsString = L"Unable to set platform value!";
      return;
    case XFA_IDS_UNABLE_SET_VALIDATIONENABLE:
      wsString = L"Unable to set validationsEnabled value!";
      return;
    case XFA_IDS_UNABLE_SET_VARIATION:
      wsString = L"Unable to set variation value!";
      return;
    case XFA_IDS_UNABLE_SET_VERSION:
      wsString = L"Unable to set version value!";
      return;
    case XFA_IDS_UNABLE_SET_READY:
      wsString = L"Unable to set ready value!";
      return;
    case XFA_IDS_NUMBER_OF_OCCUR:
      wsString =
          L"The element [%s] has violated its allowable number of occurrences";
      return;
    case XFA_IDS_UNABLE_SET_CLASS_NAME:
      wsString = L"Unable to set className value!";
      return;
    case XFA_IDS_UNABLE_SET_LENGTH_VALUE:
      wsString = L"Unable to set length value!";
      return;
    case XFA_IDS_UNSUPPORT_CHAR:
      wsString = L"unsupported char '%c'";
      return;
    case XFA_IDS_BAD_SUFFIX:
      wsString = L"bad suffix on number";
      return;
    case XFA_IDS_EXPECTED_IDENT:
      wsString = L"expected identifier instead of '%s'";
      return;
    case XFA_IDS_EXPECTED_STRING:
      wsString = L"expected '%s' instead of '%s'";
      return;
    case XFA_IDS_INVALIDATE_CHAR:
      wsString = L"invalidate char '%c'";
      return;
    case XFA_IDS_REDEFINITION:
      wsString = L"'%s' redefinition ";
      return;
    case XFA_IDS_INVALIDATE_TOKEN:
      wsString = L"invalidate token '%s'";
      return;
    case XFA_IDS_INVALIDATE_EXPRESSION:
      wsString = L"invalidate expression '%s'";
      return;
    case XFA_IDS_UNDEFINE_IDENTIFIER:
      wsString = L"undefined identifier '%s'";
      return;
    case XFA_IDS_INVALIDATE_LEFTVALUE:
      wsString = L"invalidate left-value '%s'";
      return;
    case XFA_IDS_COMPILER_ERROR:
      wsString = L"compiler error";
      return;
    case XFA_IDS_CANNOT_MODIFY_VALUE:
      wsString = L"can't modify the '%s' value";
      return;
    case XFA_IDS_ERROR_PARAMETERS:
      wsString = L"function '%s' has not %d parameters";
      return;
    case XFA_IDS_EXPECT_ENDIF:
      wsString = L"expected 'endif' instead of '%s'";
      return;
    case XFA_IDS_UNEXPECTED_EXPRESSION:
      wsString = L"unexpected expression '%s'";
      return;
    case XFA_IDS_CONDITION_IS_NULL:
      wsString = L"condition is null";
      return;
    case XFA_IDS_ILLEGALBREAK:
      wsString = L"illegal break";
      return;
    case XFA_IDS_ILLEGALCONTINUE:
      wsString = L"illegal continue";
      return;
    case XFA_IDS_EXPECTED_OPERATOR:
      wsString = L"expected operator '%s' instead of '%s'";
      return;
    case XFA_IDS_DIVIDE_ZERO:
      wsString = L"divide by zero";
      return;
    case XFA_IDS_CANNOT_COVERT_OBJECT:
      wsString = L"%s.%s can not covert to object";
      return;
    case XFA_IDS_NOT_FOUND_CONTAINER:
      wsString = L"can not found container '%s'";
      return;
    case XFA_IDS_NOT_FOUND_PROPERTY:
      wsString = L"can not found property '%s'";
      return;
    case XFA_IDS_NOT_FOUND_METHOD:
      wsString = L"can not found method '%s'";
      return;
    case XFA_IDS_NOT_FOUND_CONST:
      wsString = L"can not found const '%s'";
      return;
    case XFA_IDS_NOT_ASSIGN_OBJECT:
      wsString = L"can not direct assign value to object";
      return;
    case XFA_IDS_IVALIDATE_INSTRUCTION:
      wsString = L"invalidate instruction";
      return;
    case XFA_IDS_EXPECT_NUMBER:
      wsString = L"expected number instead of '%s'";
      return;
    case XFA_IDS_VALIDATE_OUT_ARRAY:
      wsString = L"validate access index '%s' out of array";
      return;
    case XFA_IDS_CANNOT_ASSIGN_IDENT:
      wsString = L"can not assign to %s";
      return;
    case XFA_IDS_NOT_FOUNT_FUNCTION:
      wsString = L"can not found '%s' function";
      return;
    case XFA_IDS_NOT_ARRAY:
      wsString = L"'%s' doesn't an array";
      return;
    case XFA_IDS_OUT_ARRAY:
      wsString = L"out of range of '%s' array";
      return;
    case XFA_IDS_NOT_SUPPORT_CALC:
      wsString = L"'%s' operator can not support array calculate";
      return;
    case XFA_IDS_ARGUMENT_NOT_ARRAY:
      wsString = L"'%s' function's %d argument can not be array";
      return;
    case XFA_IDS_ARGUMENT_EXPECT_CONTAINER:
      wsString = L"'%s' argument expected a container";
      return;
    case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT:
      wsString =
          L"an attempt was made to reference property '%s' of a non-object in "
          L"SOM expression %s";
      return;
    case XFA_IDS_FUNCTION_IS_BUILDIN:
      wsString = L"function '%s' is buildin";
      return;
    case XFA_IDS_ERROR_MSG:
      wsString = L"%s : %s";
      return;
    case XFA_IDS_INDEX_OUT_OF_BOUNDS:
      wsString = L"Index value is out of bounds";
      return;
    case XFA_IDS_INCORRECT_NUMBER_OF_METHOD:
      wsString = L"Incorrect number of parameters calling method '%s'";
      return;
    case XFA_IDS_ARGUMENT_MISMATCH:
      wsString = L"Argument mismatch in property or function argument";
      return;
    case XFA_IDS_INVALID_ENUMERATE:
      wsString = L"Invalid enumerated value: %s";
      return;
    case XFA_IDS_INVALID_APPEND:
      wsString =
          L"Invalid append operation: %s cannot have a child element of %s";
      return;
    case XFA_IDS_SOM_EXPECTED_LIST:
      wsString =
          L"SOM expression returned list when single result was expected";
      return;
    case XFA_IDS_NOT_HAVE_PROPERTY:
      wsString = L"'%s' doesn't have property '%s'";
      return;
    case XFA_IDS_INVALID_NODE_TYPE:
      wsString = L"Invalid node type : '%s'";
      return;
    case XFA_IDS_VIOLATE_BOUNDARY:
      wsString =
          L"The element [%s] has violated its allowable number of occurrences";
      return;
    case XFA_IDS_SERVER_DENY:
      wsString = L"Server does not permit";
      return;
    case XFA_IDS_ValidateLimit:
      wsString = FX_WSTRC(
          L"Message limit exceeded. Remaining %d validation errors not "
          L"reported.");
      return;
    case XFA_IDS_ValidateNullWarning:
      wsString = FX_WSTRC(
          L"%s cannot be left blank. To ignore validations for %s, click "
          L"Ignore.");
      return;
    case XFA_IDS_ValidateNullError:
      wsString = FX_WSTRC(L"%s cannot be left blank.");
      return;
    case XFA_IDS_ValidateWarning:
      wsString = FX_WSTRC(
          L"The value you entered for %s is invalid. To ignore validations for "
          L"%s, click Ignore.");
      return;
    case XFA_IDS_ValidateError:
      wsString = FX_WSTRC(L"The value you entered for %s is invalid.");
      return;
  }
}

IFWL_AdapterTimerMgr* CPDFXFA_App::GetTimerMgr() {
  CXFA_FWLAdapterTimerMgr* pAdapter = NULL;
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (pEnv)
    pAdapter = new CXFA_FWLAdapterTimerMgr(pEnv);
  return pAdapter;
}
