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

#include "core/fxcrt/cfx_widestring.h"
#include "fxbarcode/datamatrix/BC_SymbolShapeHint.h"

class CBC_SymbolInfo;

class CBC_EncoderContext : public CBC_SymbolShapeHint {
 public:
  CBC_EncoderContext(const CFX_WideString& msg,
                     const CFX_WideString& ecLevel,
                     int32_t& e);
  ~CBC_EncoderContext() override;

  void setSymbolShape(SymbolShapeHint shape);
  void setSkipAtEnd(int32_t count);
  wchar_t getCurrentChar();
  wchar_t getCurrent();
  void writeCodewords(const CFX_WideString& codewords);
  void writeCodeword(wchar_t codeword);
  int32_t getCodewordCount();
  void signalEncoderChange(int32_t encoding);
  void resetEncoderSignal();
  bool hasMoreCharacters();
  int32_t getRemainingCharacters();
  void updateSymbolInfo(int32_t& e);
  void updateSymbolInfo(int32_t len, int32_t& e);
  void resetSymbolInfo();

 public:
  CFX_WideString m_msg;
  CFX_WideString m_codewords;
  int32_t m_pos;
  int32_t m_newEncoding;
  CBC_SymbolInfo* m_symbolInfo;

 private:
  int32_t getTotalMessageCharCount();

 private:
  SymbolShapeHint m_shape;
  int32_t m_skipAtEnd;
};

#endif  // FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
