// 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.
#include "components/permissions/test/fake_permissions_aivx_modelhandlers.h"

#include <memory>
#include <string>

#include "components/permissions/prediction_service/permissions_aiv4_executor.h"

namespace test {
using permissions::PermissionsAiv4Executor;
using permissions::PermissionsAiv4Handler;

inline PermissionsAiv4HandlerFake::~PermissionsAiv4HandlerFake() = default;

void PermissionsAivXHandlerFakeBase::ExecuteModelWrapper(
    PermissionsAivXHandlerFakeBase::ExecutionCallback callback,
    const std::optional<PermissionsAiv4Executor::ModelOutput>& output) {
  std::move(callback).Run(output);
  model_execute_run_loop_for_testing_.Quit();
}

void PermissionsAivXHandlerFakeBase::WaitForModelLoadForTesting() {
  model_load_run_loop_for_testing_.Run();
}

void PermissionsAivXHandlerFakeBase::WaitForModelExecutionForTesting() {
  model_execute_run_loop_for_testing_.Run();
}

void PermissionsAivXHandlerFakeBase::OnModelUpdated(
    base::optional_ref<const optimization_guide::ModelInfo> model_info) {
  if (model_info.has_value()) {
    model_load_run_loop_for_testing_.Quit();
  }
}

PermissionsAiv4HandlerFake::PermissionsAiv4HandlerFake(
    optimization_guide::OptimizationGuideModelProvider* model_provider,
    optimization_guide::proto::OptimizationTarget optimization_target,
    permissions::RequestType request_type)
    : PermissionsAiv4Handler(model_provider,
                             optimization_target,
                             request_type,
                             /*scheduling_params=*/std::nullopt) {}

void PermissionsAiv4HandlerFake::OnModelUpdated(
    optimization_guide::proto::OptimizationTarget optimization_target,
    base::optional_ref<const optimization_guide::ModelInfo> model_info) {
  PermissionsAiv4Handler::OnModelUpdated(optimization_target, model_info);
  PermissionsAivXHandlerFakeBase::OnModelUpdated(model_info);
}

void PermissionsAiv4HandlerFake::ExecuteModel(
    PermissionsAiv4Handler::ExecutionCallback callback,
    ModelInput model_input) {
  PermissionsAiv4Handler::ExecuteModel(
      base::BindOnce(&PermissionsAivXHandlerFakeBase::ExecuteModelWrapper,
                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
      std::move(model_input));
}

}  // namespace test
