// 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 "chrome/browser/ui/android/extensions/extension_util_bridge.h"

#include <optional>

#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/files/file_util.h"
#include "chrome/browser/extensions/api/omnibox/omnibox_api.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/web_contents.h"
#include "extensions/buildflags/buildflags.h"
#include "net/base/url_util.h"
#include "ui/base/window_open_disposition.h"
#include "ui/gfx/android/java_bitmap.h"
#include "ui/gfx/image/image.h"
#include "url/gurl.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/browser/ui/android/extensions/jni_headers/ExtensionUtilBridge_jni.h"

namespace extensions {

std::optional<base::FilePath> GetFileUnderDownloads(
    const std::string& file_name) {
  if (file_name.empty()) {
    return std::nullopt;
  }
  JNIEnv* env = base::android::AttachCurrentThread();
  std::string uri =
      Java_ExtensionUtilBridge_getFileUnderDownloads(env, file_name);
  if (uri.empty()) {
    return std::nullopt;
  }
  return base::FilePath(uri);
}

std::optional<std::vector<base::FilePath>> GetOrCreateEmptyFilesUnderDownloads(
    const base::FilePath& file_for_basename,
    const std::vector<std::string>& dot_extensions) {
  auto content_uri = base::ResolveToContentUri(file_for_basename);
  if (!content_uri) {
    return std::nullopt;
  }

  JNIEnv* env = base::android::AttachCurrentThread();
  std::vector<std::string> uris =
      Java_ExtensionUtilBridge_getOrCreateEmptyFilesUnderDownloads(
          env, content_uri->value(), dot_extensions);
  if (uris.empty()) {
    return std::nullopt;
  }

  std::vector<base::FilePath> result;
  for (auto uri : uris) {
    result.emplace_back(uri);
  }
  return result;
}

}  // namespace extensions

// static
base::android::ScopedJavaLocalRef<jobject>
JNI_ExtensionUtilBridge_GetExtensionOmniboxIcon(
    JNIEnv* env,
    Profile* profile,
    const std::string& extension_id) {
  CHECK(profile);

  gfx::Image image =
      extensions::OmniboxAPI::Get(profile)->GetOmniboxIcon(extension_id);
  if (!image.IsEmpty()) {
    return gfx::ConvertToJavaBitmap(image.AsBitmap());
  }
  return nullptr;
}

// static
void JNI_ExtensionUtilBridge_OnOmniboxExtensionInputEntered(
    JNIEnv* env,
    content::WebContents* web_contents,
    const std::string& url_str,
    bool open_in_new_tab,
    bool open_in_new_window) {
  GURL url(url_str);
  std::string extension_id(url.host());
  std::string input_text;
  net::GetValueForKeyInQuery(url, "q", &input_text);

  WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB;
  if (open_in_new_window) {
    disposition = WindowOpenDisposition::NEW_WINDOW;
  } else if (open_in_new_tab) {
    disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
  }

  extensions::ExtensionOmniboxEventRouter::OnInputEntered(
      web_contents, extension_id, input_text, disposition);
}

DEFINE_JNI(ExtensionUtilBridge)
