// 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_SYMBOLINFO_H_
#define FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_

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

class CBC_SymbolInfo : public CBC_SymbolShapeHint {
 public:
  CBC_SymbolInfo(int32_t dataCapacity,
                 int32_t errorCodewords,
                 int32_t matrixWidth,
                 int32_t matrixHeight,
                 int32_t dataRegions);
  ~CBC_SymbolInfo() override;

  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,
                                bool allowRectangular,
                                bool fail,
                                int32_t& e);
  static CBC_SymbolInfo* lookup(int32_t dataCodewords,
                                SymbolShapeHint shape,
                                bool fail,
                                int32_t& e);

  int32_t getSymbolDataWidth() const;
  int32_t getSymbolDataHeight() const;
  int32_t getSymbolWidth() const;
  int32_t getSymbolHeight() const;
  int32_t getCodewordCount() const;
  int32_t getInterleavedBlockCount() const;
  int32_t getDataLengthForInterleavedBlock(int32_t index) const;
  int32_t getErrorLengthForInterleavedBlock(int32_t index) const;

  int32_t dataCapacity() const { return m_dataCapacity; }
  int32_t errorCodewords() const { return m_errorCodewords; }
  int32_t matrixWidth() const { return m_matrixWidth; }
  int32_t matrixHeight() const { return m_matrixHeight; }

 protected:
  CBC_SymbolInfo(int32_t dataCapacity,
                 int32_t errorCodewords,
                 int32_t matrixWidth,
                 int32_t matrixHeight,
                 int32_t dataRegions,
                 int32_t rsBlockData,
                 int32_t rsBlockError);

 private:
  int32_t getHorizontalDataRegions() const;
  int32_t getVerticalDataRegions() const;

  const bool m_rectangular;
  const int32_t m_dataCapacity;
  const int32_t m_errorCodewords;
  const int32_t m_matrixWidth;
  const int32_t m_matrixHeight;
  const int32_t m_dataRegions;
  const int32_t m_rsBlockData;
  const int32_t m_rsBlockError;
};

#endif  // FXBARCODE_DATAMATRIX_BC_SYMBOLINFO_H_
