// 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 2010 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 "fxbarcode/BC_Writer.h"
#include "fxbarcode/common/BC_CommonBitMatrix.h"
#include "fxbarcode/oned/BC_OneDimWriter.h"
#include "fxbarcode/oned/BC_OnedCode39Writer.h"

namespace {

const char ALPHABET_STRING[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%";

const char CHECKSUM_STRING[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%";

const int32_t CHARACTER_ENCODINGS[44] = {
    0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124,
    0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C,
    0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007,
    0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0,
    0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A};

}  // namespace

CBC_OnedCode39Writer::CBC_OnedCode39Writer() {
  m_iWideNarrRatio = 3;
}
CBC_OnedCode39Writer::~CBC_OnedCode39Writer() {}
bool CBC_OnedCode39Writer::CheckContentValidity(
    const CFX_WideStringC& contents) {
  for (int32_t i = 0; i < contents.GetLength(); i++) {
    wchar_t ch = contents.GetAt(i);
    if ((ch >= (wchar_t)'0' && ch <= (wchar_t)'9') ||
        (ch >= (wchar_t)'A' && ch <= (wchar_t)'Z') || ch == (wchar_t)'-' ||
        ch == (wchar_t)'.' || ch == (wchar_t)' ' || ch == (wchar_t)'*' ||
        ch == (wchar_t)'$' || ch == (wchar_t)'/' || ch == (wchar_t)'+' ||
        ch == (wchar_t)'%') {
      continue;
    }
    return false;
  }
  return true;
}

CFX_WideString CBC_OnedCode39Writer::FilterContents(
    const CFX_WideStringC& contents) {
  CFX_WideString filtercontents;
  for (int32_t i = 0; i < contents.GetLength(); i++) {
    wchar_t ch = contents.GetAt(i);
    if (ch == (wchar_t)'*' && (i == 0 || i == contents.GetLength() - 1)) {
      continue;
    }
    if (ch > 175) {
      i++;
      continue;
    } else {
      ch = Upper(ch);
    }
    if ((ch >= (wchar_t)'0' && ch <= (wchar_t)'9') ||
        (ch >= (wchar_t)'A' && ch <= (wchar_t)'Z') || ch == (wchar_t)'-' ||
        ch == (wchar_t)'.' || ch == (wchar_t)' ' || ch == (wchar_t)'*' ||
        ch == (wchar_t)'$' || ch == (wchar_t)'/' || ch == (wchar_t)'+' ||
        ch == (wchar_t)'%') {
      filtercontents += ch;
    }
  }
  return filtercontents;
}

CFX_WideString CBC_OnedCode39Writer::RenderTextContents(
    const CFX_WideStringC& contents) {
  CFX_WideString renderContents;
  for (int32_t i = 0; i < contents.GetLength(); i++) {
    wchar_t ch = contents.GetAt(i);
    if (ch == (wchar_t)'*' && (i == 0 || i == contents.GetLength() - 1)) {
      continue;
    }
    if (ch > 175) {
      i++;
      continue;
    }
    if ((ch >= (wchar_t)'0' && ch <= (wchar_t)'9') ||
        (ch >= (wchar_t)'A' && ch <= (wchar_t)'Z') ||
        (ch >= (wchar_t)'a' && ch <= (wchar_t)'z') || ch == (wchar_t)'-' ||
        ch == (wchar_t)'.' || ch == (wchar_t)' ' || ch == (wchar_t)'*' ||
        ch == (wchar_t)'$' || ch == (wchar_t)'/' || ch == (wchar_t)'+' ||
        ch == (wchar_t)'%') {
      renderContents += ch;
    }
  }
  return renderContents;
}

bool CBC_OnedCode39Writer::SetTextLocation(BC_TEXT_LOC location) {
  if (location < BC_TEXT_LOC_NONE || location > BC_TEXT_LOC_BELOWEMBED) {
    return false;
  }
  m_locTextLoc = location;
  return true;
}
bool CBC_OnedCode39Writer::SetWideNarrowRatio(int32_t ratio) {
  if (ratio < 2 || ratio > 3) {
    return false;
  }
  m_iWideNarrRatio = ratio;
  return true;
}
uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
                                      BCFORMAT format,
                                      int32_t& outWidth,
                                      int32_t& outHeight,
                                      int32_t& e) {
  uint8_t* ret = Encode(contents, format, outWidth, outHeight, 0, e);
  if (e != BCExceptionNO)
    return nullptr;
  return ret;
}
uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
                                      BCFORMAT format,
                                      int32_t& outWidth,
                                      int32_t& outHeight,
                                      int32_t hints,
                                      int32_t& e) {
  if (format != BCFORMAT_CODE_39) {
    e = BCExceptionOnlyEncodeCODE_39;
    return nullptr;
  }
  uint8_t* ret =
      CBC_OneDimWriter::Encode(contents, format, outWidth, outHeight, hints, e);
  if (e != BCExceptionNO)
    return nullptr;
  return ret;
}
void CBC_OnedCode39Writer::ToIntArray(int32_t a, int32_t* toReturn) {
  for (int32_t i = 0; i < 9; i++) {
    toReturn[i] = (a & (1 << i)) == 0 ? 1 : m_iWideNarrRatio;
  }
}
char CBC_OnedCode39Writer::CalcCheckSum(const CFX_ByteString& contents,
                                        int32_t& e) {
  int32_t length = contents.GetLength();
  if (length > 80) {
    e = BCExceptionGeneric;
    return '*';
  }
  int32_t checksum = 0;
  int32_t len = (int32_t)strlen(ALPHABET_STRING);
  for (int32_t i = 0; i < contents.GetLength(); i++) {
    int32_t j = 0;
    for (; j < len; j++) {
      if (ALPHABET_STRING[j] == contents[i]) {
        if (contents[i] != '*')
          checksum += j;
        break;
      }
    }
    if (j >= len) {
      e = BCExceptionGeneric;
      return '*';
    }
  }
  checksum = checksum % 43;
  return CHECKSUM_STRING[checksum];
}
uint8_t* CBC_OnedCode39Writer::Encode(const CFX_ByteString& contents,
                                      int32_t& outlength,
                                      int32_t& e) {
  char checksum = CalcCheckSum(contents, e);
  if (checksum == '*') {
    return nullptr;
  }
  int32_t widths[9] = {0};
  int32_t wideStrideNum = 3;
  int32_t narrStrideNum = 9 - wideStrideNum;
  CFX_ByteString encodedContents = contents;
  if (m_bCalcChecksum) {
    encodedContents += checksum;
  }
  m_iContentLen = encodedContents.GetLength();
  int32_t codeWidth = (wideStrideNum * m_iWideNarrRatio + narrStrideNum) * 2 +
                      1 + m_iContentLen;
  int32_t len = (int32_t)strlen(ALPHABET_STRING);
  for (int32_t j = 0; j < m_iContentLen; j++) {
    for (int32_t i = 0; i < len; i++) {
      if (ALPHABET_STRING[i] == encodedContents[j]) {
        ToIntArray(CHARACTER_ENCODINGS[i], widths);
        for (int32_t k = 0; k < 9; k++) {
          codeWidth += widths[k];
        }
      }
    }
  }
  outlength = codeWidth;
  uint8_t* result = FX_Alloc(uint8_t, codeWidth);
  ToIntArray(CHARACTER_ENCODINGS[39], widths);
  int32_t pos = AppendPattern(result, 0, widths, 9, 1, e);
  if (e != BCExceptionNO) {
    FX_Free(result);
    return nullptr;
  }
  int32_t narrowWhite[] = {1};
  pos += AppendPattern(result, pos, narrowWhite, 1, 0, e);
  if (e != BCExceptionNO) {
    FX_Free(result);
    return nullptr;
  }
  for (int32_t l = m_iContentLen - 1; l >= 0; l--) {
    for (int32_t i = 0; i < len; i++) {
      if (ALPHABET_STRING[i] == encodedContents[l]) {
        ToIntArray(CHARACTER_ENCODINGS[i], widths);
        pos += AppendPattern(result, pos, widths, 9, 1, e);
        if (e != BCExceptionNO) {
          FX_Free(result);
          return nullptr;
        }
      }
    }
    pos += AppendPattern(result, pos, narrowWhite, 1, 0, e);
    if (e != BCExceptionNO) {
      FX_Free(result);
      return nullptr;
    }
  }
  ToIntArray(CHARACTER_ENCODINGS[39], widths);
  pos += AppendPattern(result, pos, widths, 9, 1, e);
  if (e != BCExceptionNO) {
    FX_Free(result);
    return nullptr;
  }
  for (int32_t i = 0; i < codeWidth / 2; i++) {
    result[i] ^= result[codeWidth - 1 - i];
    result[codeWidth - 1 - i] ^= result[i];
    result[i] ^= result[codeWidth - 1 - i];
  }
  return result;
}
CFX_WideString CBC_OnedCode39Writer::encodedContents(
    const CFX_WideStringC& contents,
    int32_t& e) {
  CFX_WideString encodedContents(contents);
  if (m_bCalcChecksum && m_bPrintChecksum) {
    CFX_WideString checksumContent = FilterContents(contents);
    CFX_ByteString str = checksumContent.UTF8Encode();
    char checksum;
    checksum = CalcCheckSum(str, e);
    if (e != BCExceptionNO)
      return CFX_WideString();
    str += checksum;
    encodedContents += checksum;
  }
  return encodedContents;
}
void CBC_OnedCode39Writer::RenderResult(const CFX_WideStringC& contents,
                                        uint8_t* code,
                                        int32_t codeLength,
                                        bool isDevice,
                                        int32_t& e) {
  CFX_WideString encodedCon = encodedContents(contents, e);
  if (e != BCExceptionNO)
    return;
  CBC_OneDimWriter::RenderResult(encodedCon.AsStringC(), code, codeLength,
                                 isDevice, e);
}
