// Copyright 2024 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_AI_AI_UTILS_H_
#define CHROME_BROWSER_AI_AI_UTILS_H_

#include "base/containers/fixed_flat_set.h"
#include "base/metrics/field_trial_params.h"
#include "components/optimization_guide/core/model_execution/optimization_guide_model_execution_error.h"
#include "mojo/public/cpp/bindings/remote_set.h"
#include "third_party/blink/public/mojom/ai/ai_common.mojom.h"
#include "third_party/blink/public/mojom/ai/model_streaming_responder.mojom.h"

class AIUtils {
 public:
  using LanguageCodes =
      std::optional<std::vector<blink::mojom::AILanguageCodePtr>>;

  template <typename ClientRemoteInterface>
  static void SendClientRemoteError(
      const mojo::Remote<ClientRemoteInterface>& client_remote,
      blink::mojom::AIManagerCreateClientError error,
      blink::mojom::QuotaErrorInfoPtr quota_error_info = nullptr) {
    if (client_remote) {
      client_remote->OnError(error, std::move(quota_error_info));
    }
  }

  static void SendStreamingStatus(
      const mojo::Remote<blink::mojom::ModelStreamingResponder>& responder,
      blink::mojom::ModelStreamingResponseStatus status,
      blink::mojom::QuotaErrorInfoPtr quota_error_info = nullptr) {
    if (responder) {
      responder->OnError(status, std::move(quota_error_info));
    }
  }

  static void SendStreamingStatus(
      blink::mojom::ModelStreamingResponder* responder,
      blink::mojom::ModelStreamingResponseStatus status,
      blink::mojom::QuotaErrorInfoPtr quota_error_info = nullptr) {
    if (responder) {
      responder->OnError(status, std::move(quota_error_info));
    }
  }

  static blink::mojom::ModelStreamingResponseStatus ConvertModelExecutionError(
      optimization_guide::OptimizationGuideModelExecutionError::
          ModelExecutionError error);

  static constexpr int kNormalizedDownloadProgressMax = 0x10000;

  // Normalizes the model download progress by scaling `bytes_so_far` from
  // having `total_bytes` its max to having a `kNormalizedDownloadProgressMax`
  // as its max.
  static int64_t NormalizeModelDownloadProgress(int64_t bytes_so_far,
                                                int64_t total_bytes);

  static base::flat_set<std::string_view> RestrictSupportedLanguagesForFeature(
      const base::flat_set<std::string_view>& supported,
      const base::FeatureParam<std::string>& feature_param);
};

#endif  // CHROME_BROWSER_AI_AI_UTILS_H_
