// Copyright 2014 The PDFium Authors
// 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_QRCODE_BC_QRCODER_H_
#define FXBARCODE_QRCODE_BC_QRCODER_H_

#include <memory>

#include "core/fxcrt/unowned_ptr.h"

class CBC_QRCoderErrorCorrectionLevel;
class CBC_CommonByteMatrix;

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

  CBC_QRCoder();
  ~CBC_QRCoder();

  static bool IsValidMaskPattern(int32_t maskPattern);

  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 GetNumRSBlocks() const;
  std::unique_ptr<CBC_CommonByteMatrix> TakeMatrix();

  bool IsValid() const;

  void SetECLevel(const 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:
  UnownedPtr<const CBC_QRCoderErrorCorrectionLevel> m_ecLevel;
  int32_t m_version = -1;
  int32_t m_matrixWidth = -1;
  int32_t m_maskPattern = -1;
  int32_t m_numTotalBytes = -1;
  int32_t m_numDataBytes = -1;
  int32_t m_numECBytes = -1;
  int32_t m_numRSBlocks = -1;
  std::unique_ptr<CBC_CommonByteMatrix> m_matrix;
};

#endif  // FXBARCODE_QRCODE_BC_QRCODER_H_
