// 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_HIGHLEVELENCODER_H_
#define FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_

#include <vector>

#include "fxbarcode/datamatrix/BC_SymbolShapeHint.h"

#define ASCII_ENCODATION 0
#define C40_ENCODATION 1
#define TEXT_ENCODATION 2
#define X12_ENCODATION 3
#define EDIFACT_ENCODATION 4
#define BASE256_ENCODATION 5

class CBC_HighLevelEncoder : public CBC_SymbolShapeHint {
 public:
  CBC_HighLevelEncoder();
  ~CBC_HighLevelEncoder() override;

  std::vector<uint8_t>& getBytesForMessage(CFX_WideString msg);
  static CFX_WideString encodeHighLevel(CFX_WideString msg,
                                        CFX_WideString ecLevel,
                                        int32_t& e);
  static CFX_WideString encodeHighLevel(CFX_WideString msg,
                                        CFX_WideString ecLevel,
                                        SymbolShapeHint shape,
                                        CBC_Dimension* minSize,
                                        CBC_Dimension* maxSize,
                                        int32_t& e);
  static int32_t lookAheadTest(CFX_WideString msg,
                               int32_t startpos,
                               int32_t currentMode);
  static bool isDigit(wchar_t ch);
  static bool isExtendedASCII(wchar_t ch);
  static int32_t determineConsecutiveDigitCount(CFX_WideString msg,
                                                int32_t startpos);

 public:
  static wchar_t LATCH_TO_C40;
  static wchar_t LATCH_TO_BASE256;
  static wchar_t UPPER_SHIFT;
  static wchar_t LATCH_TO_ANSIX12;
  static wchar_t LATCH_TO_TEXT;
  static wchar_t LATCH_TO_EDIFACT;
  static wchar_t C40_UNLATCH;
  static wchar_t X12_UNLATCH;

 private:
  static wchar_t PAD;
  static wchar_t MACRO_05;
  static wchar_t MACRO_06;
  static const wchar_t* MACRO_05_HEADER;
  static const wchar_t* MACRO_06_HEADER;
  static const wchar_t MACRO_TRAILER;
  std::vector<uint8_t> m_bytearray;

 private:
  static wchar_t randomize253State(wchar_t ch, int32_t codewordPosition);
  static int32_t findMinimums(std::vector<float>& charCounts,
                              std::vector<int32_t>& intCharCounts,
                              int32_t min,
                              std::vector<uint8_t>& mins);
  static int32_t getMinimumCount(std::vector<uint8_t>& mins);
  static bool isNativeC40(wchar_t ch);
  static bool isNativeText(wchar_t ch);
  static bool isNativeX12(wchar_t ch);
  static bool isX12TermSep(wchar_t ch);
  static bool isNativeEDIFACT(wchar_t ch);
  static bool isSpecialB256(wchar_t ch);
};

#endif  // FXBARCODE_DATAMATRIX_BC_HIGHLEVELENCODER_H_
