// 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 XFA_FXFA_INCLUDE_FXFA_H_
#define XFA_FXFA_INCLUDE_FXFA_H_

#include <vector>

#include "xfa/fxfa/include/fxfa_basic.h"
#include "xfa/fxfa/include/fxfa_widget.h"

class CFGAS_GEFont;
class CFX_Graphics;
class CPDF_Document;
class CXFA_FFPageView;
class CXFA_Node;
class CXFA_NodeList;
class CXFA_WidgetAcc;
class IFWL_AdapterTimerMgr;
class IXFA_AppProvider;
class IXFA_DocProvider;
class IXFA_WidgetAccIterator;
class IXFA_WidgetIterator;

#define XFA_MBICON_Error 0
#define XFA_MBICON_Warning 1
#define XFA_MBICON_Question 2
#define XFA_MBICON_Status 3
#define XFA_MB_OK 0
#define XFA_MB_OKCancel 1
#define XFA_MB_YesNo 2
#define XFA_MB_YesNoCancel 3
#define XFA_IDOK 1
#define XFA_IDCancel 2
#define XFA_IDNo 3
#define XFA_IDYes 4
#define XFA_IDS_ValidateFailed 1
#define XFA_IDS_CalcOverride 2
#define XFA_IDS_ModifyField 3
#define XFA_IDS_NotModifyField 4
#define XFA_IDS_AppName 5
#define XFA_IDS_Unable_TO_SET 8
#define XFA_IDS_INVAlID_PROP_SET 13
#define XFA_IDS_NOT_DEFAUL_VALUE 14
#define XFA_IDS_UNABLE_SET_LANGUAGE 15
#define XFA_IDS_UNABLE_SET_NUMPAGES 16
#define XFA_IDS_UNABLE_SET_PLATFORM 17
#define XFA_IDS_UNABLE_SET_VARIATION 19
#define XFA_IDS_UNABLE_SET_VERSION 20
#define XFA_IDS_UNABLE_SET_READY 21
#define XFA_IDS_COMPILER_ERROR 35
#define XFA_IDS_DIVIDE_ZERO 44
#define XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT 61
#define XFA_IDS_INDEX_OUT_OF_BOUNDS 64
#define XFA_IDS_INCORRECT_NUMBER_OF_METHOD 65
#define XFA_IDS_ARGUMENT_MISMATCH 66
#define XFA_IDS_NOT_HAVE_PROPERTY 70
#define XFA_IDS_VIOLATE_BOUNDARY 72
#define XFA_IDS_SERVER_DENY 73
#define XFA_IDS_StringWeekDay_Sun 74
#define XFA_IDS_StringWeekDay_Mon 75
#define XFA_IDS_StringWeekDay_Tue 76
#define XFA_IDS_StringWeekDay_Wed 77
#define XFA_IDS_StringWeekDay_Thu 78
#define XFA_IDS_StringWeekDay_Fri 79
#define XFA_IDS_StringWeekDay_Sat 80
#define XFA_IDS_StringMonth_Jan 81
#define XFA_IDS_StringMonth_Feb 82
#define XFA_IDS_StringMonth_March 83
#define XFA_IDS_StringMonth_April 84
#define XFA_IDS_StringMonth_May 85
#define XFA_IDS_StringMonth_June 86
#define XFA_IDS_StringMonth_July 87
#define XFA_IDS_StringMonth_Aug 88
#define XFA_IDS_StringMonth_Sept 89
#define XFA_IDS_StringMonth_Oct 90
#define XFA_IDS_StringMonth_Nov 91
#define XFA_IDS_StringMonth_Dec 92
#define XFA_IDS_String_Today 93
#define XFA_IDS_ValidateLimit 94
#define XFA_IDS_ValidateNullWarning 95
#define XFA_IDS_ValidateNullError 96
#define XFA_IDS_ValidateWarning 97
#define XFA_IDS_ValidateError 98
#define XFA_IDS_ValidateNumberError 99

