// 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

#ifndef FPDFSDK_SRC_JAVASCRIPT_UTIL_H_
#define FPDFSDK_SRC_JAVASCRIPT_UTIL_H_

#include <string>  // For std::wstring.

#include "JS_Define.h"

class util : public CJS_EmbedObj {
 public:
  util(CJS_Object* pJSObject);
  ~util() override;

 public:
  FX_BOOL printd(IJS_Context* cc,
                 const CJS_Parameters& params,
                 CJS_Value& vRet,
                 CFX_WideString& sError);
  FX_BOOL printf(IJS_Context* cc,
                 const CJS_Parameters& params,
                 CJS_Value& vRet,
                 CFX_WideString& sError);
  FX_BOOL printx(IJS_Context* cc,
                 const CJS_Parameters& params,
                 CJS_Value& vRet,
                 CFX_WideString& sError);
  FX_BOOL scand(IJS_Context* cc,
                const CJS_Parameters& params,
                CJS_Value& vRet,
                CFX_WideString& sError);
  FX_BOOL byteToChar(IJS_Context* cc,
                     const CJS_Parameters& params,
                     CJS_Value& vRet,
                     CFX_WideString& sError);

 public:
  static void printd(const std::wstring& cFormat,
                     CJS_Date Date,
                     bool bXFAPicture,
                     std::wstring& cPurpose);
  static void printx(const std::string& cFormat,
                     const std::string& cSource,
                     std::string& cPurpose);
  static int ParstDataType(std::wstring* sFormat);
};

class CJS_Util : public CJS_Object {
 public:
  CJS_Util(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
  ~CJS_Util() override {}

  DECLARE_JS_CLASS();

  JS_STATIC_METHOD(printd, util);
  JS_STATIC_METHOD(printf, util);
  JS_STATIC_METHOD(printx, util);
  JS_STATIC_METHOD(scand, util);
  JS_STATIC_METHOD(byteToChar, util);
};

int64_t FX_atoi64(const char* nptr);

#endif  // FPDFSDK_SRC_JAVASCRIPT_UTIL_H_
