// 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 "../fpdfapi/fpdf_parser.h"
#include "../fxge/fx_dib.h"

class IPDF_VariableText;
class IPDF_VariableText_Iterator;
class IPDF_VariableText_Provider;
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; }

  FX_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 wp.nSecIndex != nSecIndex || wp.nLineIndex != nLineIndex ||
           wp.nWordIndex != nWordIndex;
  }

  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() {}

  FX_WORD Word;

  int32_t nCharset;

  CPVT_WordPlace WordPlace;

  CPDF_Point 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;

  CPDF_Point ptLine;

  FX_FLOAT fLineWidth;

  FX_FLOAT fLineAscent;

  FX_FLOAT fLineDescent;
};
struct CPVT_Section {
  CPVT_WordPlace secplace;

  CPDF_Rect rcSection;

  CPVT_SecProps SecProps;

  CPVT_WordProps WordProps;
};
class IPDF_VariableText_Provider {
 public:
  virtual ~IPDF_VariableText_Provider() {}

  virtual int32_t GetCharWidth(int32_t nFontIndex,
                               FX_WORD 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(FX_WORD word,
                                   int32_t charset,
                                   int32_t nFontIndex) = 0;

  virtual FX_BOOL IsLatinWord(FX_WORD word) = 0;

  virtual int32_t GetDefaultFontIndex() = 0;
};
class IPDF_VariableText_Iterator {
 public:
  virtual ~IPDF_VariableText_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;
};
class IPDF_VariableText {
 public:
  static IPDF_VariableText* NewVariableText();

  static void DelVariableText(IPDF_VariableText* pVT);

  virtual IPDF_VariableText_Provider* SetProvider(
      IPDF_VariableText_Provider* pProvider) = 0;

  virtual IPDF_VariableText_Iterator* GetIterator() = 0;

  virtual void SetPlateRect(const CPDF_Rect& rect) = 0;

  virtual void SetAlignment(int32_t nFormat = 0) = 0;

  virtual void SetPasswordChar(FX_WORD 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 void Initialize() = 0;

  virtual FX_BOOL IsValid() const = 0;

  virtual FX_BOOL IsRichText() 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,
      FX_WORD 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 CPDF_Rect& GetPlateRect() const = 0;

  virtual CPDF_Rect GetContentRect() const = 0;

  virtual int32_t GetTotalWords() const = 0;

  virtual FX_FLOAT GetFontSize() const = 0;

  virtual int32_t GetAlignment() const = 0;

  virtual FX_WORD GetPasswordChar() const = 0;

  virtual int32_t GetCharArray() const = 0;

  virtual int32_t GetLimitChar() const = 0;

  virtual FX_BOOL IsMultiLine() 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 CPDF_Point& point) const = 0;

  virtual CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place,
                                        const CPDF_Point& point) const = 0;

  virtual CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place,
                                          const CPDF_Point& 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_