#define XFA_DOCVIEW_View 0x00000000
#define XFA_DOCVIEW_MasterPage 0x00000001
#define XFA_DOCVIEW_Design 0x00000002
#define XFA_DOCTYPE_Dynamic 0
#define XFA_DOCTYPE_Static 1
#define XFA_DOCTYPE_XDP 2
#define XFA_PARSESTATUS_StatusErr -3
#define XFA_PARSESTATUS_StreamErr -2
#define XFA_PARSESTATUS_SyntaxErr -1
#define XFA_PARSESTATUS_Ready 0
#define XFA_PARSESTATUS_Done 100
#define XFA_VALIDATE_preSubmit 1
#define XFA_VALIDATE_prePrint 2
#define XFA_VALIDATE_preExecute 3
#define XFA_VALIDATE_preSave 4

#define XFA_INVALIDATE_AllPages 0x00000000
#define XFA_INVALIDATE_CurrentPage 0x00000001
#define XFA_PRINTOPT_ShowDialog 0x00000001
#define XFA_PRINTOPT_CanCancel 0x00000002
#define XFA_PRINTOPT_ShrinkPage 0x00000004
#define XFA_PRINTOPT_AsImage 0x00000008
#define XFA_PRINTOPT_ReverseOrder 0x00000010
#define XFA_PRINTOPT_PrintAnnot 0x00000020
#define XFA_PAGEVIEWEVENT_PostAdded 1
#define XFA_PAGEVIEWEVENT_PostRemoved 3
#define XFA_PAGEVIEWEVENT_StopLayout 4

#define XFA_EVENTERROR_Success 1
#define XFA_EVENTERROR_Error -1
#define XFA_EVENTERROR_NotExist 0
#define XFA_EVENTERROR_Disabled 2

#define XFA_RENDERSTATUS_Ready 1
#define XFA_RENDERSTATUS_ToBeContinued 2
#define XFA_RENDERSTATUS_Done 3
#define XFA_RENDERSTATUS_Failed -1

#define XFA_TRAVERSEWAY_Tranvalse 0x0001
#define XFA_TRAVERSEWAY_Form 0x0002

enum XFA_WidgetStatus {
  XFA_WidgetStatus_None = 0,

  XFA_WidgetStatus_Access = 1 << 0,
  XFA_WidgetStatus_ButtonDown = 1 << 1,
  XFA_WidgetStatus_Disabled = 1 << 2,
  XFA_WidgetStatus_Focused = 1 << 3,
  XFA_WidgetStatus_Highlight = 1 << 4,
  XFA_WidgetStatus_Printable = 1 << 5,
  XFA_WidgetStatus_RectCached = 1 << 6,
  XFA_WidgetStatus_TextEditValueChanged = 1 << 7,
  XFA_WidgetStatus_Viewable = 1 << 8,
  XFA_WidgetStatus_Visible = 1 << 9
};

enum XFA_WIDGETORDER {
  XFA_WIDGETORDER_PreOrder,
};

enum XFA_WIDGETTYPE {
  XFA_WIDGETTYPE_Barcode,
  XFA_WIDGETTYPE_PushButton,
  XFA_WIDGETTYPE_CheckButton,
  XFA_WIDGETTYPE_RadioButton,
  XFA_WIDGETTYPE_DatetimeEdit,
  XFA_WIDGETTYPE_DecimalField,
  XFA_WIDGETTYPE_NumericField,
  XFA_WIDGETTYPE_Signature,
  XFA_WIDGETTYPE_TextEdit,
  XFA_WIDGETTYPE_DropdownList,
  XFA_WIDGETTYPE_ListBox,
  XFA_WIDGETTYPE_ImageField,
  XFA_WIDGETTYPE_PasswordEdit,
  XFA_WIDGETTYPE_Arc,
  XFA_WIDGETTYPE_Rectangle,
  XFA_WIDGETTYPE_Image,
  XFA_WIDGETTYPE_Line,
  XFA_WIDGETTYPE_Text,
  XFA_WIDGETTYPE_ExcludeGroup,
  XFA_WIDGETTYPE_Subform,
  XFA_WIDGETTYPE_Unknown,
};

