// 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_QRCODE_BC_QRCODERVERSION_H_
#define XFA_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_

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

class CBC_CommonBitMatrix;
class CBC_QRCoderECBlocks;
class CBC_QRCoderErrorCorrectionLevel;

class CBC_QRCoderVersion {
 public:
  virtual ~CBC_QRCoderVersion();
  static void Initialize();
  static void Finalize();

  int32_t GetVersionNumber();
  int32_t GetTotalCodeWords();
  int32_t GetDimensionForVersion();
  CBC_CommonBitMatrix* BuildFunctionPattern(int32_t& e);
  CFX_Int32Array* GetAlignmentPatternCenters();
  CBC_QRCoderECBlocks* GetECBlocksForLevel(
      CBC_QRCoderErrorCorrectionLevel* ecLevel);
  static CBC_QRCoderVersion* GetVersionForNumber(int32_t versionNumber,
                                                 int32_t& e);
  static CBC_QRCoderVersion* GetProvisionalVersionForDimension(
      int32_t dimension,
      int32_t& e);
  static CBC_QRCoderVersion* DecodeVersionInformation(int32_t versionBits,
                                                      int32_t& e);
  static void Destroy();

 private:
  CBC_QRCoderVersion();
  CBC_QRCoderVersion(int32_t versionNumber,
                     CBC_QRCoderECBlocks* ecBlocks1,
                     CBC_QRCoderECBlocks* ecBlocks2,
                     CBC_QRCoderECBlocks* ecBlocks3,
                     CBC_QRCoderECBlocks* ecBlocks4);

  static const int32_t VERSION_DECODE_INFO[34];
  static CFX_PtrArray* VERSION;

  int32_t m_versionNumber;
  int32_t m_totalCodeWords;
  CFX_Int32Array m_alignmentPatternCenters;
  CFX_ArrayTemplate<CBC_QRCoderECBlocks*> m_ecBlocksArray;
};

#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODERVERSION_H_
