// 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_UPDATER_EVENT_LOGGER_H_
#define CHROME_UPDATER_EVENT_LOGGER_H_

#include <cstdint>
#include <memory>
#include <optional>
#include <string>

#include "base/containers/span.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "chrome/enterprise_companion/telemetry_logger/telemetry_logger.h"
#include "chrome/updater/persisted_data.h"
#include "chrome/updater/protos/omaha_usage_stats_event.pb.h"
#include "chrome/updater/updater_scope.h"
#include "components/update_client/network.h"
#include "url/gurl.h"

namespace base {
class Clock;
}

namespace updater {
namespace proto {
class Omaha4Metric;
class Omaha4UsageStatsMetadata;
}  // namespace proto

class Configurator;

using UpdaterEventLogger =
    ::enterprise_companion::telemetry_logger::TelemetryLogger<
        proto::Omaha4Metric>;

class RemoteLoggingDelegate final : public UpdaterEventLogger::Delegate {
 public:
  RemoteLoggingDelegate(UpdaterScope scope,
                        const GURL& event_logging_url,
                        bool is_cloud_managed,
                        scoped_refptr<Configurator> configurator,
                        std::unique_ptr<base::Clock> clock);

  ~RemoteLoggingDelegate() override;

  // Overrides for TelemetryLogger::Delegate.
  bool StoreNextAllowedAttemptTime(base::Time time) override;
  std::optional<base::Time> GetNextAllowedAttemptTime() const override;
  void DoPostRequest(
      const std::string& request_body,
      base::OnceCallback<void(std::optional<int> http_status,
                              std::optional<std::string> response_body)>
          callback) override;
  int GetLogIdentifier() const override;
  base::TimeDelta MinimumCooldownTime() const override;
  std::string AggregateAndSerializeEvents(
      base::span<proto::Omaha4Metric> events) const override;

 private:
  void ResponseStart(int status_code, int64_t content_length);
  void ResponseComplete(
      base::OnceCallback<void(std::optional<int> http_status,
                              std::optional<std::string> response_body)>
          callback,
      std::optional<std::string> response_body,
      int net_error,
      const std::string& header_etag,
      const std::string& header_x_cup_server_proof,
      const std::string& header_set_cookie,
      int64_t xheader_retry_after_sec);
  proto::Omaha4UsageStatsMetadata GetMetadata() const;

  SEQUENCE_CHECKER(sequence_checker_);
  const UpdaterScope scope_;
  const GURL event_logging_url_;
  const bool is_cloud_managed_;
  scoped_refptr<Configurator> configurator_;
  std::unique_ptr<base::Clock> clock_;
  const scoped_refptr<PersistedData> persisted_data_;

  // A network fetcher is instantiated for each request. It lives for the
  // duration of the request.
  std::unique_ptr<update_client::NetworkFetcher> network_fetcher_;
  int http_status_code_ = 0;

  base::WeakPtrFactory<RemoteLoggingDelegate> weak_factory_{this};
};

// Extracts the value and expiration of the event logging cooke from the value
// of a Set-Cookie header. Returns nullopt if the logging cookie is not present
// or the value could not be parsed. If the cookie has no expiration, a default
// is chosen a fixed offset from `now`.
std::optional<PersistedData::Cookie> ExtractEventLoggingCookie(
    base::Time now,
    const std::string& set_cookie_value);

}  // namespace updater

#endif  // CHROME_UPDATER_EVENT_LOGGER_H_
