// 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_QRCODER_H_
#define XFA_FXBARCODE_QRCODE_BC_QRCODER_H_

#include <memory>

class CBC_QRCoderErrorCorrectionLevel;
class CBC_QRCoderMode;
class CBC_CommonByteMatrix;

class CBC_QRCoder {
 public:
  static constexpr int32_t kNumMaskPatterns = 8;

  CBC_QRCoder();
  virtual ~CBC_QRCoder();

  static bool IsValidMaskPattern(int32_t maskPattern);

  CBC_QRCoderMode* GetMode() const;
  CBC_QRCoderErrorCorrectionLevel* GetECLevel() const;
  int32_t GetVersion() const;
  int32_t GetMatrixWidth() const;
  int32_t GetMaskPattern() const;
  int32_t GetNumTotalBytes() const;
  int32_t GetNumDataBytes() const;
  int32_t GetNumECBytes() const;
  int32_t GetNumRSBlocks() const;
  CBC_CommonByteMatrix* GetMatrix() const;

  int32_t At(int32_t x, int32_t y, int32_t& e);
  FX_BOOL IsValid();

  void SetMode(CBC_QRCoderMode* value);
  void SetECLevel(CBC_QRCoderErrorCorrectionLevel* ecLevel);
  void SetVersion(int32_t version);
  void SetMatrixWidth(int32_t width);
  void SetMaskPattern(int32_t pattern);
  void SetNumDataBytes(int32_t bytes);
  void SetNumTotalBytes(int32_t value);
  void SetNumECBytes(int32_t value);
  void SetNumRSBlocks(int32_t block);
  void SetMatrix(std::unique_ptr<CBC_CommonByteMatrix> pMatrix);

 private:
  CBC_QRCoderMode* m_mode;
  CBC_QRCoderErrorCorrectionLevel* m_ecLevel;
  int32_t m_version;
  int32_t m_matrixWidth;
  int32_t m_maskPattern;
  int32_t m_numTotalBytes;
  int32_t m_numDataBytes;
  int32_t m_numECBytes;
  int32_t m_numRSBlocks;
  std::unique_ptr<CBC_CommonByteMatrix> m_matrix;
};

#endif  // XFA_FXBARCODE_QRCODE_BC_QRCODER_H_
