// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COBALT_LOGGER_OBSERVATION_WRITER_H_
#define COBALT_LOGGER_OBSERVATION_WRITER_H_

#include <memory>

#include "./observation2.pb.h"
#include "encoder/observation_store.h"
#include "encoder/observation_store_update_recipient.h"
#include "logger/status.h"
#include "util/encrypted_message_util.h"

namespace cobalt {
namespace logger {

// The ObservationWriter encrypts Observations and writes them to the
// ObservationStore.
//
// A system has a single instance of ObservationWriter, which is used by the
// EventAggregator and multiple Loggers.
class ObservationWriter {
 public:
  // Constructor:
  //
  // |observation_store| A writer interface to the system's singleton instance
  // of Observation Store. This must remain valid as long as the
  // ObservationWriter is being used.
  //
  // |update_recipient| The ObservationWriter uses this to notify the update
  // recipient when an Observation has been added to the Observation Store. This
  // must remain valid as long as the ObservationWriter is being used.
  //
  // |observation_encrypter| This is used to encrypt Observations to the public
  // key of Cobalt's Analyzer prior to writing them into the Observation Store.
  // This must remain valid as long as the ObservationWriter is being used.
  ObservationWriter(encoder::ObservationStoreWriterInterface* observation_store,
                    encoder::ObservationStoreUpdateRecipient* update_recipient,
                    util::EncryptedMessageMaker* observation_encrypter)
      : observation_store_(observation_store),
        update_recipient_(update_recipient),
        observation_encrypter_(observation_encrypter) {}

  // Given an Observation |observation| and an ObservationMetadata |metadata|,
  // writes an encryption of the Observation together with the unencrypted
  // metadata to the Observation Store, and notifies the UpdateRecipient that an
  // Observation has been added to the store.
  Status WriteObservation(const Observation2& observation,
                          std::unique_ptr<ObservationMetadata> metadata) const;

 private:
  encoder::ObservationStoreWriterInterface* observation_store_;
  encoder::ObservationStoreUpdateRecipient* update_recipient_;
  util::EncryptedMessageMaker* observation_encrypter_;
};

}  // namespace logger
}  // namespace cobalt

#endif  // COBALT_LOGGER_OBSERVATION_WRITER_H_
