// Copyright (c) 2011 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_UI_WEBUI_QUOTA_INTERNALS_QUOTA_INTERNALS_TYPES_H_
#define CHROME_BROWSER_UI_WEBUI_QUOTA_INTERNALS_QUOTA_INTERNALS_TYPES_H_

#include <stdint.h>

#include <map>
#include <memory>
#include <string>

#include "base/time/time.h"
#include "storage/common/quota/quota_types.h"
#include "url/gurl.h"

namespace base {
class Value;
}

namespace quota_internals {

// Represends global usage and quota information for specific type of storage.
class GlobalStorageInfo {
 public:
  explicit GlobalStorageInfo(storage::StorageType type);
  ~GlobalStorageInfo();

  void set_usage(int64_t usage) { usage_ = usage; }

  void set_unlimited_usage(int64_t unlimited_usage) {
    unlimited_usage_ = unlimited_usage;
  }

  void set_quota(int64_t quota) { quota_ = quota; }

  // Create new Value for passing to WebUI page.
  std::unique_ptr<base::Value> NewValue() const;

 private:
  storage::StorageType type_;

  int64_t usage_;
  int64_t unlimited_usage_;
  int64_t quota_;
};

// Represents per host usage and quota information for the storage.
class PerHostStorageInfo {
 public:
  PerHostStorageInfo(const std::string& host, storage::StorageType type);
  ~PerHostStorageInfo();

  void set_usage(int64_t usage) { usage_ = usage; }

  void set_quota(int64_t quota) { quota_ = quota; }

  // Create new Value for passing to WebUI page.
  std::unique_ptr<base::Value> NewValue() const;

 private:
  std::string host_;
  storage::StorageType type_;

  int64_t usage_;
  int64_t quota_;
};

// Represendts per origin usage and access time information.
class PerOriginStorageInfo {
 public:
  PerOriginStorageInfo(const GURL& origin, storage::StorageType type);
  PerOriginStorageInfo(const PerOriginStorageInfo& other);
  ~PerOriginStorageInfo();

  void set_in_use(bool in_use) {
    in_use_ = in_use ? 1 : 0;
  }

  void set_used_count(int used_count) {
    used_count_ = used_count;
  }

  void set_last_access_time(base::Time last_access_time) {
    last_access_time_ = last_access_time;
  }

  void set_last_modified_time(base::Time last_modified_time) {
    last_modified_time_ = last_modified_time;
  }

  // Create new Value for passing to WebUI page.
  std::unique_ptr<base::Value> NewValue() const;

 private:
  GURL origin_;
  storage::StorageType type_;
  std::string host_;

  int in_use_;
  int used_count_;
  base::Time last_access_time_;
  base::Time last_modified_time_;
};
}  // namespace quota_internals

#endif  // CHROME_BROWSER_UI_WEBUI_QUOTA_INTERNALS_QUOTA_INTERNALS_TYPES_H_
