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

#include "core/include/fxge/fx_dib.h"

class IPDF_VariableText;
struct CPVT_Line;
struct CPVT_Section;
struct CPVT_Word;
struct CPVT_WordPlace;
struct CPVT_WordRange;

struct CPVT_WordPlace {
  CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1) {}

  CPVT_WordPlace(int32_t other_nSecIndex,
                 int32_t other_nLineIndex,
                 int32_t other_nWordIndex) {
    nSecIndex = other_nSecIndex;
    nLineIndex = other_nLineIndex;
    nWordIndex = other_nWordIndex;
  }

  void Default() { nSecIndex = nLineIndex = nWordIndex = -1; }

  bool operator==(const CPVT_WordPlace& wp) const {
    return wp.nSecIndex == nSecIndex && wp.nLineIndex == nLineIndex &&
           wp.nWordIndex == nWordIndex;
  }

  FX_BOOL operator!=(const CPVT_WordPlace& wp) const { return !(*this == wp); }

  inline int32_t WordCmp(const CPVT_WordPlace& wp) const {
    if (nSecIndex > wp.nSecIndex)
      return 1;
    if (nSecIndex < wp.nSecIndex)
      return -1;
    if (nLineIndex > wp.nLineIndex)
      return 1;
    if (nLineIndex < wp.nLineIndex)
      return -1;
    if (nWordIndex > wp.nWordIndex)
      return 1;
    if (nWordIndex < wp.nWordIndex)
      return -1;
    return 0;
  }

  inline int32_t LineCmp(const CPVT_WordPlace& wp) const {
    if (nSecIndex > wp.nSecIndex)
      return 1;
    if (nSecIndex < wp.nSecIndex)
      return -1;
    if (nLineIndex > wp.nLineIndex)
      return 1;
    if (nLineIndex < wp.nLineIndex)
      return -1;
    return 0;
  }

  inline int32_t SecCmp(const CPVT_WordPlace& wp) const {
    if (nSecIndex > wp.nSecIndex)
      return 1;
    if (nSecIndex < wp.nSecIndex)
      return -1;
    return 0;
  }

  int32_t nSecIndex;
  int32_t nLineIndex;
  int32_t nWordIndex;
};
struct CPVT_WordRange {
  CPVT_WordRange() {}

  CPVT_WordRange(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
    Set(begin, end);
  }

  void Default() {
    BeginPos.Default();
    EndPos.Default();
  }

  void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
    BeginPos = begin;
    EndPos = end;
    SwapWordPlace();
  }

  void SetBeginPos(const CPVT_WordPlace& begin) {
    BeginPos = begin;
    SwapWordPlace();
  }

  void SetEndPos(const CPVT_WordPlace& end) {
    EndPos = end;
    SwapWordPlace();
  }

  FX_BOOL IsExist() const { return BeginPos != EndPos; }

  FX_BOOL operator!=(const CPVT_WordRange& wr) const {
    return wr.BeginPos != BeginPos || wr.EndPos != EndPos;
  }

  void SwapWordPlace() {
    if (BeginPos.WordCmp(EndPos) > 0) {
      CPVT_WordPlace place = EndPos;
      EndPos = BeginPos;
      BeginPos = place;
    }
  }

  CPVT_WordPlace BeginPos;
  CPVT_WordPlace EndPos;
};
struct CPVT_SecProps {
  CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0) {}

  CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, int32_t alignment)
      : fLineLeading(lineLeading),
        fLineIndent(lineIndent),
        nAlignment(alignment) {}

  CPVT_SecProps(const CPVT_SecProps& other)
      : fLineLeading(other.fLineLeading),
        fLineIndent(other.fLineIndent),
        nAlignment(other.nAlignment) {}

  FX_FLOAT fLineLeading;
  FX_FLOAT fLineIndent;
  int32_t nAlignment;
};
struct CPVT_WordProps {
  CPVT_WordProps()
      : nFontIndex(-1),
        fFontSize(0.0f),
        dwWordColor(0),
        nScriptType(0),
        nWordStyle(0),
        fCharSpace(0.0f),
        nHorzScale(0) {}

