// Copyright 2017 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 FXJS_CJS_DOCUMENT_H_
#define FXJS_CJS_DOCUMENT_H_

#include <list>
#include <memory>
#include <vector>

#include "core/fxcrt/observed_ptr.h"
#include "fxjs/cjs_object.h"
#include "fxjs/js_define.h"

class CPDFSDK_InteractiveForm;
class CPDF_InteractiveForm;
class CPDF_TextObject;
struct CJS_DelayData;

class CJS_Document final : public CJS_Object, public Observable {
 public:
  static uint32_t GetObjDefnID();
  static void DefineJSObjects(CFXJS_Engine* pEngine);

  CJS_Document(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime);
  ~CJS_Document() override;

  void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv);
  CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
    return m_pFormFillEnv.Get();
  }
  void AddDelayData(std::unique_ptr<CJS_DelayData> pData);
  void DoFieldDelay(const WideString& sFieldName, int nControlIndex);

  JS_STATIC_PROP(ADBE, ADBE, CJS_Document)
  JS_STATIC_PROP(author, author, CJS_Document)
  JS_STATIC_PROP(baseURL, base_URL, CJS_Document)
  JS_STATIC_PROP(bookmarkRoot, bookmark_root, CJS_Document)
  JS_STATIC_PROP(calculate, calculate, CJS_Document)
  JS_STATIC_PROP(Collab, collab, CJS_Document)
  JS_STATIC_PROP(creationDate, creation_date, CJS_Document)
  JS_STATIC_PROP(creator, creator, CJS_Document)
  JS_STATIC_PROP(delay, delay, CJS_Document)
  JS_STATIC_PROP(dirty, dirty, CJS_Document)
  JS_STATIC_PROP(documentFileName, document_file_name, CJS_Document)
  JS_STATIC_PROP(external, external, CJS_Document)
  JS_STATIC_PROP(filesize, filesize, CJS_Document)
  JS_STATIC_PROP(icons, icons, CJS_Document)
  JS_STATIC_PROP(info, info, CJS_Document)
  JS_STATIC_PROP(keywords, keywords, CJS_Document)
  JS_STATIC_PROP(layout, layout, CJS_Document)
  JS_STATIC_PROP(media, media, CJS_Document)
  JS_STATIC_PROP(modDate, mod_date, CJS_Document)
  JS_STATIC_PROP(mouseX, mouse_x, CJS_Document)
  JS_STATIC_PROP(mouseY, mouse_y, CJS_Document)
  JS_STATIC_PROP(numFields, num_fields, CJS_Document)
  JS_STATIC_PROP(numPages, num_pages, CJS_Document)
  JS_STATIC_PROP(pageNum, page_num, CJS_Document)
  JS_STATIC_PROP(pageWindowRect, page_window_rect, CJS_Document)
  JS_STATIC_PROP(path, path, CJS_Document)
  JS_STATIC_PROP(producer, producer, CJS_Document)
  JS_STATIC_PROP(subject, subject, CJS_Document)
  JS_STATIC_PROP(title, title, CJS_Document)
  JS_STATIC_PROP(URL, URL, CJS_Document)
  JS_STATIC_PROP(zoom, zoom, CJS_Document)
  JS_STATIC_PROP(zoomType, zoom_type, CJS_Document)

  JS_STATIC_METHOD(addAnnot, CJS_Document)
  JS_STATIC_METHOD(addField, CJS_Document)
  JS_STATIC_METHOD(addLink, CJS_Document)
  JS_STATIC_METHOD(addIcon, CJS_Document)
  JS_STATIC_METHOD(calculateNow, CJS_Document)
  JS_STATIC_METHOD(closeDoc, CJS_Document)
  JS_STATIC_METHOD(createDataObject, CJS_Document)
  JS_STATIC_METHOD(deletePages, CJS_Document)
  JS_STATIC_METHOD(exportAsText, CJS_Document)
  JS_STATIC_METHOD(exportAsFDF, CJS_Document)
  JS_STATIC_METHOD(exportAsXFDF, CJS_Document)
  JS_STATIC_METHOD(extractPages, CJS_Document)
  JS_STATIC_METHOD(getAnnot, CJS_Document)
  JS_STATIC_METHOD(getAnnots, CJS_Document)
  JS_STATIC_METHOD(getAnnot3D, CJS_Document)
  JS_STATIC_METHOD(getAnnots3D, CJS_Document)
  JS_STATIC_METHOD(getField, CJS_Document)
  JS_STATIC_METHOD(getIcon, CJS_Document)
  JS_STATIC_METHOD(getLinks, CJS_Document)
  JS_STATIC_METHOD(getNthFieldName, CJS_Document)
  JS_STATIC_METHOD(getOCGs, CJS_Document)
  JS_STATIC_METHOD(getPageBox, CJS_Document)
  JS_STATIC_METHOD(getPageNthWord, CJS_Document)
  JS_STATIC_METHOD(getPageNthWordQuads, CJS_Document)
  JS_STATIC_METHOD(getPageNumWords, CJS_Document)
  JS_STATIC_METHOD(getPrintParams, CJS_Document)
  JS_STATIC_METHOD(getURL, CJS_Document)
  JS_STATIC_METHOD(gotoNamedDest, CJS_Document)
  JS_STATIC_METHOD(importAnFDF, CJS_Document)
  JS_STATIC_METHOD(importAnXFDF, CJS_Document)
  JS_STATIC_METHOD(importTextData, CJS_Document)
  JS_STATIC_METHOD(insertPages, CJS_Document)
  JS_STATIC_METHOD(mailDoc, CJS_Document)
  JS_STATIC_METHOD(mailForm, CJS_Document)
  JS_STATIC_METHOD(print, CJS_Document)
  JS_STATIC_METHOD(removeField, CJS_Document)
  JS_STATIC_METHOD(replacePages, CJS_Document)
  JS_STATIC_METHOD(removeIcon, CJS_Document)
  JS_STATIC_METHOD(resetForm, CJS_Document)
  JS_STATIC_METHOD(saveAs, CJS_Document)
  JS_STATIC_METHOD(submitForm, CJS_Document)
  JS_STATIC_METHOD(syncAnnotScan, CJS_Document)

 private:
  static uint32_t ObjDefnID;
  static const char kName[];
  static const JSPropertySpec PropertySpecs[];
  static const JSMethodSpec MethodSpecs[];

  CJS_Result get_ADBE(CJS_Runtime* pRuntime);
  CJS_Result set_ADBE(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_author(CJS_Runtime* pRuntime);
  CJS_Result set_author(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_base_URL(CJS_Runtime* pRuntime);
  CJS_Result set_base_URL(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_bookmark_root(CJS_Runtime* pRuntime);
  CJS_Result set_bookmark_root(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_calculate(CJS_Runtime* pRuntime);
  CJS_Result set_calculate(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_collab(CJS_Runtime* pRuntime);
  CJS_Result set_collab(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_creation_date(CJS_Runtime* pRuntime);
  CJS_Result set_creation_date(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_creator(CJS_Runtime* pRuntime);
  CJS_Result set_creator(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_delay(CJS_Runtime* pRuntime);
  CJS_Result set_delay(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_dirty(CJS_Runtime* pRuntime);
  CJS_Result set_dirty(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_document_file_name(CJS_Runtime* pRuntime);
  CJS_Result set_document_file_name(CJS_Runtime* pRuntime,
                                    v8::Local<v8::Value> vp);

  CJS_Result get_external(CJS_Runtime* pRuntime);
  CJS_Result set_external(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_filesize(CJS_Runtime* pRuntime);
  CJS_Result set_filesize(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_icons(CJS_Runtime* pRuntime);
  CJS_Result set_icons(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_info(CJS_Runtime* pRuntime);
  CJS_Result set_info(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_keywords(CJS_Runtime* pRuntime);
  CJS_Result set_keywords(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_layout(CJS_Runtime* pRuntime);
  CJS_Result set_layout(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_media(CJS_Runtime* pRuntime);
  CJS_Result set_media(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_mod_date(CJS_Runtime* pRuntime);
  CJS_Result set_mod_date(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_mouse_x(CJS_Runtime* pRuntime);
  CJS_Result set_mouse_x(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_mouse_y(CJS_Runtime* pRuntime);
  CJS_Result set_mouse_y(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_num_fields(CJS_Runtime* pRuntime);
  CJS_Result set_num_fields(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_num_pages(CJS_Runtime* pRuntime);
  CJS_Result set_num_pages(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_page_num(CJS_Runtime* pRuntime);
  CJS_Result set_page_num(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_page_window_rect(CJS_Runtime* pRuntime);
  CJS_Result set_page_window_rect(CJS_Runtime* pRuntime,
                                  v8::Local<v8::Value> vp);

  CJS_Result get_path(CJS_Runtime* pRuntime);
  CJS_Result set_path(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_producer(CJS_Runtime* pRuntime);
  CJS_Result set_producer(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_subject(CJS_Runtime* pRuntime);
  CJS_Result set_subject(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_title(CJS_Runtime* pRuntime);
  CJS_Result set_title(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_zoom(CJS_Runtime* pRuntime);
  CJS_Result set_zoom(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_zoom_type(CJS_Runtime* pRuntime);
  CJS_Result set_zoom_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result get_URL(CJS_Runtime* pRuntime);
  CJS_Result set_URL(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);

  CJS_Result addAnnot(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result addField(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result addLink(CJS_Runtime* pRuntime,
                     const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result addIcon(CJS_Runtime* pRuntime,
                     const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result calculateNow(CJS_Runtime* pRuntime,
                          const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result closeDoc(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result createDataObject(CJS_Runtime* pRuntime,
                              const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result deletePages(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result exportAsText(CJS_Runtime* pRuntime,
                          const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result exportAsFDF(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result exportAsXFDF(CJS_Runtime* pRuntime,
                          const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result extractPages(CJS_Runtime* pRuntime,
                          const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getAnnot(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getAnnots(CJS_Runtime* pRuntime,
                       const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getAnnot3D(CJS_Runtime* pRuntime,
                        const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getAnnots3D(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getField(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getIcon(CJS_Runtime* pRuntime,
                     const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getLinks(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getNthFieldName(CJS_Runtime* pRuntime,
                             const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getOCGs(CJS_Runtime* pRuntime,
                     const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getPageBox(CJS_Runtime* pRuntime,
                        const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getPageNthWord(CJS_Runtime* pRuntime,
                            const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getPageNthWordQuads(
      CJS_Runtime* pRuntime,
      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getPageNumWords(CJS_Runtime* pRuntime,
                             const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getPrintParams(CJS_Runtime* pRuntime,
                            const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result getURL(CJS_Runtime* pRuntime,
                    const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result gotoNamedDest(CJS_Runtime* pRuntime,
                           const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result importAnFDF(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result importAnXFDF(CJS_Runtime* pRuntime,
                          const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result importTextData(CJS_Runtime* pRuntime,
                            const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result insertPages(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result mailForm(CJS_Runtime* pRuntime,
                      const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result print(CJS_Runtime* pRuntime,
                   const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result removeField(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result replacePages(CJS_Runtime* pRuntime,
                          const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result resetForm(CJS_Runtime* pRuntime,
                       const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result saveAs(CJS_Runtime* pRuntime,
                    const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result submitForm(CJS_Runtime* pRuntime,
                        const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result syncAnnotScan(CJS_Runtime* pRuntime,
                           const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result mailDoc(CJS_Runtime* pRuntime,
                     const std::vector<v8::Local<v8::Value>>& params);
  CJS_Result removeIcon(CJS_Runtime* pRuntime,
                        const std::vector<v8::Local<v8::Value>>& params);

  CJS_Result getPropertyInternal(CJS_Runtime* pRuntime,
                                 const ByteString& propName);
  CJS_Result setPropertyInternal(CJS_Runtime* pRuntime,
                                 v8::Local<v8::Value> vp,
                                 const ByteString& propName);

  CPDF_InteractiveForm* GetCoreInteractiveForm();
  CPDFSDK_InteractiveForm* GetSDKInteractiveForm();

  WideString m_cwBaseURL;
  ObservedPtr<CPDFSDK_FormFillEnvironment> m_pFormFillEnv;
  std::list<std::unique_ptr<CJS_DelayData>> m_DelayData;
  // Needs to be a std::list for iterator stability.
  std::list<WideString> m_IconNames;
  bool m_bDelay = false;
};

#endif  // FXJS_CJS_DOCUMENT_H_
