// 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 "fxbarcode/datamatrix/BC_SymbolShapeHint.h"

class CBC_SymbolInfo;
class CBC_Dimension;

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

  void setSymbolShape(SymbolShapeHint shape);
  void setSizeConstraints(CBC_Dimension* minSize, CBC_Dimension* maxSize);
  CFX_WideString getMessage();
  void setSkipAtEnd(int32_t count);
  wchar_t getCurrentChar();
  wchar_t getCurrent();
  void writeCodewords(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;
  CBC_Dimension* m_minSize;
  CBC_Dimension* m_maxSize;
  int32_t m_skipAtEnd;
};

#endif  // FXBARCODE_DATAMATRIX_BC_ENCODERCONTEXT_H_
