// Copyright 2017 The PDFium Authors
// 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 FPDFSDK_CPDFSDK_APPSTREAM_H_
#define FPDFSDK_CPDFSDK_APPSTREAM_H_

#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

class CPDFSDK_Widget;
class CPDF_Dictionary;
class CPDF_Stream;

class CPDFSDK_AppStream {
 public:
  CPDFSDK_AppStream(CPDFSDK_Widget* widget, CPDF_Dictionary* dict);
  ~CPDFSDK_AppStream();

  void SetAsPushButton();
  void SetAsCheckBox();
  void SetAsRadioButton();
  void SetAsComboBox(absl::optional<WideString> sValue);
  void SetAsListBox();
  void SetAsTextField(absl::optional<WideString> sValue);

 private:
  void AddImage(const ByteString& sAPType, CPDF_Stream* pImage);
  void Write(const ByteString& sAPType,
             const ByteString& sContents,
             const ByteString& sAPState);
  void Remove(ByteStringView sAPType);

  ByteString GetBackgroundAppStream() const;
  ByteString GetBorderAppStream() const;

  UnownedPtr<CPDFSDK_Widget> const widget_;
  RetainPtr<CPDF_Dictionary> const dict_;
};

#endif  // FPDFSDK_CPDFSDK_APPSTREAM_H_