// Probably should be called IXFA_AppDelegate.
class IXFA_AppProvider {
 public:
  virtual ~IXFA_AppProvider() {}

  /**
   * Specifies the name of the client application in which a form currently
   * exists. Such as Exchange-Pro.
   */
  virtual void SetAppType(const CFX_WideStringC& wsAppType) = 0;
  virtual void GetAppType(CFX_WideString& wsAppType) = 0;
  virtual void SetFoxitAppType(const CFX_WideStringC& wsFoxitAppType) = 0;
  virtual void GetFoxitAppType(CFX_WideString& wsFoxitAppType) = 0;

  /**
   * Returns the language of the running host application. Such as zh_CN
   */
  virtual void GetLanguage(CFX_WideString& wsLanguage) = 0;

  /**
   * Returns the platform of the machine running the script. Such as WIN
   */
  virtual void GetPlatform(CFX_WideString& wsPlatform) = 0;

  /**
   * Indicates the packaging of the application that is running the script. Such
   * as Full
   */
  virtual void GetVariation(CFX_WideString& wsVariation) = 0;

  /**
   * Indicates the version number of the current application. Such as 9
   */
  virtual void GetVersion(CFX_WideString& wsVersion) = 0;
  virtual void GetFoxitVersion(CFX_WideString& wsFoxitVersion) = 0;

  /**
   * Get application name, such as Phantom.
   */
  virtual void GetAppName(CFX_WideString& wsName) = 0;
  virtual void GetFoxitAppName(CFX_WideString& wsFoxitName) = 0;

  /**
   * Causes the system to play a sound.
   * @param[in] dwType The system code for the appropriate sound.0 (Error)1
   * (Warning)2 (Question)3 (Status)4 (Default)
   */
  virtual void Beep(uint32_t dwType) = 0;

  /**
   * Displays a message box.
   * @param[in] wsMessage    - Message string to display in box.
   * @param[in] wsTitle      - Title string for box.
   * @param[in] dwIconType   - Icon type, refer to XFA_MBICON.
   * @param[in] dwButtonType - Button type, refer to XFA_MESSAGEBUTTON.
   * @return A valid integer representing the value of the button pressed by the
   * user, refer to XFA_ID.
   */
  virtual int32_t MsgBox(const CFX_WideString& wsMessage,
                         const CFX_WideString& wsTitle = L"",
                         uint32_t dwIconType = 0,
                         uint32_t dwButtonType = 0) = 0;

  /**
   * Get a response from the user.
   * @param[in] wsQuestion      - Message string to display in box.
   * @param[in] wsTitle         - Title string for box.
   * @param[in] wsDefaultAnswer - Initial contents for answer.
   * @param[in] bMask           - Mask the user input with asterisks when true,
   * @return A string containing the user's response.
   */
  virtual CFX_WideString Response(const CFX_WideString& wsQuestion,
                                  const CFX_WideString& wsTitle = L"",
                                  const CFX_WideString& wsDefaultAnswer = L"",
                                  FX_BOOL bMask = TRUE) = 0;

  virtual int32_t GetDocumentCountInBatch() = 0;
  virtual int32_t GetCurDocumentInBatch() = 0;

  /**
   * Download something from somewhere.
   * @param[in] wsURL - http, ftp, such as
   * "http://www.w3.org/TR/REC-xml-names/".
   */
  virtual IFX_FileRead* DownloadURL(const CFX_WideString& wsURL) = 0;

