// 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;
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; }

  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_Provider {
 public:
  virtual ~IPDF_VariableText_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 FX_BOOL IsLatinWord(uint16_t 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 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 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,
      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 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 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_
