// 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 "xfa/fxfa/fm2js/xfa_fm2jsapi.h"

#include "core/fxcrt/include/fx_basic.h"
#include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"
#include "xfa/fxfa/fm2js/xfa_program.h"
#include "xfa/fxfa/parser/xfa_document.h"

#ifdef __cplusplus
extern "C" {
#endif

int32_t XFA_FM2JS_Translate(const CFX_WideStringC& wsFormcalc,
                            CFX_WideTextBuf& wsJavascript,
                            CFX_WideString& wsError) {
  if (wsFormcalc.IsEmpty()) {
    wsJavascript.Clear();
    wsError.clear();
    return 0;
  }
  int32_t status = 0;
  CXFA_FMProgram program;
  status = program.Init(wsFormcalc);
  if (status) {
    wsError = program.GetError().message;
    return status;
  }
  status = program.ParseProgram();
  if (status) {
    wsError = program.GetError().message;
    return status;
  }
  program.TranslateProgram(wsJavascript);
  return 0;
}
XFA_HFM2JSCONTEXT XFA_FM2JS_ContextCreate() {
  return (XFA_HFM2JSCONTEXT)CXFA_FM2JSContext::Create();
}
void XFA_FM2JS_ContextInitialize(XFA_HFM2JSCONTEXT hFM2JSContext,
                                 FXJSE_HRUNTIME hScriptRuntime,
                                 FXJSE_HCONTEXT hScriptContext,
                                 CXFA_Document* pDocument) {
  CXFA_FM2JSContext* pContext =
      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
  pContext->Initialize(hScriptRuntime, hScriptContext, pDocument);
}
void XFA_FM2JS_GlobalPropertyGetter(XFA_HFM2JSCONTEXT hFM2JSContext,
                                    FXJSE_HVALUE hValue) {
  CXFA_FM2JSContext* pContext =
      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
  pContext->GlobalPropertyGetter(hValue);
}
void XFA_FM2JS_ContextRelease(XFA_HFM2JSCONTEXT hFM2JSContext) {
  CXFA_FM2JSContext* pContext =
      reinterpret_cast<CXFA_FM2JSContext*>(hFM2JSContext);
  pContext->Release();
}
#ifdef __cplusplus
}
#endif
