// 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_FWL_CORE_IFWL_BARCODE_H_
#define XFA_FWL_CORE_IFWL_BARCODE_H_

#include <memory>

#include "xfa/fwl/core/ifwl_edit.h"
#include "xfa/fwl/core/ifwl_scrollbar.h"
#include "xfa/fwl/core/ifwl_widget.h"
#include "xfa/fxbarcode/BC_Library.h"

class CFWL_WidgetProperties;
class CFX_Barcode;
class IFWL_Widget;

#define XFA_BCS_NeedUpdate 0x0001
#define XFA_BCS_EncodeSuccess 0x0002

enum FWL_BCDAttribute {
  FWL_BCDATTRIBUTE_NONE = 0,
  FWL_BCDATTRIBUTE_CHARENCODING = 1 << 0,
  FWL_BCDATTRIBUTE_MODULEHEIGHT = 1 << 1,
  FWL_BCDATTRIBUTE_MODULEWIDTH = 1 << 2,
  FWL_BCDATTRIBUTE_DATALENGTH = 1 << 3,
  FWL_BCDATTRIBUTE_CALCHECKSUM = 1 << 4,
  FWL_BCDATTRIBUTE_PRINTCHECKSUM = 1 << 5,
  FWL_BCDATTRIBUTE_TEXTLOCATION = 1 << 6,
  FWL_BCDATTRIBUTE_WIDENARROWRATIO = 1 << 7,
  FWL_BCDATTRIBUTE_STARTCHAR = 1 << 8,
  FWL_BCDATTRIBUTE_ENDCHAR = 1 << 9,
  FWL_BCDATTRIBUTE_VERSION = 1 << 10,
  FWL_BCDATTRIBUTE_ECLEVEL = 1 << 11,
  FWL_BCDATTRIBUTE_TRUNCATED = 1 << 12
};

class IFWL_Barcode : public IFWL_Edit {
 public:
  class DataProvider {
   public:
    virtual BC_CHAR_ENCODING GetCharEncoding() const = 0;
    virtual int32_t GetModuleHeight() const = 0;
    virtual int32_t GetModuleWidth() const = 0;
    virtual int32_t GetDataLength() const = 0;
    virtual bool GetCalChecksum() const = 0;
    virtual bool GetPrintChecksum() const = 0;
    virtual BC_TEXT_LOC GetTextLocation() const = 0;
    virtual int32_t GetWideNarrowRatio() const = 0;
    virtual FX_CHAR GetStartChar() const = 0;
    virtual FX_CHAR GetEndChar() const = 0;
    virtual int32_t GetVersion() const = 0;
    virtual int32_t GetErrorCorrectionLevel() const = 0;
    virtual bool GetTruncated() const = 0;
    virtual uint32_t GetBarcodeAttributeMask() const = 0;
  };

  IFWL_Barcode(const CFWL_App* app,
               std::unique_ptr<CFWL_WidgetProperties> properties);
  ~IFWL_Barcode() override;

  // IFWL_Widget
  FWL_Type GetClassID() const override;
  void Update() override;
  void DrawWidget(CFX_Graphics* pGraphics,
                  const CFX_Matrix* pMatrix = nullptr) override;
  void OnProcessEvent(CFWL_Event* pEvent) override;

  // IFWL_Edit
  void SetText(const CFX_WideString& wsText) override;

  void SetType(BC_TYPE type);
  bool IsProtectedType() const;

  void SetDataProvider(IFWL_Barcode::DataProvider* provider) {
    m_pDataProvider = provider;
  }

 private:
  void GenerateBarcodeImageCache();
  void CreateBarcodeEngine();

  std::unique_ptr<CFX_Barcode> m_pBarcodeEngine;
  IFWL_Barcode::DataProvider* m_pDataProvider;  // Not owned.
  uint32_t m_dwStatus;
  BC_TYPE m_type;
};

#endif  // XFA_FWL_CORE_IFWL_BARCODE_H_
