// 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_