  CPVT_WordProps(int32_t fontIndex,
                 FX_FLOAT fontSize,
                 FX_COLORREF wordColor = 0,
                 int32_t scriptType = 0,
                 int32_t wordStyle = 0,
                 FX_FLOAT charSpace = 0,
                 int32_t horzScale = 100)
      : nFontIndex(fontIndex),
        fFontSize(fontSize),
        dwWordColor(wordColor),
        nScriptType(scriptType),
        nWordStyle(wordStyle),
        fCharSpace(charSpace),
        nHorzScale(horzScale) {}

  CPVT_WordProps(const CPVT_WordProps& other)
      : nFontIndex(other.nFontIndex),
        fFontSize(other.fFontSize),
        dwWordColor(other.dwWordColor),
        nScriptType(other.nScriptType),
        nWordStyle(other.nWordStyle),
        fCharSpace(other.fCharSpace),
        nHorzScale(other.nHorzScale) {}

  int32_t nFontIndex;
  FX_FLOAT fFontSize;
  FX_COLORREF dwWordColor;
  int32_t nScriptType;
  int32_t nWordStyle;
  FX_FLOAT fCharSpace;
  int32_t nHorzScale;
};
struct CPVT_Word {
  CPVT_Word()
      : Word(0),
        nCharset(0),
        ptWord(0, 0),
        fAscent(0.0f),
        fDescent(0.0f),
        fWidth(0.0f),
        fFontSize(0),
        WordProps() {}

  uint16_t Word;
  int32_t nCharset;
  CPVT_WordPlace WordPlace;
  CFX_FloatPoint ptWord;
  FX_FLOAT fAscent;
  FX_FLOAT fDescent;
  FX_FLOAT fWidth;
  int32_t nFontIndex;
  FX_FLOAT fFontSize;
  CPVT_WordProps WordProps;
};
struct CPVT_Line {
  CPVT_Line()
      : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f) {}

  CPVT_WordPlace lineplace;
  CPVT_WordPlace lineEnd;
  CFX_FloatPoint ptLine;
  FX_FLOAT fLineWidth;
  FX_FLOAT fLineAscent;
  FX_FLOAT fLineDescent;
};
struct CPVT_Section {
  CPVT_WordPlace secplace;
  CFX_FloatRect rcSection;
  CPVT_SecProps SecProps;
  CPVT_WordProps WordProps;
};

class IPDF_VariableText {
 public:
  class Provider {
   public:
    virtual ~Provider() {}

    virtual int32_t GetCharWidth(int32_t nFontIndex,
                                 uint16_t word,
                                 int32_t nWordStyle) = 0;
    virtual int32_t GetTypeAscent(int32_t nFontIndex) = 0;
    virtual int32_t GetTypeDescent(int32_t nFontIndex) = 0;
    virtual int32_t GetWordFontIndex(uint16_t word,
                                     int32_t charset,
                                     int32_t nFontIndex) = 0;
    virtual int32_t GetDefaultFontIndex() = 0;
    virtual FX_BOOL IsLatinWord(uint16_t word) = 0;
  };

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