  /**
   * POST data to the given url.
   * @param[in] wsURL         the URL being uploaded.
   * @param[in] wsData        the data being uploaded.
   * @param[in] wsContentType the content type of data including text/html,
   * text/xml, text/plain, multipart/form-data,
   *                          application/x-www-form-urlencoded,
   * application/octet-stream, any valid MIME type.
   * @param[in] wsEncode      the encode of data including UTF-8, UTF-16,
   * ISO8859-1, any recognized [IANA]character encoding
   * @param[in] wsHeader      any additional HTTP headers to be included in the
   * post.
   * @param[out] wsResponse   decoded response from server.
   * @return TRUE Server permitted the post request, FALSE otherwise.
   */
  virtual FX_BOOL PostRequestURL(const CFX_WideString& wsURL,
                                 const CFX_WideString& wsData,
                                 const CFX_WideString& wsContentType,
                                 const CFX_WideString& wsEncode,
                                 const CFX_WideString& wsHeader,
                                 CFX_WideString& wsResponse) = 0;

  /**
   * PUT data to the given url.
   * @param[in] wsURL         the URL being uploaded.
   * @param[in] wsData            the data being uploaded.
   * @param[in] wsEncode      the encode of data including UTF-8, UTF-16,
   * ISO8859-1, any recognized [IANA]character encoding
   * @return TRUE Server permitted the post request, FALSE otherwise.
   */
  virtual FX_BOOL PutRequestURL(const CFX_WideString& wsURL,
                                const CFX_WideString& wsData,
                                const CFX_WideString& wsEncode) = 0;

  virtual void LoadString(int32_t iStringID, CFX_WideString& wsString) = 0;
  virtual IFWL_AdapterTimerMgr* GetTimerMgr() = 0;
};

class IXFA_DocProvider {
 public:
  virtual ~IXFA_DocProvider() {}

  virtual void SetChangeMark(CXFA_FFDoc* hDoc) = 0;
  virtual void InvalidateRect(CXFA_FFPageView* pPageView,
                              const CFX_RectF& rt,
                              uint32_t dwFlags = 0) = 0;
  virtual void DisplayCaret(CXFA_FFWidget* hWidget,
                            FX_BOOL bVisible,
                            const CFX_RectF* pRtAnchor) = 0;
  virtual FX_BOOL GetPopupPos(CXFA_FFWidget* hWidget,
                              FX_FLOAT fMinPopup,
                              FX_FLOAT fMaxPopup,
                              const CFX_RectF& rtAnchor,
                              CFX_RectF& rtPopup) = 0;
  virtual FX_BOOL PopupMenu(CXFA_FFWidget* hWidget,
                            CFX_PointF ptPopup,
                            const CFX_RectF* pRectExclude = NULL) = 0;
  virtual void PageViewEvent(CXFA_FFPageView* pPageView, uint32_t dwFlags) = 0;
  virtual void WidgetPostAdd(CXFA_FFWidget* hWidget,
                             CXFA_WidgetAcc* pWidgetData) = 0;
  virtual void WidgetPreRemove(CXFA_FFWidget* hWidget,
                               CXFA_WidgetAcc* pWidgetData) = 0;
  virtual FX_BOOL RenderCustomWidget(CXFA_FFWidget* hWidget,
                                     CFX_Graphics* pGS,
                                     CFX_Matrix* pMatrix,
                                     const CFX_RectF& rtUI) = 0;

