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

#ifndef CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_LAUNCHER_H_
#define CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_LAUNCHER_H_

#include "base/callback_forward.h"
#include "base/lazy_instance.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "content/common/content_export.h"

#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#endif

#include "third_party/blink/public/mojom/background_sync/background_sync.mojom.h"

namespace content {

class BrowserContext;
class StoragePartition;

class CONTENT_EXPORT BackgroundSyncLauncher {
 public:
  static BackgroundSyncLauncher* Get();
  static base::TimeDelta GetSoonestWakeupDelta(
      blink::mojom::BackgroundSyncType sync_type,
      BrowserContext* browser_context);
#if defined(OS_ANDROID)
  static void FireBackgroundSyncEvents(
      BrowserContext* browser_context,
      blink::mojom::BackgroundSyncType sync_type,
      const base::android::JavaParamRef<jobject>& j_runnable);
  base::TimeDelta TimeSinceLastBrowserWakeUpForPeriodicSync();
#endif

 private:
  friend struct base::LazyInstanceTraitsBase<BackgroundSyncLauncher>;
  friend class BackgroundSyncLauncherTest;
  friend class BackgroundSyncManagerTest;

  // Constructor and destructor marked private to enforce singleton.
  BackgroundSyncLauncher();
  ~BackgroundSyncLauncher();

  base::TimeDelta GetSoonestWakeupDeltaImpl(
      blink::mojom::BackgroundSyncType sync_type,
      BrowserContext* browser_context);
#if defined(OS_ANDROID)
  void FireBackgroundSyncEventsImpl(
      BrowserContext* browser_context,
      blink::mojom::BackgroundSyncType sync_type,
      const base::android::JavaParamRef<jobject>& j_runnable);
#endif
  void GetSoonestWakeupDeltaForStoragePartition(
      blink::mojom::BackgroundSyncType sync_type,
      StoragePartition* storage_partition);
  void SendSoonestWakeupDelta(
      blink::mojom::BackgroundSyncType sync_type,
      base::OnceCallback<void(base::TimeDelta)> callback);

  // Getter and setter for |soonest_wakeup_delta_one_shot_|
  // or |soonest_wakeup_delta_periodic_| based on |sync_type|.
  void SetGlobalSoonestWakeupDelta(blink::mojom::BackgroundSyncType sync_type,
                                   base::TimeDelta set_to);
  base::TimeDelta GetGlobalSoonestWakeupDelta(
      blink::mojom::BackgroundSyncType sync_type);

  base::TimeDelta soonest_wakeup_delta_one_shot_ = base::TimeDelta::Max();
  base::TimeDelta soonest_wakeup_delta_periodic_ = base::TimeDelta::Max();
  base::Time last_browser_wakeup_for_periodic_sync_;
  DISALLOW_COPY_AND_ASSIGN(BackgroundSyncLauncher);
};

}  // namespace content

#endif  // CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_LAUNCHER_H_
