// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <iostream>
#include <string>

#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/json/json_writer.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/app/chrome_content_browser_overlay_manifest.h"
#include "content/public/app/content_browser_manifest.h"
#include "services/service_manager/public/cpp/manifest.h"

base::ListValue GetInterfacesForCapability(
    const service_manager::Manifest::ExposedCapabilityMap& exposed_capabilities,
    const std::string& capability) {
  auto it = exposed_capabilities.find(capability);
  if (it == exposed_capabilities.end()) {
    return base::ListValue();
  }

  base::ListValue interface_names;
  for (const auto& interface_name : it->second) {
    interface_names.GetList().emplace_back(base::Value(interface_name));
  }

  return interface_names;
}

void PrintAccessibleInterfaces(const service_manager::Manifest& manifest,
                               const std::string& capability) {
  base::DictionaryValue interfaces;
  base::ListValue exposed_capabilities =
      GetInterfacesForCapability(manifest.exposed_capabilities, capability);
  interfaces.SetKey("exposed_capabilities", std::move(exposed_capabilities));

  for (const auto& entry : manifest.exposed_interface_filter_capabilities) {
    base::ListValue interface_names =
        GetInterfacesForCapability(entry.second, capability);
    interfaces.SetPath({"exposed_interface_filter_capabilities", entry.first},
                       std::move(interface_names));
  }

  std::string output;
  base::JSONWriter::WriteWithOptions(
      interfaces, base::JSONWriter::OPTIONS_PRETTY_PRINT, &output);
  std::cout << output;
}

int main(int argc, const char** argv) {
  base::AtExitManager at_exit;
  base::CommandLine::Init(argc, argv);

  service_manager::Manifest manifest = content::GetContentBrowserManifest();
  manifest.Amend(GetChromeContentBrowserOverlayManifest());

  auto args = base::CommandLine::ForCurrentProcess()->GetArgs();
  for (const base::CommandLine::StringType& arg : args) {
#if defined(OS_WIN)
    PrintAccessibleInterfaces(manifest, base::UTF16ToASCII(arg));
#else
    PrintAccessibleInterfaces(manifest, arg);
#endif
  }

  return 0;
}
