// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ENTERPRISE_DATA_CONTROLS_CHROME_CLIPBOARD_CONTEXT_H_
#define CHROME_BROWSER_ENTERPRISE_DATA_CONTROLS_CHROME_CLIPBOARD_CONTEXT_H_

#include "chrome/browser/enterprise/data_protection/data_protection_clipboard_utils.h"
#include "components/enterprise/data_controls/core/browser/clipboard_context.h"
#include "content/public/browser/clipboard_types.h"
#include "ui/base/clipboard/clipboard_metadata.h"

namespace data_controls {

// Clank/desktop implementation of `data_controls::ClipboardContext`.
class ChromeClipboardContext : public ClipboardContext {
 public:
  ChromeClipboardContext(content::ClipboardEndpoint source,
                         content::ClipboardEndpoint destination,
                         ui::ClipboardMetadata metadata);
  ChromeClipboardContext(content::ClipboardEndpoint source,
                         ui::ClipboardMetadata metadata);
  ChromeClipboardContext(enterprise_data_protection::FullPasteSource source,
                         content::ClipboardEndpoint destination,
                         ui::ClipboardMetadata metadata);
  ~ChromeClipboardContext();

  // Converts `source` into a `CopiedTextSource`. `CopiedTextSource::context` is
  // always populated, but `CopiedTextSource::url` may be left empty depending
  // on the policies that are set and broader clipboard copy context.
  //
  // This function should only be used to obtain a clipboard source for paste
  // reports and scans.
  static enterprise_connectors::ContentMetaData::CopiedTextSource
  GetClipboardSource(const content::ClipboardEndpoint& source,
                     const content::ClipboardEndpoint& destination,
                     const char* scope_pref);
  static enterprise_connectors::ContentMetaData::CopiedTextSource
  GetClipboardSource(const enterprise_data_protection::FullPasteSource& source,
                     const content::ClipboardEndpoint& destination,
                     const char* scope_pref);

  // Converts `source` into a `CopiedTextSource` specifically for copy
  // operations, where the destination is unknown.
  static enterprise_connectors::ContentMetaData::CopiedTextSource
  GetClipboardSource(const content::ClipboardEndpoint& source,
                     const char* scope_pref);

  // ClipboardContext:
  GURL source_url() const override;
  GURL destination_url() const override;
  enterprise_connectors::ContentMetaData::CopiedTextSource
  data_controls_copied_text_source() const override;
  ui::ClipboardFormatType format_type() const override;
  std::optional<size_t> size() const override;
  std::string source_active_user() const override;
  std::string destination_active_user() const override;

 private:
  enterprise_data_protection::FullPasteSource source_;
  std::optional<content::ClipboardEndpoint> destination_;
  ui::ClipboardMetadata metadata_;
};

}  // namespace data_controls

#endif  // CHROME_BROWSER_ENTERPRISE_DATA_CONTROLS_CHROME_CLIPBOARD_CONTEXT_H_
