// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "modemloggerd/manager.h"

#include <memory>
#include <string>

#include <brillo/proto_file_io.h>
#include <cros_config/cros_config.h>

#include "modemloggerd/helper_manifest.pb.h"
#include "modemloggerd/modem.h"

namespace {

constexpr char const* kDevicesSupportingLogging[] = {"em060", "fm101", "nl668",
                                                     "fm350"};

const char kManifest[] =
    "/usr/local/usr/share/modemloggerd/helper_manifest.textproto";

std::string GetModemName() {
  brillo::CrosConfig config;
  std::string fw_variant;
  if (!config.GetString("/modem", "firmware-variant", &fw_variant)) {
    LOG(INFO)
        << "No modem firmware variant is specified. Cannot parse modem name.";
    return std::string();
  }

  // TODO(b/312535821): Use udev/MM instead of cros_config for modem detection
  for (auto modem : kDevicesSupportingLogging) {
    if (fw_variant.find(modem) != std::string::npos)
      return modem;
  }
  LOG(INFO) << fw_variant << " does not support modem logging";
  return std::string();
}

}  // namespace

namespace modemloggerd {

Manager::Manager(dbus::Bus* bus, AdaptorFactoryInterface* adaptor_factory)
    : bus_(bus),
      dbus_adaptor_(adaptor_factory->CreateManagerAdaptor(this, bus_)) {
  LOG(INFO) << __func__;
  HelperManifest parsed_manifest;
  if (!brillo::ReadTextProtobuf(base::FilePath(kManifest), &parsed_manifest)) {
    LOG(ERROR) << "Could not parse helper manifest";
    return;
  }
  auto modem_name = GetModemName();
  for (const HelperEntry& entry : parsed_manifest.helper()) {
    if (entry.modem_name() == modem_name) {
      // TODO(b/312535821): Introduce DBus method so that MM tells when a modem
      // has been found/ monitor udev
      available_modems_.push_back(
          std::make_unique<Modem>(bus_, adaptor_factory, entry));
      break;
    }
  }
  UpdateAvailableModemsProperty();
}

void Manager::UpdateAvailableModemsProperty() {
  LOG(INFO) << __func__;
  std::vector<dbus::ObjectPath> modem_paths;
  for (const auto& modem : available_modems_) {
    modem_paths.push_back(modem->GetDBusPath());
  }
  dbus_adaptor_->SetAvailableModems(modem_paths);
}

}  // namespace modemloggerd