    virtual FX_BOOL NextWord() = 0;
    virtual FX_BOOL PrevWord() = 0;
    virtual FX_BOOL NextLine() = 0;
    virtual FX_BOOL PrevLine() = 0;
    virtual FX_BOOL NextSection() = 0;
    virtual FX_BOOL PrevSection() = 0;
    virtual FX_BOOL GetWord(CPVT_Word& word) const = 0;
    virtual FX_BOOL SetWord(const CPVT_Word& word) = 0;
    virtual FX_BOOL GetLine(CPVT_Line& line) const = 0;
    virtual FX_BOOL GetSection(CPVT_Section& section) const = 0;
    virtual FX_BOOL SetSection(const CPVT_Section& section) = 0;
    virtual void SetAt(int32_t nWordIndex) = 0;
    virtual void SetAt(const CPVT_WordPlace& place) = 0;
    virtual const CPVT_WordPlace& GetAt() const = 0;
  };

  static IPDF_VariableText* NewVariableText();
  static void DelVariableText(IPDF_VariableText* pVT);

  virtual void Initialize() = 0;

  virtual Provider* SetProvider(Provider* pProvider) = 0;
  virtual Iterator* GetIterator() = 0;

  virtual void SetPlateRect(const CFX_FloatRect& rect) = 0;
  virtual void SetAlignment(int32_t nFormat = 0) = 0;
  virtual void SetPasswordChar(uint16_t wSubWord = '*') = 0;
  virtual void SetLimitChar(int32_t nLimitChar = 0) = 0;
  virtual void SetCharArray(int32_t nCharArray = 0) = 0;
  virtual void SetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;
  virtual void SetHorzScale(int32_t nHorzScale = 100) = 0;
  virtual void SetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;
  virtual void SetAutoReturn(FX_BOOL bAuto = TRUE) = 0;
  virtual void SetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;
  virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
  virtual void SetLineLeading(FX_FLOAT fLineLeading) = 0;
  virtual void SetRichText(FX_BOOL bRichText) = 0;

  virtual FX_BOOL IsValid() const = 0;
  virtual FX_BOOL IsRichText() const = 0;
  virtual FX_BOOL IsMultiLine() const = 0;

  virtual void RearrangeAll() = 0;
  virtual void RearrangePart(const CPVT_WordRange& PlaceRange) = 0;

  virtual void ResetAll() = 0;

  virtual void SetText(const FX_WCHAR* text,
                       int32_t charset = 1,
                       const CPVT_SecProps* pSecProps = NULL,
                       const CPVT_WordProps* pWordProps = NULL) = 0;
  virtual CPVT_WordPlace InsertWord(
      const CPVT_WordPlace& place,
      uint16_t word,
      int32_t charset = 1,
      const CPVT_WordProps* pWordProps = NULL) = 0;
  virtual CPVT_WordPlace InsertSection(
      const CPVT_WordPlace& place,
      const CPVT_SecProps* pSecProps = NULL,
      const CPVT_WordProps* pWordProps = NULL) = 0;
  virtual CPVT_WordPlace InsertText(
      const CPVT_WordPlace& place,
      const FX_WCHAR* text,
      int32_t charset = 1,
      const CPVT_SecProps* pSecProps = NULL,
      const CPVT_WordProps* pWordProps = NULL) = 0;

  virtual CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange) = 0;
  virtual CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place) = 0;
  virtual CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place) = 0;

  virtual const CFX_FloatRect& GetPlateRect() const = 0;
  virtual CFX_FloatRect GetContentRect() const = 0;
  virtual int32_t GetTotalWords() const = 0;
  virtual FX_FLOAT GetFontSize() const = 0;
  virtual int32_t GetAlignment() const = 0;
  virtual uint16_t GetPasswordChar() const = 0;
  virtual int32_t GetCharArray() const = 0;
  virtual int32_t GetLimitChar() const = 0;
  virtual int32_t GetHorzScale() const = 0;
  virtual FX_FLOAT GetCharSpace() const = 0;
  virtual CPVT_WordPlace GetBeginWordPlace() const = 0;
  virtual CPVT_WordPlace GetEndWordPlace() const = 0;
  virtual CPVT_WordPlace GetPrevWordPlace(
      const CPVT_WordPlace& place) const = 0;
  virtual CPVT_WordPlace GetNextWordPlace(
      const CPVT_WordPlace& place) const = 0;

  virtual CPVT_WordPlace SearchWordPlace(const CFX_FloatPoint& point) const = 0;
  virtual CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place,
                                        const CFX_FloatPoint& point) const = 0;
  virtual CPVT_WordPlace GetDownWordPlace(
      const CPVT_WordPlace& place,
      const CFX_FloatPoint& point) const = 0;
  virtual CPVT_WordPlace GetLineBeginPlace(
      const CPVT_WordPlace& place) const = 0;
  virtual CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const = 0;
  virtual CPVT_WordPlace GetSectionBeginPlace(
      const CPVT_WordPlace& place) const = 0;
  virtual CPVT_WordPlace GetSectionEndPlace(
      const CPVT_WordPlace& place) const = 0;

  virtual void UpdateWordPlace(CPVT_WordPlace& place) const = 0;
  virtual CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place,
                                          FX_BOOL bPrevOrNext) const = 0;

  virtual int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const = 0;
  virtual CPVT_WordPlace WordIndexToWordPlace(int32_t index) const = 0;

 protected:
  ~IPDF_VariableText() {}
};

#endif  // CORE_INCLUDE_FPDFDOC_FPDF_VT_H_
