// Copyright 2016 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/site_engagement/content/android/site_engagement_service_android.h"

#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "components/site_engagement/content/site_engagement_score.h"
#include "components/site_engagement/content/site_engagement_service.h"
#include "content/public/browser/android/browser_context_handle.h"
#include "url/gurl.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "components/site_engagement/content/android/jni_headers/SiteEngagementService_jni.h"

namespace site_engagement {

using base::android::JavaRef;

// static
const base::android::ScopedJavaGlobalRef<jobject>&
SiteEngagementServiceAndroid::GetOrCreate(JNIEnv* env,
                                          SiteEngagementService* service) {
  SiteEngagementServiceAndroid* android_service = service->GetAndroidService();
  if (!android_service) {
    service->SetAndroidService(
        std::make_unique<SiteEngagementServiceAndroid>(env, service));
    android_service = service->GetAndroidService();
  }

  return android_service->java_service_;
}

SiteEngagementServiceAndroid::SiteEngagementServiceAndroid(
    JNIEnv* env,
    SiteEngagementService* service)
    : service_(service) {
  java_service_.Reset(Java_SiteEngagementService_create(
      env, reinterpret_cast<uintptr_t>(this)));
}

SiteEngagementServiceAndroid::~SiteEngagementServiceAndroid() {
  Java_SiteEngagementService_onNativeDestroyed(
      base::android::AttachCurrentThread(), java_service_);
  java_service_.Reset();
}

double SiteEngagementServiceAndroid::GetScore(const std::string& url) const {
  return service_->GetScore(GURL(url));
}

void SiteEngagementServiceAndroid::ResetBaseScoreForURL(const std::string& url,
                                                        double score) {
  service_->ResetBaseScoreForURL(GURL(url), score);
}

static void JNI_SiteEngagementService_SetParamValuesForTesting(JNIEnv* env) {
  SiteEngagementScore::SetParamValuesForTesting();
}

static base::android::ScopedJavaLocalRef<jobject>
JNI_SiteEngagementService_SiteEngagementServiceForBrowserContext(
    JNIEnv* env,
    const base::android::JavaRef<jobject>& jhandle) {
  SiteEngagementService* service = SiteEngagementService::Get(
      content::BrowserContextFromJavaHandle(jhandle));
  DCHECK(service);

  return base::android::ScopedJavaLocalRef<jobject>(
      SiteEngagementServiceAndroid::GetOrCreate(env, service));
}

}  // namespace site_engagement

DEFINE_JNI(SiteEngagementService)
