/*
 *  Copyright 2026 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef API_SFRAME_SFRAME_DECRYPTOR_INTERFACE_H_
#define API_SFRAME_SFRAME_DECRYPTOR_INTERFACE_H_

#include <cstdint>
#include <memory>
#include <optional>
#include <span>

#include "absl/functional/any_invocable.h"
#include "api/frame_transformer_interface.h"
#include "api/ref_count.h"
#include "api/rtc_error.h"

namespace webrtc {

enum class SframeDecryptErrorType {
  kAuthentication,  // Authentication tag validation failed.
  kKeyId,           // Unknown key identifier in the Sframe header.
  kSyntax,          // Payload does not follow the Sframe format.
};

// The error reported when Sframe decryption fails,
// aligned with SFrameTransformErrorEvent:
// https://w3c.github.io/webrtc-encoded-transform/#dom-sframetransformerrorrevent
struct SframeDecryptError {
  SframeDecryptErrorType error_type;
  // Key identifier parsed from the Sframe header.
  // Set only when `error_type` is kKeyId; otherwise nullopt.
  std::optional<uint64_t> key_id;
  // Frame/Packet that failed decryption. The payload is the unmodified
  // encrypted data — Sframe verifies authentication before decrypting
  // (RFC 9605, Section 4.5.1), so no plaintext is ever exposed here.
  // TODO(bugs.webrtc.org/479862368): Add tests verifying that the frame
  // payload is unmodified ciphertext when this field is populated.
  std::unique_ptr<TransformableFrameInterface> frame;
};

// Invoked when Sframe decryption fails.
//
// The Sframe transform algorithm requires firing an error on each decrypt
// failure, which can mean one event per frame/packet for a sustained failure.
// WebRTC may instead invoke this at most once while the same error recurs
// consecutively. Whether the spec should limit such events is tracked in
// https://github.com/w3c/webrtc-encoded-transform/issues/307
using SframeDecryptErrorCallback = absl::AnyInvocable<void(SframeDecryptError)>;

// Key management handle for Sframe receiver decryption.
class SframeDecryptorInterface : public RefCountInterface {
 public:
  virtual RTCError AddDecryptionKey(uint64_t key_id,
                                    std::span<const uint8_t> key_material) = 0;

  virtual RTCError RemoveDecryptionKey(uint64_t key_id) = 0;

 protected:
  ~SframeDecryptorInterface() override = default;
};

}  // namespace webrtc

#endif  // API_SFRAME_SFRAME_DECRYPTOR_INTERFACE_H_
