// 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_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
#define XFA_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_

#include "core/fxcrt/include/fx_basic.h"
#include "core/fxcrt/include/fx_string.h"

class CBC_CommonDecoderResult;
class CBC_PDF417ResultMetadata;

class CBC_DecodedBitStreamPaser {
 public:
  CBC_DecodedBitStreamPaser();
  virtual ~CBC_DecodedBitStreamPaser();
  static void Initialize();
  static void Finalize();
  static CBC_CommonDecoderResult* decode(CFX_Int32Array& codewords,
                                         CFX_ByteString ecLevel,
                                         int32_t& e);

 private:
  enum Mode { ALPHA, LOWER, MIXED, PUNCT, ALPHA_SHIFT, PUNCT_SHIFT };
  static int32_t MAX_NUMERIC_CODEWORDS;
  static int32_t PL;
  static int32_t LL;
  static int32_t AS;
  static int32_t ML;
  static int32_t AL;
  static int32_t PS;
  static int32_t PAL;
  static FX_CHAR PUNCT_CHARS[29];
  static FX_CHAR MIXED_CHARS[30];
  static int32_t NUMBER_OF_SEQUENCE_CODEWORDS;
  static int32_t decodeMacroBlock(CFX_Int32Array& codewords,
                                  int32_t codeIndex,
                                  CBC_PDF417ResultMetadata* resultMetadata,
                                  int32_t& e);
  static int32_t textCompaction(CFX_Int32Array& codewords,
                                int32_t codeIndex,
                                CFX_ByteString& result);
  static void decodeTextCompaction(CFX_Int32Array& textCompactionData,
                                   CFX_Int32Array& byteCompactionData,
                                   int32_t length,
                                   CFX_ByteString& result);
  static int32_t byteCompaction(int32_t mode,
                                CFX_Int32Array& codewords,
                                int32_t codeIndex,
                                CFX_ByteString& result);
  static int32_t numericCompaction(CFX_Int32Array& codewords,
                                   int32_t codeIndex,
                                   CFX_ByteString& result,
                                   int32_t& e);
  static CFX_ByteString decodeBase900toBase10(CFX_Int32Array& codewords,
                                              int32_t count,
                                              int32_t& e);
};

#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DECODEDBITSTREAMPARSER_H_
