// 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_DATAMATRIX_BC_SYMBOLINFO_H_
#define XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_

#include "core/fxcrt/include/fx_string.h"
#include "core/fxcrt/include/fx_system.h"
#include "xfa/fxbarcode/datamatrix/BC_SymbolShapeHint.h"

class CBC_Dimension;

class CBC_SymbolInfo : public CBC_SymbolShapeHint {
 public:
  CBC_SymbolInfo(FX_BOOL rectangular,
                 int32_t dataCapacity,
                 int32_t errorCodewords,
                 int32_t matrixWidth,
                 int32_t matrixHeight,
                 int32_t dataRegions);
  virtual ~CBC_SymbolInfo();
  static void Initialize();
  static void Finalize();
  static void overrideSymbolSet(CBC_SymbolInfo* override);
  static CBC_SymbolInfo* lookup(int32_t dataCodewords, int32_t& e);
  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
                                SymbolShapeHint shape,
                                int32_t& e);
  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
                                FX_BOOL allowRectangular,
                                FX_BOOL fail,
                                int32_t& e);
  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
                                SymbolShapeHint shape,
                                FX_BOOL fail,
                                int32_t& e);
  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
                                SymbolShapeHint shape,
                                CBC_Dimension* minSize,
                                CBC_Dimension* maxSize,
                                FX_BOOL fail,
                                int32_t& e);
  int32_t getHorizontalDataRegions(int32_t& e);
  int32_t getVerticalDataRegions(int32_t& e);
  int32_t getSymbolDataWidth(int32_t& e);
  int32_t getSymbolDataHeight(int32_t& e);
  int32_t getSymbolWidth(int32_t& e);
  int32_t getSymbolHeight(int32_t& e);
  int32_t getCodewordCount();
  int32_t getInterleavedBlockCount();
  int32_t getDataLengthForInterleavedBlock(int32_t index);
  int32_t getErrorLengthForInterleavedBlock(int32_t index);

 public:
  int32_t m_dataCapacity;
  int32_t m_errorCodewords;
  int32_t m_matrixWidth;
  int32_t m_matrixHeight;
  int32_t m_rsBlockData;
  int32_t m_rsBlockError;
  static CBC_SymbolInfo* m_PROD_SYMBOLS[30];

 private:
  static CBC_SymbolInfo* m_symbols[30];
  FX_BOOL m_rectangular;
  int32_t m_dataRegions;

 private:
  CBC_SymbolInfo(FX_BOOL rectangular,
                 int32_t dataCapacity,
                 int32_t errorCodewords,
                 int32_t matrixWidth,
                 int32_t matrixHeight,
                 int32_t dataRegions,
                 int32_t rsBlockData,
                 int32_t rsBlockError);
};

#endif  // XFA_FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
