/*
 * Copyright 2017 Google Inc. 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_PRETTY_PRINT_H_
#define COBALT_BROWSER_MEMORY_SETTINGS_PRETTY_PRINT_H_

#include <string>
#include <vector>

#include "cobalt/browser/memory_settings/memory_settings.h"
#include "starboard/types.h"

namespace cobalt {
namespace browser {
namespace memory_settings {

// Generates a table, ie:
//
//   NAME                                   VALUE                   TYPE   SOURCE
//   _______________________________________________________________________________
//  |                                      |             |         |      |         |
//  | image_cache_size_in_bytes            |    33554432 | 32.0 MB |  GPU | AutoSet |
//  |______________________________________|_____________|_________|______|_________|
//  |                                      |             |         |      |         |
//  | javascript_gc_threshold_in_bytes     |     8388608 |  8.0 MB |  CPU |   Build |
//  |______________________________________|_____________|_________|______|_________|
//  |                                      |             |         |      |         |
//  | misc_cobalt_engine_size_in_bytes     |    33554432 | 32.0 MB |  CPU |   Build |
//  |______________________________________|_____________|_________|______|_________|
//  |                                      |             |         |      |         |
//  | skia_atlas_texture_dimensions        | 4096x8192x2 | 64.0 MB |  GPU |   Build |
//  |______________________________________|_____________|_________|______|_________|
//  |                                      |             |         |      |         |
//  | skia_cache_size_in_bytes             |     4194304 |  4.0 MB |  GPU |   Build |
//  |______________________________________|_____________|_________|______|_________|
//  |                                      |             |         |      |         |
//  | software_surface_cache_size_in_bytes |         N/A |     N/A |  N/A |     N/A |
//  |______________________________________|_____________|_________|______|_________|
std::string GeneratePrettyPrintTable(
    bool use_color_ascii,
    const std::vector<const MemorySetting*>& memory_settings);

// Generates a table, ie:
//
//   TYPE   TOTAL      SETTINGS
//   ____________________________
//  |      |          |          |
//  | CPU  | 256.0 MB |  40.0 MB |
//  |______|__________|__________|
//  |      |          |          |
//  | GPU  | 768.0 MB | 100.0 MB |
//  |______|__________|__________|
// When optional total_gpu_memory is null then the the value in the output
// table will be <UNKNOWN>.
std::string GenerateMemoryTable(bool use_color_ascii,
                                const IntSetting& total_cpu_memory,
                                const IntSetting& total_gpu_memory,
                                int64_t settings_cpu_consumption,
                                int64_t settings_gpu_consumption);

// Example:
//   ToMegabyteString(1 * 1024 * 1024, 1)
// Returns: "1.0MB".
std::string ToMegabyteString(int64_t bytes, int decimal_places);

// Takes in a body such as "aaaabbbb" and generates a border around it:
// MakeBoarder("aaaabbbb", '*')
// Returns:
//   ************
//   * aaaabbbb *
//   ************
// Works with multiple lines.
std::string MakeBorder(const std::string& body, const char border_ch);

// Stringify's the MemorySetting::source_type() to a readable string value.
std::string StringifySourceType(const MemorySetting& setting);

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

#endif  // COBALT_BROWSER_MEMORY_SETTINGS_PRETTY_PRINT_H_
