// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/enterprise/connectors/test/fake_files_request_handler.h"
#include "base/functional/bind.h"
#include "base/memory/weak_ptr.h"

namespace enterprise_connectors::test {

FakeFilesRequestHandler::FakeFilesRequestHandler(
    FakeFileUploadCallback fake_file_upload_callback,
    ContentAnalysisInfo* content_analysis_info,
    BinaryUploadService* upload_service,
    Profile* profile,
    GURL url,
    const std::string& source,
    const std::string& destination,
    const std::string& content_transfer_method,
    DeepScanAccessPoint access_point,
    const std::vector<base::FilePath>& paths,
    FilesRequestHandler::CompletionCallback callback)
    : FilesRequestHandlerBase(
          content_analysis_info,
          upload_service,
          url,
          content_transfer_method,
          access_point,
          std::make_unique<FilesRequestHandler>(profile,
                                                source,
                                                destination,
                                                paths,
                                                std::move(callback))),
      paths_(paths),
      fake_file_upload_callback_(fake_file_upload_callback) {}

FakeFilesRequestHandler::FakeFilesRequestHandler(
    FakeFileUploadCallback fake_file_upload_callback,
    ContentAnalysisInfo* content_analysis_info,
    BinaryUploadService* upload_service,
    GURL url,
    const std::string& content_transfer_method,
    DeepScanAccessPoint access_point,
    const std::vector<base::FilePath>& paths,
    std::unique_ptr<Delegate> delegate)
    : FilesRequestHandlerBase(content_analysis_info,
                              upload_service,
                              url,
                              content_transfer_method,
                              access_point,
                              std::move(delegate)),
      paths_(paths),
      fake_file_upload_callback_(fake_file_upload_callback) {}

FakeFilesRequestHandler::~FakeFilesRequestHandler() = default;

// static
std::unique_ptr<FilesRequestHandlerBase> FakeFilesRequestHandler::Create(
    FakeFileUploadCallback fake_file_upload_callback,
    ContentAnalysisInfo* content_analysis_info,
    BinaryUploadService* upload_service,
    Profile* profile,
    GURL url,
    const std::string& source,
    const std::string& destination,
    const std::string& content_transfer_method,
    DeepScanAccessPoint access_point,
    const std::vector<base::FilePath>& paths,
    FilesRequestHandler::CompletionCallback callback) {
  return std::make_unique<FakeFilesRequestHandler>(
      fake_file_upload_callback, content_analysis_info, upload_service, profile,
      url, source, destination, content_transfer_method, access_point, paths,
      std::move(callback));
}

// static
std::unique_ptr<FilesRequestHandlerBase>
FakeFilesRequestHandler::CreateWithDelegate(
    FakeFileUploadCallback fake_file_upload_callback,
    ContentAnalysisInfo* content_analysis_info,
    BinaryUploadService* upload_service,
    GURL url,
    const std::string& content_transfer_method,
    DeepScanAccessPoint access_point,
    const std::vector<base::FilePath>& paths,
    std::unique_ptr<Delegate> delegate) {
  return std::make_unique<FakeFilesRequestHandler>(
      fake_file_upload_callback, content_analysis_info, upload_service, url,
      content_transfer_method, access_point, paths, std::move(delegate));
}

void FakeFilesRequestHandler::UploadFileForDeepScanning(
    ScanRequestUploadResult result,
    const base::FilePath& path,
    std::unique_ptr<BinaryUploadRequest> request) {
  fake_file_upload_callback_.Run(
      result, path, std::move(request),
      base::BindOnce(&FakeFilesRequestHandler::FileRequestCallbackForTesting,
                     GetWeakPtr()));
}

void FakeFilesRequestHandler::FileRequestCallbackForTesting(
    base::FilePath path,
    ScanRequestUploadResult result,
    enterprise_connectors::ContentAnalysisResponse response) {
  auto it = std::ranges::find(paths_, path);
  CHECK(it != paths_.end());
  size_t index = std::distance(paths_.begin(), it);
  FileRequestCallback(index, result, response);
}

base::WeakPtr<FakeFilesRequestHandler> FakeFilesRequestHandler::GetWeakPtr() {
  return weak_ptr_factory_.GetWeakPtr();
}

}  // namespace enterprise_connectors::test
