// 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
// Original code is licensed as follows:
/*
 * Copyright 2013 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "xfa/fxbarcode/pdf417/BC_PDF417BoundingBox.h"
#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
#include "xfa/fxbarcode/pdf417/BC_PDF417DetectionResultColumn.h"

int32_t CBC_DetectionResultColumn::MAX_NEARBY_DISTANCE = 5;

CBC_DetectionResultColumn::CBC_DetectionResultColumn(
    CBC_BoundingBox* boundingBox)
    : m_boundingBox(boundingBox),
      m_codewords(new CFX_ArrayTemplate<CBC_Codeword*>()) {
  m_codewords->SetSize(boundingBox->getMaxY() - boundingBox->getMinY() + 1);
}

CBC_DetectionResultColumn::~CBC_DetectionResultColumn() {
  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
    delete m_codewords->GetAt(i);
  }
  delete m_codewords;
}
CBC_Codeword* CBC_DetectionResultColumn::getCodewordNearby(int32_t imageRow) {
  CBC_Codeword* codeword = getCodeword(imageRow);
  if (codeword) {
    return codeword;
  }
  for (int32_t i = 1; i < MAX_NEARBY_DISTANCE; i++) {
    int32_t nearImageRow = imageRowToCodewordIndex(imageRow) - i;
    if (nearImageRow >= 0) {
      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
      if (codeword) {
        return codeword;
      }
    }
    nearImageRow = imageRowToCodewordIndex(imageRow) + i;
    if (nearImageRow < m_codewords->GetSize()) {
      codeword = (CBC_Codeword*)m_codewords->GetAt(nearImageRow);
      if (codeword) {
        return codeword;
      }
    }
  }
  return nullptr;
}
int32_t CBC_DetectionResultColumn::imageRowToCodewordIndex(int32_t imageRow) {
  return imageRow - m_boundingBox->getMinY();
}
int32_t CBC_DetectionResultColumn::codewordIndexToImageRow(
    int32_t codewordIndex) {
  return m_boundingBox->getMinY() + codewordIndex;
}
void CBC_DetectionResultColumn::setCodeword(int32_t imageRow,
                                            CBC_Codeword* codeword) {
  m_codewords->SetAt(imageRowToCodewordIndex(imageRow), codeword);
}
CBC_Codeword* CBC_DetectionResultColumn::getCodeword(int32_t imageRow) {
  return (CBC_Codeword*)m_codewords->GetAt(imageRowToCodewordIndex(imageRow));
}
CBC_BoundingBox* CBC_DetectionResultColumn::getBoundingBox() {
  return m_boundingBox;
}
CFX_ArrayTemplate<CBC_Codeword*>* CBC_DetectionResultColumn::getCodewords()
    const {
  return m_codewords;
}
CFX_ByteString CBC_DetectionResultColumn::toString() {
  CFX_ByteString result;
  int32_t row = 0;
  for (int32_t i = 0; i < m_codewords->GetSize(); i++) {
    CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i);
    if (!codeword) {
      result += (FX_CHAR)row;
      row++;
      continue;
    }
    result += (FX_CHAR)row;
    result += codeword->getRowNumber();
    result += codeword->getValue();
    row++;
  }
  return result;
}
