// 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_PDF417_BC_PDF417DETECTIONRESULT_H_
#define XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_

class CBC_BarcodeMetadata;
class CBC_BoundingBox;
class CBC_Codeword;
class CBC_DetectionResultColumn;
class CBC_DetectionResult {
 public:
  CBC_DetectionResult(CBC_BarcodeMetadata* barcodeMetadata,
                      CBC_BoundingBox* boundingBox);
  virtual ~CBC_DetectionResult();

  CFX_ArrayTemplate<CBC_DetectionResultColumn*>& getDetectionResultColumns();
  void setBoundingBox(CBC_BoundingBox* boundingBox);
  CBC_BoundingBox* getBoundingBox();
  void setDetectionResultColumn(
      int32_t barcodeColumn,
      CBC_DetectionResultColumn* detectionResultColumn);
  CBC_DetectionResultColumn* getDetectionResultColumn(int32_t barcodeColumn);
  CFX_ByteString toString();

  int32_t getBarcodeColumnCount();
  int32_t getBarcodeRowCount();
  int32_t getBarcodeECLevel();

 private:
  static int32_t ADJUST_ROW_NUMBER_SKIP;
  CBC_BarcodeMetadata* m_barcodeMetadata;
  CFX_ArrayTemplate<CBC_DetectionResultColumn*> m_detectionResultColumns;
  CBC_BoundingBox* m_boundingBox;
  int32_t m_barcodeColumnCount;

 private:
  void adjustIndicatorColumnRowNumbers(
      CBC_DetectionResultColumn* detectionResultColumn);
  int32_t adjustRowNumbers();
  int32_t adjustRowNumbersByRow();
  int32_t adjustRowNumbersFromBothRI();
  int32_t adjustRowNumbersFromRRI();
  int32_t adjustRowNumbersFromLRI();
  static int32_t adjustRowNumberIfValid(int32_t rowIndicatorRowNumber,
                                        int32_t invalidRowCounts,
                                        CBC_Codeword* codeword);
  void adjustRowNumbers(int32_t barcodeColumn,
                        int32_t codewordsRow,
                        CFX_ArrayTemplate<CBC_Codeword*>* codewords);
  static FX_BOOL adjustRowNumber(CBC_Codeword* codeword,
                                 CBC_Codeword* otherCodeword);
};

#endif  // XFA_FXBARCODE_PDF417_BC_PDF417DETECTIONRESULT_H_
