/*
 * 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.
 */

#include "cobalt/browser/memory_settings/constrainer.h"

#include <algorithm>
#include <iterator>
#include <vector>

#include "base/logging.h"
#include "cobalt/browser/memory_settings/memory_settings.h"
#include "cobalt/browser/memory_settings/pretty_print.h"
#include "starboard/configuration.h"

namespace cobalt {
namespace browser {
namespace memory_settings {
namespace {

// Any memory setting that matches the MemoryType and is an AutoSet type is
// passed to the output.
std::vector<MemorySetting*> FilterSettings(
    MemorySetting::MemoryType memory_type,
    const std::vector<MemorySetting*>& settings) {
  std::vector<MemorySetting*> output;
  for (size_t i = 0; i < settings.size(); ++i) {
    MemorySetting* setting = settings[i];
    if (setting->memory_type() == memory_type) {
      output.push_back(setting);
    }
  }
  return output;
}

// Sums the memory consumption at the given global_constraining_value. The
// settings variable is read buy not modified (despite the non-const
// declaration). If constrained_values_out is non-null, then the computed
// constraining values are stored in this vector.
// Returns: The amount of memory in bytes that the memory settings vector will
//          consume at the given global_constraining_factor.
int64_t SumMemoryConsumption(double global_constraining_factor,
                             const std::vector<MemorySetting*>& memory_settings,
                             std::vector<double>* constrained_values_out) {
  if (constrained_values_out) {
    constrained_values_out->clear();
  }

  int64_t sum = 0;

  // Iterates through the MemorySettings and determines the total memory
  // consumption at the current global_constraining_value.
  for (size_t i = 0; i < memory_settings.size(); ++i) {
    const MemorySetting* setting = memory_settings[i];

    const int64_t requested_consumption = setting->MemoryConsumption();
    double local_constraining_value = 1.0;
    if (setting->source_type() == MemorySetting::kAutoSet) {
      local_constraining_value =
          setting->ComputeAbsoluteMemoryScale(global_constraining_factor);
    }

    const int64_t new_consumption_value =
        static_cast<int64_t>(local_constraining_value * requested_consumption);

    if (constrained_values_out) {
      constrained_values_out->push_back(local_constraining_value);
    }

    sum += new_consumption_value;
  }

  return sum;
}

void CheckMemoryChange(const std::string& setting_name,
                       int64_t old_memory_consumption,
                       int64_t new_memory_consumption,
                       double constraining_value) {
  if (old_memory_consumption == 0) {
    // If the system is already using no memory, then it can't use any less.
    return;
  }

  // Represents 1% allowed difference.
  static const double kErrorThreshold = 0.01;

  const double actual_constraining_value =
      static_cast<double>(new_memory_consumption) /
      static_cast<double>(old_memory_consumption);

  double diff = constraining_value - actual_constraining_value;
  if (diff < 0.0) {
    diff = -diff;
  }

  DCHECK_LE(diff, kErrorThreshold)
      << "MemorySetting " << setting_name << " did not change it's memory by "
      << "the expected value.\n"
      << "  Expected Change: " << (constraining_value * 100) << "%\n"
      << "  Actual Change: " << (diff * 100) << "%\n"
      << "  Original memory consumption (bytes): " << old_memory_consumption
      << "  New memory consumption (bytes):      " << new_memory_consumption
      << "\n";
}

void ConstrainToMemoryLimit(int64_t memory_limit,
                            std::vector<MemorySetting*>* memory_settings) {
  if (memory_settings->empty()) {
    return;
  }

  // If the memory consumed is already under the memory limit then no further
  // work needs to be done.
  if (SumMemoryConsumption(1.0, *memory_settings, NULL) <= memory_limit) {
    return;
  }

  // Iterate by small steps the constraining value from 1.0 (100%) toward
  // 0.0.
  static const double kStep = 0.0001;  // .01% change per iteration.
  std::vector<double> constrained_sizes;
  // 1-1 mapping.
  constrained_sizes.resize(memory_settings->size());
  for (double global_constraining_factor = 1.0;
       global_constraining_factor >= 0.0; global_constraining_factor -= kStep) {
    global_constraining_factor = std::max(0.0, global_constraining_factor);
    const int64_t new_global_memory_consumption = SumMemoryConsumption(
        global_constraining_factor, *memory_settings, &constrained_sizes);

    const bool finished = (global_constraining_factor == 0.0) ||
                          (new_global_memory_consumption <= memory_limit);

    if (finished) {
      break;
    }
  }
  DCHECK_EQ(memory_settings->size(), constrained_sizes.size());
  for (size_t i = 0; i < memory_settings->size(); ++i) {
    const double local_constraining_factor = constrained_sizes[i];
    MemorySetting* setting = memory_settings->at(i);
    if (local_constraining_factor != 1.0) {
      const int64_t old_memory_consumption = setting->MemoryConsumption();
      DCHECK_EQ(setting->source_type(), MemorySetting::kAutoSet);
      setting->ScaleMemory(local_constraining_factor);
      const int64_t new_memory_consumption = setting->MemoryConsumption();

      // If the memory doesn't actually change as predicted by the constraining
      // value then this check will catch it here.
      CheckMemoryChange(setting->name(), old_memory_consumption,
                        new_memory_consumption, local_constraining_factor);
    }
  }
}

void ConstrainMemoryType(MemorySetting::MemoryType memory_type,
                         int64_t max_memory,
                         std::vector<MemorySetting*>* memory_settings,
                         std::vector<std::string>* error_msgs) {
  if (max_memory == 0) {
    return;
  }
  DCHECK_NE(MemorySetting::kNotApplicable, memory_type);
  const char* memory_type_str = "UNKNOWN";
  switch (memory_type) {
    case MemorySetting::kCPU: {
      memory_type_str = "CPU";
      break;
    }
    case MemorySetting::kGPU: {
      memory_type_str = "GPU";
      break;
    }
    case MemorySetting::kNotApplicable: {
      memory_type_str = "ERROR";
      break;
    }
  }

  std::vector<MemorySetting*> filtered_settings =
      FilterSettings(memory_type, *memory_settings);

  const int64_t current_consumption =
      SumMemoryConsumption(memory_type, *memory_settings);

  if (current_consumption < max_memory) {
    return;
  }

  ConstrainToMemoryLimit(max_memory, &filtered_settings);

  const int64_t new_memory_size =
      SumMemoryConsumption(memory_type, *memory_settings);

  if (new_memory_size > max_memory) {
    std::stringstream ss;
    ss << "WARNING - ATTEMPTED TO CONSTRAIN " << memory_type_str
       << " MEMORY FROM " << ToMegabyteString(current_consumption, 2) << " TO "
       << ToMegabyteString(max_memory, 2) << ".\nBUT STOPPED"
       << " AT " << ToMegabyteString(new_memory_size, 2) << " because"
       << " there was nothing left to\n"
       << "constrain (settings refused to reduce any more memory). Try\n"
       << "setting more memory setting(s) to -1 to allow autoset.\n"
       << "Example: --image_cache_size_in_bytes=-1";
    error_msgs->push_back(ss.str());
  }
}

}  // namespace.

void ConstrainToMemoryLimits(int64_t max_cpu_memory, int64_t max_gpu_memory,
                             std::vector<MemorySetting*>* memory_settings,
                             std::vector<std::string>* error_msgs) {
  // Constrain cpu memory.
  ConstrainMemoryType(MemorySetting::kCPU, max_cpu_memory, memory_settings,
                      error_msgs);
  // Constrain gpu memory.
  ConstrainMemoryType(MemorySetting::kGPU, max_gpu_memory, memory_settings,
                      error_msgs);
}

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