  virtual int32_t CountPages(CXFA_FFDoc* hDoc) = 0;
  virtual int32_t GetCurrentPage(CXFA_FFDoc* hDoc) = 0;
  virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0;
  virtual FX_BOOL IsCalculationsEnabled(CXFA_FFDoc* hDoc) = 0;
  virtual void SetCalculationsEnabled(CXFA_FFDoc* hDoc, FX_BOOL bEnabled) = 0;
  virtual void GetTitle(CXFA_FFDoc* hDoc, CFX_WideString& wsTitle) = 0;
  virtual void SetTitle(CXFA_FFDoc* hDoc, const CFX_WideString& wsTitle) = 0;
  virtual void ExportData(CXFA_FFDoc* hDoc,
                          const CFX_WideString& wsFilePath,
                          FX_BOOL bXDP = TRUE) = 0;
  virtual void ImportData(CXFA_FFDoc* hDoc,
                          const CFX_WideString& wsFilePath) = 0;
  virtual void GotoURL(CXFA_FFDoc* hDoc,
                       const CFX_WideString& bsURL,
                       FX_BOOL bAppend = TRUE) = 0;
  virtual FX_BOOL IsValidationsEnabled(CXFA_FFDoc* hDoc) = 0;
  virtual void SetValidationsEnabled(CXFA_FFDoc* hDoc, FX_BOOL bEnabled) = 0;
  virtual void SetFocusWidget(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
  virtual void Print(CXFA_FFDoc* hDoc,
                     int32_t nStartPage,
                     int32_t nEndPage,
                     uint32_t dwOptions) = 0;
  virtual int32_t AbsPageCountInBatch(CXFA_FFDoc* hDoc) = 0;
  virtual int32_t AbsPageInBatch(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
  virtual int32_t SheetCountInBatch(CXFA_FFDoc* hDoc) = 0;
  virtual int32_t SheetInBatch(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
  virtual int32_t Verify(CXFA_FFDoc* hDoc,
                         CXFA_Node* pSigNode,
                         FX_BOOL bUsed = TRUE) = 0;
  virtual FX_BOOL Sign(CXFA_FFDoc* hDoc,
                       CXFA_NodeList* pNodeList,
                       const CFX_WideStringC& wsExpression,
                       const CFX_WideStringC& wsXMLIdent,
                       const CFX_WideStringC& wsValue = FX_WSTRC(L"open"),
                       FX_BOOL bUsed = TRUE) = 0;
  virtual CXFA_NodeList* Enumerate(CXFA_FFDoc* hDoc) = 0;
  virtual FX_BOOL Clear(CXFA_FFDoc* hDoc,
                        CXFA_Node* pSigNode,
                        FX_BOOL bCleared = TRUE) = 0;
  virtual void GetURL(CXFA_FFDoc* hDoc, CFX_WideString& wsDocURL) = 0;
  virtual FX_ARGB GetHighlightColor(CXFA_FFDoc* hDoc) = 0;

  virtual FX_BOOL SubmitData(CXFA_FFDoc* hDoc, CXFA_Submit submit) = 0;
  virtual FX_BOOL CheckWord(CXFA_FFDoc* hDoc, const CFX_ByteStringC& sWord) = 0;
  virtual FX_BOOL GetSuggestWords(CXFA_FFDoc* hDoc,
                                  const CFX_ByteStringC& sWord,
                                  std::vector<CFX_ByteString>& sSuggest) = 0;
  virtual FX_BOOL GetPDFScriptObject(CXFA_FFDoc* hDoc,
                                     const CFX_ByteStringC& utf8Name,
                                     CFXJSE_Value* pValue) = 0;
  virtual FX_BOOL GetGlobalProperty(CXFA_FFDoc* hDoc,
                                    const CFX_ByteStringC& szPropName,
                                    CFXJSE_Value* pValue) = 0;
  virtual FX_BOOL SetGlobalProperty(CXFA_FFDoc* hDoc,
                                    const CFX_ByteStringC& szPropName,
                                    CFXJSE_Value* pValue) = 0;
  virtual CPDF_Document* OpenPDF(CXFA_FFDoc* hDoc,
                                 IFX_FileRead* pFile,
                                 FX_BOOL bTakeOverFile) = 0;
  virtual IFX_FileRead* OpenLinkedFile(CXFA_FFDoc* hDoc,
                                       const CFX_WideString& wsLink) = 0;
};

class IXFA_WidgetIterator {
 public:
  virtual ~IXFA_WidgetIterator() {}

  virtual void Reset() = 0;
  virtual CXFA_FFWidget* MoveToFirst() = 0;
  virtual CXFA_FFWidget* MoveToLast() = 0;
  virtual CXFA_FFWidget* MoveToNext() = 0;
  virtual CXFA_FFWidget* MoveToPrevious() = 0;
  virtual CXFA_FFWidget* GetCurrentWidget() = 0;
  virtual FX_BOOL SetCurrentWidget(CXFA_FFWidget* hWidget) = 0;
};

#endif  // XFA_FXFA_INCLUDE_FXFA_H_