/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * 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 "host/libs/vm_manager/vm_manager.h"

#include <android-base/logging.h>

#include <iomanip>
#include <memory>

#include "host/libs/config/cuttlefish_config.h"
#include "host/libs/vm_manager/crosvm_manager.h"
#include "host/libs/vm_manager/qemu_manager.h"

namespace cuttlefish {
namespace vm_manager {

std::unique_ptr<VmManager> GetVmManager(const std::string& name, Arch arch) {
  std::unique_ptr<VmManager> vmm;
  if (name == QemuManager::name()) {
    vmm.reset(new QemuManager(arch));
  } else if (name == CrosvmManager::name()) {
    vmm.reset(new CrosvmManager(arch));
  }
  if (!vmm) {
    LOG(ERROR) << "Invalid VM manager: " << name;
    return {};
  }
  if (!vmm->IsSupported()) {
    LOG(ERROR) << "VM manager " << name << " is not supported on this machine.";
    return {};
  }
  return vmm;
}

std::string ConfigureMultipleBootDevices(const std::string& pci_path,
                                         int pci_offset, int num_disks) {
  int num_boot_devices =
      (num_disks < VmManager::kDefaultNumBootDevices) ? num_disks : VmManager::kDefaultNumBootDevices;
  std::string boot_devices_prop = "androidboot.boot_devices=";
  for (int i = 0; i < num_boot_devices; i++) {
    std::stringstream stream;
    stream << std::setfill('0') << std::setw(2) << std::hex
           << pci_offset + i + VmManager::kDefaultNumHvcs + VmManager::kMaxDisks - num_disks;
    boot_devices_prop += pci_path + stream.str() + ".0,";
  }
  boot_devices_prop.pop_back();
  return {boot_devices_prop};
}

} // namespace vm_manager
} // namespace cuttlefish

