// Copyright 2012 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/files/file_util.h"

#include "base/android/jni_string.h"
#include "base/android/virtual_document_path.h"
#include "base/files/file_path.h"
#include "base/path_service.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "base/file_utils_jni/FileUtils_jni.h"

namespace base {
namespace android {

static std::string JNI_FileUtils_GetAbsoluteFilePath(JNIEnv* env,
                                                     std::string& file_path) {
  return MakeAbsoluteFilePath(base::FilePath(file_path)).value();
}

}  // namespace android

bool GetShmemTempDir(bool executable, base::FilePath* path) {
  return PathService::Get(base::DIR_CACHE, path);
}

std::optional<FilePath> ResolveToContentUri(const base::FilePath& path) {
  if (path.IsContentUri()) {
    return path;
  }
  if (!path.IsVirtualDocumentPath()) {
    return std::nullopt;
  }

  std::optional<files_internal::VirtualDocumentPath> vp =
      files_internal::VirtualDocumentPath::Parse(path.value());
  if (!vp) {
    return std::nullopt;
  }

  std::optional<std::string> uri = vp->ResolveToContentUri();
  if (!uri) {
    return std::nullopt;
  }

  return FilePath(*uri);
}

std::optional<FilePath> ResolveToVirtualDocumentPath(const FilePath& path) {
  std::optional<files_internal::VirtualDocumentPath> vp =
      files_internal::VirtualDocumentPath::Parse(path.value());
  if (!vp) {
    return std::nullopt;
  }
  return FilePath(vp->ToString());
}

}  // namespace base
