// 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_FXFA_H_
#define XFA_FXFA_FXFA_H_

#include <type_traits>

#include "core/fxcrt/cfx_timer.h"
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/widestring.h"
#include "core/fxge/dib/fx_dib.h"
#include "xfa/fxfa/fxfa_basic.h"

class CFX_XMLDocument;
class CXFA_FFDoc;
class CXFA_FFPageView;
class CXFA_FFWidget;
class CXFA_Submit;
class IFX_SeekableReadStream;
class IJS_Runtime;

namespace cppgc {
class Heap;
}  // namespace cppgc

// Note, values must match fpdf_formfill.h JSPLATFORM_ALERT_BUTTON_* flags.
enum class AlertButton {
  kDefault = 0,
  kOK = 0,
  kOKCancel = 1,
  kYesNo = 2,
  kYesNoCancel = 3,
};

// Note, values must match fpdf_formfill.h JSPLATFORM_ALERT_ICON_* flags.
enum class AlertIcon {
  kDefault = 0,
  kError = 0,
  kWarning = 1,
  kQuestion = 2,
  kStatus = 3,
  kAsterisk = 4,
};

// Note, values must match fpdf_formfill.h JSPLATFORM_ALERT_RETURN_* flags.
enum class AlertReturn {
  kOK = 1,
  kCancel = 2,
  kNo = 3,
  kYes = 4,
};

// Note, values must match fpdf_formfill.h FORMTYPE_* flags.
enum class FormType {
  kNone = 0,
  kAcroForm = 1,
  kXFAFull = 2,
  kXFAForeground = 3,
};

enum XFA_PrintOpt : uint8_t {
  XFA_PRINTOPT_ShowDialog = 1 << 0,
  XFA_PRINTOPT_CanCancel = 1 << 1,
  XFA_PRINTOPT_ShrinkPage = 1 << 2,
  XFA_PRINTOPT_AsImage = 1 << 3,
  XFA_PRINTOPT_ReverseOrder = 1 << 4,
  XFA_PRINTOPT_PrintAnnot = 1 << 5,
};
using XFA_PrintOptMask = std::underlying_type<XFA_PrintOpt>::type;

enum class XFA_EventError {
  kError = -1,
  kNotExist = 0,
  kSuccess = 1,
  kDisabled = 2,
};

enum XFA_WidgetStatus : uint16_t {
  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_Printable = 1 << 4,
  XFA_WidgetStatus_RectCached = 1 << 5,
  XFA_WidgetStatus_TextEditValueChanged = 1 << 6,
  XFA_WidgetStatus_Viewable = 1 << 7,
  XFA_WidgetStatus_Visible = 1 << 8
};
using XFA_WidgetStatusMask = std::underlying_type<XFA_WidgetStatus>::type;

// Probably should be CXFA_FFApp::CallbackIface in cxfa_ffapp.h
class IXFA_AppProvider {
 public:
  virtual ~IXFA_AppProvider() = default;

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

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

  /**
   * Get application name, such as Phantom.
   */
  virtual WideString GetAppName() = 0;

  /**
   * Get application message box title.
   */
  virtual WideString GetAppTitle() const = 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 WideString& wsMessage,
                         const WideString& wsTitle,
                         uint32_t dwIconType,
                         uint32_t dwButtonType) = 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 WideString Response(const WideString& wsQuestion,
                              const WideString& wsTitle,
                              const WideString& wsDefaultAnswer,
                              bool bMask) = 0;

  /**
   * Download something from somewhere.
   * @param[in] wsURL - http, ftp, such as
   * "http://www.w3.org/TR/REC-xml-names/".
   */
  virtual RetainPtr<IFX_SeekableReadStream> DownloadURL(
      const 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 bool PostRequestURL(const WideString& wsURL,
                              const WideString& wsData,
                              const WideString& wsContentType,
                              const WideString& wsEncode,
                              const WideString& wsHeader,
                              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 bool PutRequestURL(const WideString& wsURL,
                             const WideString& wsData,
                             const WideString& wsEncode) = 0;

  virtual CFX_Timer::HandlerIface* GetTimerHandler() const = 0;
  virtual cppgc::Heap* GetGCHeap() const = 0;
};

// Probably should be called CFXA_FFDoc::CallbackIface in cxfa_ffdoc.h
class IXFA_DocEnvironment {
 public:
  enum class PageViewEvent {
    kPostAdded = 1,
    kPostRemoved = 3,
    kStopLayout = 4,
  };

  virtual ~IXFA_DocEnvironment() = default;

  virtual void SetChangeMark(CXFA_FFDoc* hDoc) = 0;
  virtual void InvalidateRect(CXFA_FFPageView* pPageView,
                              const CFX_RectF& rt) = 0;
  // Show or hide caret.
  virtual void DisplayCaret(CXFA_FFWidget* hWidget,
                            bool bVisible,
                            const CFX_RectF* pRtAnchor) = 0;

  virtual bool GetPopupPos(CXFA_FFWidget* hWidget,
                           float fMinPopup,
                           float fMaxPopup,
                           const CFX_RectF& rtAnchor,
                           CFX_RectF* pPopupRect) = 0;
  virtual bool PopupMenu(CXFA_FFWidget* hWidget, const CFX_PointF& ptPopup) = 0;

  virtual void OnPageViewEvent(CXFA_FFPageView* pPageView,
                               PageViewEvent eEvent) = 0;

  virtual void WidgetPostAdd(CXFA_FFWidget* hWidget) = 0;
  virtual void WidgetPreRemove(CXFA_FFWidget* hWidget) = 0;
  virtual int32_t CountPages(const CXFA_FFDoc* hDoc) const = 0;
  virtual int32_t GetCurrentPage(const CXFA_FFDoc* hDoc) const = 0;
  virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0;
  virtual bool IsCalculationsEnabled(const CXFA_FFDoc* hDoc) const = 0;
  virtual void SetCalculationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0;
  virtual WideString GetTitle(const CXFA_FFDoc* hDoc) const = 0;
  virtual void SetTitle(CXFA_FFDoc* hDoc, const WideString& wsTitle) = 0;
  virtual void ExportData(CXFA_FFDoc* hDoc,
                          const WideString& wsFilePath,
                          bool bXDP) = 0;
  virtual void GotoURL(CXFA_FFDoc* hDoc, const WideString& bsURL) = 0;
  virtual bool IsValidationsEnabled(const CXFA_FFDoc* hDoc) const = 0;
  virtual void SetValidationsEnabled(CXFA_FFDoc* hDoc, 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,
                     XFA_PrintOptMask dwOptions) = 0;
  virtual FX_ARGB GetHighlightColor(const CXFA_FFDoc* hDoc) const = 0;
  virtual IJS_Runtime* GetIJSRuntime(const CXFA_FFDoc* hDoc) const = 0;
  virtual CFX_XMLDocument* GetXMLDoc() const = 0;
  virtual RetainPtr<IFX_SeekableReadStream> OpenLinkedFile(
      CXFA_FFDoc* hDoc,
      const WideString& wsLink) = 0;

#ifdef PDF_XFA_ELEMENT_SUBMIT_ENABLED
  virtual bool Submit(CXFA_FFDoc* hDoc, CXFA_Submit* submit) = 0;
#endif  // PDF_XFA_ELEMENT_SUBMIT_ENABLED
};

class IXFA_WidgetIterator {
 public:
  virtual ~IXFA_WidgetIterator() = default;

  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 bool SetCurrentWidget(CXFA_FFWidget* hWidget) = 0;
};

#endif  // XFA_FXFA_FXFA_H_
