// 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/include/fpdfxfa/fpdfxfa_app.h"
#include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
#include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
#include "fpdfsdk/include/fsdk_define.h"
#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/include/javascript/IJavaScript.h"
#include "public/fpdf_formfill.h"
#include "xfa/include/fxbarcode/BC_BarCode.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_pFontMgr(NULL),
      m_hJSERuntime(NULL),
      m_csAppType(JS_STR_VIEWERTYPE_STANDARD),
      m_bOwnedRuntime(false) {
  m_pEnvList.RemoveAll();
}

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

  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 = IXFA_App::Create(this);
  if (!m_pXFAApp)
    return FALSE;

  m_pFontMgr = IXFA_FontMgr::CreateDefault();
  if (!m_pFontMgr)
    return FALSE;

  m_pXFAApp->SetDefaultFontMgr(m_pFontMgr);
#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(FX_DWORD 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,
                            FX_DWORD dwIconType,
                            FX_DWORD dwButtonType) {
  CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0);
  if (!pEnv)
    return -1;

  FX_DWORD 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.GetPtr(), wsTitle.GetPtr(),
                                   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.GetPtr(), wsTitle.GetPtr(),
                                   wsDefaultAnswer.GetPtr(), 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.GetPtr());
  }
  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.GetPtr(), wsData.GetPtr(),
                                          wsContentType.GetPtr(),
                                          wsEncode.GetPtr(), wsHeader.GetPtr());
    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.GetPtr(), wsData.GetPtr(),
                                   wsEncode.GetPtr());
  }
  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;
  }
}

FX_BOOL CPDFXFA_App::ShowFileDialog(const CFX_WideStringC& wsTitle,
                                    const CFX_WideStringC& wsFilter,
                                    CFX_WideStringArray& wsPathArr,
                                    FX_BOOL bOpen) {
  return FALSE;
}

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;
}
