// 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_FDE_CFDE_TXTEDTBUF_H_
#define XFA_FDE_CFDE_TXTEDTBUF_H_

#include <memory>
#include <tuple>
#include <vector>

#include "core/fxcrt/fx_basic.h"
#include "core/fxcrt/fx_system.h"
#include "core/fxcrt/ifx_chariter.h"

class CFDE_TxtEdtBuf {
 public:
  class Iterator : public IFX_CharIter {
   public:
    Iterator(CFDE_TxtEdtBuf* pBuf, wchar_t wcAlias);
    ~Iterator() override;

    bool Next(bool bPrev = false) override;
    wchar_t GetChar() const override;

    void SetAt(int32_t nIndex) override;
    int32_t GetAt() const override;

    bool IsEOF(bool bTail = true) const override;
    std::unique_ptr<IFX_CharIter> Clone() const override;

   private:
    CFDE_TxtEdtBuf* m_pBuf;
    int32_t m_nCurChunk;
    int32_t m_nCurIndex;
    int32_t m_nIndex;
    wchar_t m_Alias;
  };

  CFDE_TxtEdtBuf();
  ~CFDE_TxtEdtBuf();

  int32_t GetChunkSize() const;
  int32_t GetTextLength() const;

  void SetText(const CFX_WideString& wsText);
  CFX_WideString GetText() const;

  wchar_t GetCharByIndex(int32_t nIndex) const;
  CFX_WideString GetRange(int32_t nBegin, int32_t nCount) const;

  void Insert(int32_t nPos, const wchar_t* lpText, int32_t nLength);
  void Delete(int32_t nIndex, int32_t nLength);
  void Clear(bool bRelease);

 private:
  friend class Iterator;
  friend class CFDE_TxtEdtBufTest;

  class ChunkHeader {
   public:
    ChunkHeader();
    ~ChunkHeader();

    int32_t nUsed;
    std::unique_ptr<wchar_t, FxFreeDeleter> wChars;
  };

  void SetChunkSizeForTesting(size_t size);
  std::tuple<int32_t, int32_t> Index2CP(int32_t nIndex) const;
  std::unique_ptr<ChunkHeader> NewChunk();

  size_t m_chunkSize;
  int32_t m_nTotal;
  std::vector<std::unique_ptr<ChunkHeader>> m_chunks;
};

#endif  // XFA_FDE_CFDE_TXTEDTBUF_H_
