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

#ifndef CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_DESKTOP_H_
#define CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_DESKTOP_H_

#include "base/callback_list.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"

namespace base {
class FilePath;
}

class Profile;

static_assert(!BUILDFLAG(IS_ANDROID), "For non-Android Chrome only");

namespace chrome {

using ProfileBrowsersCloseCallback =
    base::RepeatingCallback<void(const base::FilePath&)>;

// The mode for a relaunch.
enum class RelaunchMode {
  // Restart and restore the session normally.
  kNormal,
  // Restart in the background (no window created).
  kBackground,
};

// Starts an administrator-initiated relaunch process. On platforms other than
// Chrome OS, this relaunches the browser and restores the user's session. On
// Chrome OS, this restarts the entire OS. This differs from AttemptRelaunch in
// that all user prompts (e.g., beforeunload handlers and confirmation to abort
// in-progress downloads) are bypassed.
void RelaunchIgnoreUnloadHandlers();

// Closes all browsers and if successful, quits.
void CloseAllBrowsersAndQuit();

// Closes all browsers. If the session is ending the windows are closed
// directly. Otherwise the windows are closed by way of posting a WM_CLOSE
// message. This will quit the application if there is nothing other than
// browser windows keeping it alive or the application is quitting.
void CloseAllBrowsers();

// If there are no browsers open and we aren't already shutting down,
// initiate a shutdown.
void ShutdownIfNeeded();

// Begins shutdown of the application when the desktop session is ending.
void SessionEnding();

// Called once the application is exiting.
void OnAppExiting();

// Called once the application is exiting to do any platform specific
// processing required.
void HandleAppExitingForPlatform();

// Called when the process of closing all browsers starts or is cancelled.
void OnClosingAllBrowsers(bool closing);

// Registers a callback that will be invoked with true when all browsers start
// closing, and false if and when that process is cancelled.
base::CallbackListSubscription AddClosingAllBrowsersCallback(
    base::RepeatingCallback<void(bool)> closing_all_browsers_callback);

// Sets the exit type to `ExitType::kClean` for all browser profiles.
void MarkAsCleanShutdown();

// Returns true if all browsers can be closed without user interaction.
// This currently checks if there is pending download, or if it needs to
// handle unload handler.
bool AreAllBrowsersCloseable();

// Starts a user-initiated restart process with the given mode.
void AttemptRestartWithMode(RelaunchMode mode);

// Closes all browsers whose original profile matches `profile`. Uses
// BrowserCollection::Order::kCreation to mirror the prior BrowserList
// behavior. The close is asynchronous and does not run beforeunload handlers
// or trigger session-service shutdown; callers that need those semantics
// should use the four-argument overload below.
void CloseAllBrowsersWithProfile(Profile* profile);

// Closes all browsers for `profile` across all desktops. Uses
// ProfileBrowserCollection and triggers any OnBeforeUnload events unless
// `skip_beforeunload` is true.
void CloseAllBrowsersWithProfile(
    Profile* profile,
    bool skip_beforeunload,
    const ProfileBrowsersCloseCallback& on_close_success = base::NullCallback(),
    const ProfileBrowsersCloseCallback& on_close_aborted =
        base::NullCallback());

// Closes all browsers for the off-the-record `profile` without touching
// browsers that use the original profile.
void CloseAllBrowsersWithIncognitoProfile(Profile* profile,
                                          bool skip_beforeunload = true);

}  // namespace chrome

#endif  // CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_DESKTOP_H_
