// 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.

#include "base/test/android/content_uri_test_utils.h"

#include <optional>

#include "base/android/build_info.h"
#include "base/android/path_utils.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/strings/escape.h"
#include "base/strings/strcat.h"

namespace base::test::android {
namespace {
std::optional<FilePath> GetInMemoryContentDocumentUriFromCacheDirPath(
    const FilePath& path,
    bool is_tree) {
  base::FilePath cache_dir;
  if (!base::android::GetCacheDirectory(&cache_dir)) {
    return std::nullopt;
  }
  base::FilePath document_id;
  if (!cache_dir.AppendRelativePath(path, &document_id)) {
    return std::nullopt;
  }
  base::FilePath uri(base::StrCat(
      {"content://", base::android::BuildInfo::GetInstance()->package_name(),
       ".docprov/", is_tree ? "tree/" : "document/",
       base::EscapeAllExceptUnreserved(document_id.value())}));
  return uri;
}
}  // namespace

std::optional<FilePath> GetContentUriFromCacheDirFilePath(
    const FilePath& path) {
  base::FilePath cache_dir;
  if (!base::android::GetCacheDirectory(&cache_dir)) {
    return std::nullopt;
  }
  base::FilePath uri(base::StrCat(
      {"content://", base::android::BuildInfo::GetInstance()->package_name(),
       ".fileprovider/cache/"}));
  if (!cache_dir.AppendRelativePath(path, &uri)) {
    return std::nullopt;
  }
  return uri;
}

std::optional<FilePath> GetInMemoryContentUriFromCacheDirFilePath(
    const FilePath& path) {
  base::FilePath cache_dir;
  if (!base::android::GetCacheDirectory(&cache_dir)) {
    return std::nullopt;
  }
  base::FilePath uri(base::StrCat(
      {"content://", base::android::BuildInfo::GetInstance()->package_name(),
       ".inmemory/cache/"}));
  if (!cache_dir.AppendRelativePath(path, &uri)) {
    return std::nullopt;
  }
  return uri;
}

std::optional<FilePath> GetInMemoryContentDocumentUriFromCacheDirFilePath(
    const FilePath& path) {
  return GetInMemoryContentDocumentUriFromCacheDirPath(path, /*is_tree=*/false);
}

std::optional<FilePath> GetInMemoryContentTreeUriFromCacheDirDirectory(
    const FilePath& path) {
  return GetInMemoryContentDocumentUriFromCacheDirPath(path, /*is_tree=*/true);
}

std::optional<FilePath> GetVirtualDocumentPathFromCacheDirDirectory(
    const FilePath& path) {
  std::optional<FilePath> content_url =
      GetInMemoryContentTreeUriFromCacheDirDirectory(path);
  if (!content_url) {
    return std::nullopt;
  }
  return base::ResolveToVirtualDocumentPath(*content_url);
}

}  // namespace base::test::android
