// Copyright 2018 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 CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_STORE_INSPECTOR_H_
#define CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_STORE_INSPECTOR_H_

#include <cstdint>
#include <string>
#include <vector>

#include "base/callback.h"
#include "base/optional.h"
#include "base/supports_user_data.h"
#include "chrome/browser/resource_coordinator/site_characteristics.pb.h"
#include "url/origin.h"

class Profile;

namespace resource_coordinator {

class SiteCharacteristicsDataStore;

// An interface that allows LocalSite data stores to expose diagnostic
// information for the associated web UI.
class LocalSiteCharacteristicsDataStoreInspector {
 public:
  // Retrieves the instance associated with a given profile, or nullptr
  // if none is associated with that profile.
  static LocalSiteCharacteristicsDataStoreInspector* GetForProfile(
      Profile* profile);

  // Returns the name of the data store, which should uniquely identify the kind
  // of storage it implements.
  virtual const char* GetDataStoreName() = 0;

  // Retrieves the origins that are current represented by in-memory data
  // at the present time.
  virtual std::vector<url::Origin> GetAllInMemoryOrigins() = 0;

  // Retrieves the number of rows and the on-disk size of the DB. Invokes
  // the |on_have_data| callback once the data has been collected, or once it's
  // determined that the data can't be retrieved.
  // On callback |num_rows| is the number of rows in the database, or -1 if
  // the number can't be determined. |on_disk_size_kb| is the on-disk size of
  // the database, or -1 if the on-disk size can't be determined.
  using DatabaseSizeCallback =
      base::OnceCallback<void(base::Optional<int64_t> num_rows,
                              base::Optional<int64_t> on_disk_size_kb)>;
  virtual void GetDatabaseSize(DatabaseSizeCallback on_have_data) = 0;

  // Retrieves the in-memory data for a given origin.
  // On return |data| contains the available data for |origin| if available,
  // and |is_dirty| is true if the entry needs flushing to disk.
  // Returns true if an entry exists for |origin|.
  virtual bool GetDataForOrigin(
      const url::Origin& origin,
      bool* is_dirty,
      std::unique_ptr<SiteCharacteristicsProto>* data) = 0;

  // Retrieves the data store this inspector is associated with.
  virtual SiteCharacteristicsDataStore* GetDataStore() = 0;

 protected:
  // Sets the inspector instance associated with a given profile.
  // If |inspector| is nullptr the association is cleared.
  // The caller must ensure that |inspector|'s registration is cleared before
  // |inspector| or |profile| are deleted.
  // The intent is for this to be called from implementation class' constructors
  // and destructors.
  static void SetForProfile(
      LocalSiteCharacteristicsDataStoreInspector* inspector,
      Profile* profile);
};

}  // namespace resource_coordinator

#endif  // CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_STORE_INSPECTOR_H_
