/*
 * Copyright 2017 The Cobalt Authors. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_BROWSER_MEMORY_SETTINGS_AUTO_MEM_H_
#define COBALT_BROWSER_MEMORY_SETTINGS_AUTO_MEM_H_

#include <memory>
#include <string>
#include <vector>

#include "base/command_line.h"
#include "base/memory/ref_counted.h"
#include "cobalt/browser/memory_settings/auto_mem_settings.h"
#include "cobalt/browser/memory_settings/memory_settings.h"
#include "cobalt/math/size.h"

namespace cobalt {
namespace browser {
namespace memory_settings {

// AutoMem is contains system memory settings. The command line is required to
// instantiate this object and after construction, all memory settings are
// calculated.
class AutoMem {
 public:
  AutoMem() {}
  ~AutoMem() {}

  void ConstructSettings(const math::Size& ui_resolution,
                         const AutoMemSettings& command_line_settings,
                         const AutoMemSettings& config_api_settings);

  const IntSetting* encoded_image_cache_size_in_bytes() const;
  const IntSetting* image_cache_size_in_bytes() const;
  // This setting represents all others cpu-memory consuming systems within
  // the engine. This value has been hard coded.
  const IntSetting* remote_typeface_cache_size_in_bytes() const;
  const DimensionSetting* skia_atlas_texture_dimensions() const;
  const IntSetting* skia_cache_size_in_bytes() const;
  const IntSetting* offscreen_target_cache_size_in_bytes() const;

  // max_cpu/gpu_bytes represents the maximum amount of memory that should
  // be consumed by the engine. These values can be set by the command line
  // or else they are set automatically.
  const IntSetting* max_cpu_bytes() const;
  const IntSetting* max_gpu_bytes() const;

  // Reports the total memory that all settings that match memory_type
  // consume.
  int64_t SumAllMemoryOfType(MemorySetting::MemoryType memory_type) const;

 private:
  // Logs a table of the memory settings and available memory for cpu and gpu.
  // This is used during startup to display memory configuration information.
  void LogToPrettyPrintString(const math::Size& ui_resolution,
                              bool use_color_ascii);

  // AllMemorySettings - does not include cpu & gpu max memory.
  std::vector<const MemorySetting*> AllMemorySettings() const;
  std::vector<MemorySetting*> AllMemorySettingsMutable() const;

  // All of the following are included in AllMemorySettings().
  std::unique_ptr<IntSetting> encoded_image_cache_size_in_bytes_;
  std::unique_ptr<IntSetting> image_cache_size_in_bytes_;
  std::unique_ptr<IntSetting> remote_typeface_cache_size_in_bytes_;
  std::unique_ptr<DimensionSetting> skia_atlas_texture_dimensions_;
  std::unique_ptr<IntSetting> skia_cache_size_in_bytes_;
  std::unique_ptr<IntSetting> offscreen_target_cache_size_in_bytes_;

  // These settings are used for constraining the memory and are NOT included
  // in AllMemorySettings().
  std::unique_ptr<IntSetting> max_cpu_bytes_;
  std::unique_ptr<IntSetting> max_gpu_bytes_;

#if !defined(COBALT_BUILD_TYPE_GOLD)
  std::string previous_log_;
  std::vector<std::string> error_msgs_;
#endif

  FRIEND_TEST(AutoMem, AllMemorySettingsAreOrderedByName);
  FRIEND_TEST(AutoMem, ConstrainedCPUEnvironment);
  FRIEND_TEST(AutoMem, ConstrainedGPUEnvironment);
  FRIEND_TEST(AutoMem, MaxCpuIsIgnoredDuringExplicitMemoryReduction);
};

}  // namespace memory_settings
}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_MEMORY_SETTINGS_AUTO_MEM_H_
